Ответ 1
Некоторые хорошие и быстрые ответы. Однако я думаю, что лучший из них - Groovy добавил метод getText для InputStream. Поэтому мне нужно было только stream.text
. И хороший призыв к комментарию 4096.
Я украл этот фрагмент из Интернета. Но он выглядит ограниченным до 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
Некоторые хорошие и быстрые ответы. Однако я думаю, что лучший из них - Groovy добавил метод getText для InputStream. Поэтому мне нужно было только stream.text
. И хороший призыв к комментарию 4096.
Попробуйте IOUtils
от Apache Commons:
String s = IOUtils.toString(inputStream, "UTF-8");
Для Groovy
filePath = ... //< a FilePath object
stream = filePath.read() //< InputStream object
content = stream.getText("UTF-16") //< Specify the encoding, and get the String object
getText()
без кодировки, он будет использовать текущую системную кодировку, ex ( "UTF-8" ).
Вы можете сделать это довольно легко, используя класс 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();
}
Он читает ввод в кусках 4096 байт (4 КБ), но размер фактической строки не ограничен, так как он продолжает читать больше и присоединяет его к SringBuffer.
В этом фрагменте есть ошибка: если вход использует многобайтовую кодировку символов, есть хороший шанс, что один символ будет охватывать два чтения (и не может быть конвертируемым). И у него также есть полуобъект, который полагается на стандартную кодировку платформы.
Вместо этого используйте Jakarta Commons IO. В частности, версия IOUtils.toString()
, которая принимает InputStream
и применяет к ней кодировку.
Для будущих рецензентов, у которых есть подобные проблемы, обратите внимание, что оба метода IOUtils из Apache и Groovy InputStream.getText() требуют, чтобы поток завершился или был закрыт перед возвратом. Если вы работаете с постоянным потоком, вам не удастся разобраться с "уродливым" примером, который первоначально опубликовал Фил, или работать с неблокирующимся IO.
Вы можете попробовать что-то похожее на это
new FileInputStream( new File("c:/tmp/file.txt") ).eachLine { println it }