2009-12-11 7 views
18

Если я начинаю с java.io.InputStream, то какой самый простой способ прочитать весь поток в String (при условии utf-8)?Прочитать текст из InputStream

Это должно быть довольно легко, но я в основном человек C#, и Google не дает мне этого. Благодарю.

+2

http://stackoverflow.com/questions/309424/in-java-how-do-a-read-an-input-stream-in-to-a-string – akuhn

+0

doh, я не искал «Input Поток "(с промежутком между ними). – jthg

ответ

17

В зависимости от того, что лицензии вас устраивает, это one liner с библиотекой Jakarta-Commons IO.

+2

+1 - если вы не знаете, что делаете, повторное использование широко используемой библиотеки экономит время и силы. –

+2

Я закончил с использованием org.apache.commons.io.IOUtils.toString (InputStream input, String encoding) – jthg

+2

Я всегда голосую, когда люди предлагают что-то из Джакартской палаты общин. Как скучно, у вас все еще есть бизнес-логика для доставки к концу дня, и нет смысла изобретать велосипед каждый день. –

0

Чтение/запись из потоков замечательно болезненно в Java.

public static String getStreamContents(InputStream stream) throws IOException { 

    StringBuilder content = new StringBuilder() 

    Reader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")) 
    String lineSeparator = System.getProperty("line.separator"); 

    try { 
     String line 
     while ((line = reader.readLine()) != null) { 
      content.append(line + lineSeparator) 
     } 
     return content.toString() 

    } finally { 
     reader.close() 
    } 

} 
+1

swap new InputStreamReader (поток) с новым InputStreamReader (поток, «UTF-8») – Buhb

+1

Ваш код отбрасывает разрывы строк. –

+0

Выполнено, спасибо за советы –

9

Do укажите кодировку символов. Не надо код отходов, ввести ошибки и замедленное выполнение с помощью BufferedReader.

Вот пример. Вы можете параметризовать его с размером буфера, кодирования и т.д.

static String readString(InputStream is) throws IOException { 
    char[] buf = new char[2048]; 
    Reader r = new InputStreamReader(is, "UTF-8"); 
    StringBuilder s = new StringBuilder(); 
    while (true) { 
    int n = r.read(buf); 
    if (n < 0) 
     break; 
    s.append(buf, 0, n); 
    } 
    return s.toString(); 
} 
+3

+1 - но общая идиома состоит в том, чтобы написать цикл следующим образом: 'int n; while ((n = r.read (buf))> = 0) {s.append (buf, 0, n); } ' –

+4

Это, к сожалению, распространенная идиома. Но я предпочитаю избегать тестов с побочными эффектами. – erickson

1

Использование Commons-IO, вероятно, будет лучшим вариантом. Для вашего интереса другой подход заключается в том, чтобы скопировать все байты и затем преобразовать его в строку.

public static String readText(InputStream is, String charset) throws IOException { 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    byte[] bytes = new byte[4096]; 
    for(int len;(len = is.read(bytes))>0;) 
     baos.write(bytes, 0, len); 
    return new String(baos.toByteArray(), charset); 
} 
1

Я нашел хороший способ в Java 8 с потоками:

public static String readString(InputStream is) { 
    BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
    String content = br.lines().reduce("", String::concat); 
    return content; 
} 

Как уже говорилось выше, вы можете поменять новый InputStreamReader (есть) с новой InputStreamReader (это, "UTF-8") , но у меня нет опыта работы с этим конструктором.

+0

Ваше предложение теряет \ n ограничители строк в результате. – Gabriel

+0

@Gabriel хороший пункт. Как насчет: 'br.lines(). Reduce (" \ n ", String :: concat)' –

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