Запутался. Как я могу ухватиться за возвращенный входной поток?

#java #android

#java #Android

Вопрос:

Я пытаюсь извлечь некоторый XML и в конечном итоге использовать его как строку. Вот мои два метода, первый из которых вызывает последний.

 public static void getAllXML(String url) throws XmlPullParserException, IOException, URISyntaxException{ 
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(true);

    XmlPullParser parser = factory.newPullParser(); 
    parser.setInput(new InputStreamReader(getUrlData(url)));  

    XmlUtils.beginDocument(parser,"results");

    int eventType = parser.getEventType();
    do{
        XmlUtils.nextElement(parser);
        parser.next();
        eventType = parser.getEventType();
        if(eventType == XmlPullParser.TEXT){
            Log.d("test",parser.getText());
        }
    } while (eventType != XmlPullParser.END_DOCUMENT) ;       

}

public static InputStream getUrlData(String url) throws URISyntaxException, ClientProtocolException, IOException {
    DefaultHttpClient client = new DefaultHttpClient();
    HttpGet method = new HttpGet(new URI(url));
    HttpResponse res = client.execute(method);
    return  res.getEntity().getContent();

}
  

Затем я использую метод, который принимает InputStream и преобразует его в String . Но как мне ухватиться за InputStream возвращенный getUrlData методом, чтобы я мог вызвать convertStreamToString(myInputStream) ?

Комментарии:

1. Предполагая, что опубликованный вами код компилируется и работает нормально, можете ли вы просто сделать это: InputStream myInputStream = getUrlData(url); convertStreamToString(myInputStream); ?

Ответ №1:

Вы можете использовать TeeInputStream ( http://commons.apache.org/io/api-1.4/org/apache/commons/io/input/TeeInputStream.html ) чтобы получить входной поток, который вы передаете анализатору, а также записать входные данные в ByteArrayInputStream, с которым вы можете затем использовать ByteArrayOutputStream.toString(String encoding) .

Что-то вроде

 ByteArrayOutputStream bytes = new ByteArrayOutputStream();
TeeInputStream is = new TeeInputStream(getDataUrl(...), bytes);
try {
  // Pass is to parser here.
  parser.setInput(new InputStreamReader(is, "UTF-8"));
  // Note: please specify an encoding with InputStreamReader, maybe based on
  // the headers from getDataUrl.  
  ...
} finally {
  is.close();
}

// After parsing finishes, convert the bytes to a String.
String parsed = bytes.toString("UTF-8");
// If UTF-8 is not appropriate, use the encoding specified in headers from URL.
  

В качестве альтернативы, вы можете сначала прочитать строку в, а затем использовать StringReader with parser.setInput . Если ваш анализатор настроен на отклонение больших входных данных или может принимать InputStream в качестве входных данных и выполняет определение кодировки, которую вы, возможно, захотите использовать позже, то описанный выше подход является более гибким.

Ответ №2:

Просто прочитайте поток с java.io API?

Что-то вроде :

 package essai;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Reader {

  public static String convertStreamToString (InputStream stream) throws IOException {
    String result = "";

    //Wrap the input stream into a buffered reader so reading is faster and more important, easier with the use of readLine method.
    InputStreamReader reader = new InputStreamReader(stream);
    BufferedReader bufferedReader = new BufferedReader(reader);

    String currentLine = bufferedReader.readLine();
    while (currentLine !=null) {
      result =currentLine;
      currentLine = bufferedReader.readLine();
    }
    return resu<
  }

}
  

Конечно, вы могли бы оптимизировать, и распространенной ошибкой, в частности, было бы, если ваш XML огромен без возврата каретки, но это должно помочь вам начать.