Как прочитать/конвертировать InputStream в строку в Java?
У меня есть объект java.io.InputStream
, который содержит текстовые данные, и я хочу преобразовать его в String
, чтобы, например, записать эти данные в лог-файл. Каков самый простой способ взять InputStream
и преобразовать его в String
?
Вот мой код, который нуждается в доработке:
public String convertStreamToString(InputStream is) {
// ???
}
Как мне следует обработать этот объект, чтобы получить успешное преобразование?
5 ответ(ов)
Для работы с файлом сначала необходимо получить экземпляр java.io.Reader
. Затем его можно прочитать и добавить данные в StringBuilder
(не стоит использовать StringBuffer
, если доступ к объекту не происходит из нескольких потоков, так как StringBuilder
работает быстрее). Здесь важно, что мы работаем блоками, что позволяет избежать использования других потоков буферизации. Размер блока параметризован для оптимизации производительности во время выполнения.
Вот пример кода, который иллюстрирует этот подход:
public static String slurp(final InputStream is, final int bufferSize) {
final char[] buffer = new char[bufferSize];
final StringBuilder out = new StringBuilder();
try (Reader in = new InputStreamReader(is, "UTF-8")) {
for (;;) {
int rsz = in.read(buffer, 0, buffer.length);
if (rsz < 0)
break;
out.append(buffer, 0, rsz);
}
}
catch (UnsupportedEncodingException ex) {
/* Обработка исключения */
}
catch (IOException ex) {
/* Обработка исключения */
}
return out.toString();
}
В этом коде мы сначала создаем буфер нужного размера, затем используем InputStreamReader
для чтения данных из входного потока. Использование бесконечного цикла позволяет нам продолжать чтение, пока есть данные в потоке. После завершения чтения, мы просто возвращаем собранную строку.
Чтобы прочитать данные из InputStream
и преобразовать их в строку, можно использовать следующий код на Java:
InputStream in = /* Ваш InputStream */;
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(in));
String read;
while ((read = br.readLine()) != null) {
//System.out.println(read);
sb.append(read);
}
br.close();
return sb.toString();
Этот код создаёт BufferedReader
, который читает строки из InputStream
. В цикле while
происходит чтение данных построчно с помощью метода readLine()
. Каждая считанная строка добавляется в StringBuilder
. После завершения чтения мы закрываем BufferedReader
, чтобы освободить ресурсы, и возвращаем результат в виде строки с помощью метода toString()
.
Убедитесь, что ваш InputStream
корректно инициализирован, прежде чем выполнять этот код.
Если вы используете Google-Collections/Guava, вы можете сделать следующее:
InputStream stream = ...
String content = CharStreams.toString(new InputStreamReader(stream, Charsets.UTF_8));
Closeables.closeQuietly(stream);
Обратите внимание, что второй параметр (то есть Charsets.UTF_8) для InputStreamReader
не обязателен, но в общем случае лучше указывать кодировку, если вы её знаете (а вы должны это делать!).
Это лучшее решение на чистом Java, которое отлично подходит как для Android, так и для любой другой JVM.
Это решение работает удивительно хорошо... оно простое, быстрое и одинаково эффективно для работы с малыми и большими потоками!! (см. бенчмарк выше... № 8)
public String readFullyAsString(InputStream inputStream, String encoding)
throws IOException {
return readFully(inputStream).toString(encoding);
}
public byte[] readFullyAsBytes(InputStream inputStream)
throws IOException {
return readFully(inputStream).toByteArray();
}
private ByteArrayOutputStream readFully(InputStream inputStream)
throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length = 0;
while ((length = inputStream.read(buffer)) != -1) {
baos.write(buffer, 0, length);
}
return baos;
}
Эта реализация предоставляет простой способ полностью считать данные из InputStream
, конвертируя их как в строку, так и в байтовый массив. Приятного кодирования!
Вы можете использовать следующий код на Java для считывания InputStream
в строку. Этот метод использует BufferedInputStream
для повышения производительности при чтении данных и ByteArrayOutputStream
для накопления байтов, которые затем конвертируются в строку. Вот как это выглядит:
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.IOException;
public static String readInputStreamAsString(InputStream in) throws IOException {
BufferedInputStream bis = new BufferedInputStream(in);
ByteArrayOutputStream buf = new ByteArrayOutputStream();
int result = bis.read();
while(result != -1) {
byte b = (byte)result;
buf.write(b);
result = bis.read();
}
return buf.toString();
}
Примечания:
- BufferedInputStream улучшает эффективность чтения, так как он считывает данные порциями.
- ByteArrayOutputStream позволяет накапливать байты в памяти. Метод
toString()
по умолчанию использует кодировкуUTF-8
, но в зависимости от ваших требований, вы можете указать конкретную кодировку, например:buf.toString("UTF-8")
. - Обязательно обрабатывайте исключение
IOException
, которое может возникнуть при работе с потоками.
Этот метод будет полезен, когда необходимо получить строку из потоковых данных, например, при чтении из файла или сетевого соединения.
Как создать строку Java из содержимого файла?
Как преобразовать строку в InputStream в Java?
Как преобразовать строку в int в Java?
Как сгенерировать случайную алфавитно-цифровую строку
Как преобразовать int в String?