Вот модификация ответа Gopi, которая не имеет проблемы с окончанием строки, а также более эффективна, поскольку не требует временных объектов 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();
}
Вы также можете использовать библиотеку ввода-вывода Apache Commons
В частности, вы можете использовать метод IOUtils # toString (InputStream inputStream)
Оберните поток в средство чтения, чтобы получить преобразование языкового стандарта, а затем продолжайте чтение, собирая данные в StringBuffer. Когда закончите, выполните toString () в StringBuffer.
Вам необходимо создать InputStreamReader
, чтобы обернуть входной поток, преобразовывая двоичные данные в текст. Укажите соответствующую кодировку в зависимости от вашего источника входного сигнала.
Получив InputStreamReader
, вы можете создать BufferedReader
и читать содержимое построчно или просто читать буфер за буфером и добавлять его к StringBuilder
, пока вызов read ()
не вернет -1.
Библиотека Guava составляет вторую часть этого простого в использовании CharStreams.toString (inputStreamReader)
.
Вот пример кода, адаптированный из здесь .
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 "";
}
}
Вы также можете использовать StringWriter следующим образом; каждое чтение
из вашего InputStream сопоставляется с записью
(или append
) в StringWriter, и по завершении вы можете вызвать getBuffer
, чтобы получить StringBuffer, который можно использовать напрямую, или вызвать его метод toString
.