2010-08-13 3 views
8

Возможные Дубликаты:
How do I convert an InputStream to a String in Java?
In Java how do a read an input stream in to a string?Java Строка из InputStream

У меня есть InputSteam и нужно просто получить одну простую String с полным содержанием.

Как это делается на Java?

+2

Вы можете уточнить? По определению поток неограничен. Если не существует еще каких-либо ограничений, вы не можете получить String (что-то фиксированного размера) из неограниченного потока. –

+2

Это задано несколько раз: http://stackoverflow.com/questions/1763789/how-do-i-convert-an-inputstream-to-a-string-in-java – bakkal

+0

http://stackoverflow.com/ Вопросы/309424/in-java-how-do-a-read-an-input-stream-in-a-string –

ответ

8

Здесь приведена модификация ответа Гопи, не имеющая проблемы с окончанием строки, а также более эффективная, так как ей не нужны временные объекты String для каждой строки и исключает избыточное копирование в BufferedReader и дополнительную работу в readLine().

public static String convertStreamToString(InputStream is, String ecoding) throws IOException 
{ 
    StringBuilder sb = new StringBuilder(Math.max(16, is.available())); 
    char[] tmp = new char[ 4096 ]; 

    try { 
     InputStreamReader reader = new InputStreamReader(is, ecoding); 
     for(int cnt; (cnt = reader.read(tmp)) > 0;) 
      sb.append(tmp, 0, cnt); 
    } finally { 
     is.close(); 
    } 
    return sb.toString(); 
} 
+1

+1 более нормальная обработка кодирования. –

0

Оберните поток в Reader, чтобы получить преобразование локали, а затем продолжайте чтение при сборке в StringBuffer. Когда это будет сделано, сделайте toString() в StringBuffer.

5

Вам необходимо построить InputStreamReader, чтобы обернуть входной поток, преобразовывая двоичные данные и текст. Укажите подходящую кодировку на основе вашего источника ввода.

После того, как вы получили InputStreamReader, вы можете создать BufferedReader и прочитать строку содержимого по очереди, или просто буфера чтения-на-буфера и не добавлять к StringBuilder до read() возвращения вызова -1.

Библиотека Guava делает вторую часть этого легкого использования CharStreams.toString(inputStreamReader).

+0

Я никогда не пробовал это, но вы не должны знать, что представляет поток ты делаешь это? Если бы у вас был поток, чтобы read() никогда не возвращал -1, не было бы никакой ценности даже при попытке этого. Но в то же время я не могу думать о потоке с головы, который никогда не заканчивается. –

+1

@Thomas: Ну, вы можете легко создать поток, который только когда-либо давал случайные числа. Я предполагал, что вопрос задан в ситуации, когда концепция «читать до конца потока» действительно имеет смысл ... –

2

Вот пример кода, адаптированного от here.

public String convertStreamToString(InputStream is) throws IOException { 
     /* 
     * To convert the InputStream to String we use the BufferedReader.readLine() 
     * method. We iterate until the BufferedReader return null which means 
     * there's no more data to read. Each line will appended to a StringBuilder 
     * and returned as String. 
     */ 
     if (is != null) { 
      StringBuilder sb = new StringBuilder(); 
      String line; 

      try { 
       BufferedReader reader = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
       while ((line = reader.readLine()) != null) { 
        sb.append(line).append("\n"); 
       } 
      } finally { 
       is.close(); 
      } 
      return sb.toString(); 
     } else {  
      return ""; 
     } 
    } 
+2

Обратите внимание, что это нормализует окончания строки - это не обязательно будет возвращать точный исходный текст данные. –

+0

true. отредактированный код, чтобы включить ваше предложение. – Gopi

+0

Теперь он не будет включать окончание строки. Я думаю, что Джон Скит просто говорил, что каждая строка, заканчивающаяся '\ r \ n' (или' \ r'), становится '\ n'. –

0

Вы также можете использовать StringWriter следующим образом: каждый из read из вашего InputStream сопоставляется с write (или append) с StringWriter, а по завершении вы можете позвонить getBuffer, чтобы получить StringBuffer, который можно использовать напрямую, или вы можете получить его метод toString.

3

Вы также можете использовать Apache Commons IO library

В частности, вы можете использовать IOUtils#toString(InputStream inputStream) method

+0

Как программист, мне это нравится. Повторное использование существующих библиотек для выполнения работы. Apache Commons (и все проекты Apache в целом) очень хорошо сделаны и весьма полезны в ряде ситуаций. –

+0

Обратите внимание, что использование вышеописанного метода использует кодировку по умолчанию для платформ, то есть результат зависит от пользовательских настроек или других внешних факторов. В большинстве случаев лучше использовать метод, ожидающий кодирования в качестве дополнительного параметра. См. [Этот комментарий по связанному вопросу] (http://stackoverflow.com/questions/309424/read-convert-an-inputstream-to-a-string#comment4886900_309448). Апачи «IOUtils» также предоставляют такие методы. Кстати, ссылка на Javadoc сломана ... – siegi

Смежные вопросы