Якщо у вас є об'єкт java.io.InputStream
, як ви повинні обробити цей об'єкт і отримати String
?
Припустимо, у мене є InputStream
, який містить текстові дані, і я хочу перетворити його в String
, щоб, наприклад, записати його в лог-файл.
Який найпростіший спосіб взяти InputStream
і перетворити його в String
?
public String convertStreamToString(InputStream is) {
// ???
}
Гарним способом зробити це є використання Apache commons IOUtils
для копіювання InputStream
в StringWriter
... щось на зразок
StringWriter writer = new StringWriter();
IOUtils.copy(inputStream, writer, encoding);
String theString = writer.toString();
або навіть
// NB: does not close inputStream, you'll have to use try-with-resources for that
String theString = IOUtils.toString(inputStream, encoding);
Альтернативно, ви можете використовувати <код>ByteArrayOutputStream, якщо ви не хочете змішувати потоки та записуючі пристрої
Apache Commons дозволяє:
String myString = IOUtils.toString(myInputStream, "UTF-8");
Звичайно, ви можете вибрати інші кодування символів, окрім UTF-8.
Також див: (документація)
З урахуванням файлу спочатку потрібно отримати екземпляр 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();
}