Преобразование содержимого ByteArrayInputStream в строку

Я читаю этот пост, но я не следую. Я видел этот, но не видел надлежащего примера преобразования ByteArrayInputStream в String с помощью ByteArrayOutputStream.

Чтобы получить содержимое ByteArrayInputStream как String, используется ли ByteArrayOutputStream или есть более предпочтительный способ?

Я рассматривал этот пример и расширял ByteArrayInputStream и использовал Decorator увеличить функциональность во время выполнения. Любой интерес к этому является лучшим решением для использования ByteArrayOutputStream?

Ответ 1

A ByteArrayOutputStream может читать из любого InputStream и в конце дать a byte[].

Однако с a ByteArrayInputStream это проще:

int n = in.available();
byte[] bytes = new byte[n];
in.read(bytes, 0, n);
String s = new String(bytes, StandardCharsets.UTF_8); // Or any encoding.

При a ByteArrayInputStream available() выводится общее количество байтов.


Ответить на комментарий: using ByteArrayOutputStream

ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buf = new byte[8192];
for (;;) {
    int nread = in.read(buf, 0, buf.length);
    if (nread <= 0) {
        break;
    }
    baos.write(buf, 0, nread);
}
in.close();
baos.close();
byte[] bytes = baos.toByteArray();

Здесь может быть любой InputStream.

Ответ 2

Почему никто не упоминал org.apache.commons.io.IOUtils?

import java.nio.charset.StandardCharsets;
import org.apache.commons.io.IOUtils;

String result = IOUtils.toString(in, StandardCharsets.UTF_8);

Только одна строка кода.

Ответ 3

Используйте Scanner и передайте ему конструктор ByteArrayInputStream, затем прочитайте данные со своего сканера, проверьте этот пример:

ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(new byte[] { 65, 80 });
Scanner scanner = new Scanner(arrayInputStream);
scanner.useDelimiter("\\Z");//To read all scanner content in one String
String data = "";
if (scanner.hasNext())
    data = scanner.next();
System.out.println(data);