Подтвердить что ты не робот

Преобразование потока в строку Java/Groovy

Я украл этот фрагмент из Интернета. Но он выглядит ограниченным до 4096 байт и довольно уродливым ИМО. Кто-нибудь знает лучший подход? Я использую Groovy btw...

String streamToString(InputStream input) {
        StringBuffer out = new StringBuffer();
        byte[] b = new byte[4096];
        for (int n; (n = input.read(b)) != -1;) {
            out.append(new String(b, 0, n));
        }
        return out.toString();
    }

ИЗМЕНИТЬ:

Я нашел лучшее решение в Groovy:

InputStream exportTemplateStream = getClass().getClassLoader().getResourceAsStream("export.template")
assert exportTemplateStream: "[export.template stream] resource not found"
String exportTemplate = exportTemplateStream.text
4b9b3361

Ответ 1

Некоторые хорошие и быстрые ответы. Однако я думаю, что лучший из них - Groovy добавил метод getText для InputStream. Поэтому мне нужно было только stream.text. И хороший призыв к комментарию 4096.

Ответ 2

Попробуйте IOUtils от Apache Commons:

String s = IOUtils.toString(inputStream, "UTF-8");

Ответ 3

Для Groovy

filePath = ... //< a FilePath object
stream = filePath.read() //< InputStream object

content = stream.getText("UTF-16") //< Specify the encoding, and get the String object

Ссылка на класс InputStream

getText() без кодировки, он будет использовать текущую системную кодировку, ex ( "UTF-8" ).

Ответ 4

Вы можете сделать это довольно легко, используя класс Scanner:

String streamToSring(InputStream input) {
    Scanner s = new Scanner(input);
    StringBuilder builder = new StringBuilder();
    while (s.hasNextLine()) {
        builder.append(s.nextLine() +"\n");
    }
    return builder.toString();
}

Ответ 5

Он читает ввод в кусках 4096 байт (4 КБ), но размер фактической строки не ограничен, так как он продолжает читать больше и присоединяет его к SringBuffer.

Ответ 6

В этом фрагменте есть ошибка: если вход использует многобайтовую кодировку символов, есть хороший шанс, что один символ будет охватывать два чтения (и не может быть конвертируемым). И у него также есть полуобъект, который полагается на стандартную кодировку платформы.

Вместо этого используйте Jakarta Commons IO. В частности, версия IOUtils.toString(), которая принимает InputStream и применяет к ней кодировку.

Ответ 7

Для будущих рецензентов, у которых есть подобные проблемы, обратите внимание, что оба метода IOUtils из Apache и Groovy InputStream.getText() требуют, чтобы поток завершился или был закрыт перед возвратом. Если вы работаете с постоянным потоком, вам не удастся разобраться с "уродливым" примером, который первоначально опубликовал Фил, или работать с неблокирующимся IO.

Ответ 8

Вы можете попробовать что-то похожее на это

new FileInputStream( new File("c:/tmp/file.txt") ).eachLine { println it }