Страницы

Поиск по вопросам

воскресенье, 10 марта 2019 г.

Как считать из потока текстовый файл ?

Нужно считать текстовый файл из потока, как это сделано с картинкой. Важно: считывание в ОП а не в файл. ZipInputStream zis; BufferedImage tmpImage; tmpImage = null; tmpImage = ImageIO.read(zis);


Ответ

Используя только классы из стандартной библиотеки Java, избежать циклов и прочего говнокода не получится никак. Имея произвольный InputStream, прочитать из него текст в виде строки можно следующим образом: import java.nio.charset.Charset; import java.io.*;
static public String readTextFromInputStream(InputStream in, Charset cs) { StringBuilder text = new StringBuilder(); BufferedReader reader = new BufferedReader(new InputStreamReader(in, cs)); String line = null; String newline = System.getProperty("line.separator"); while ((line = reader.readLine()) != null) { text.append(line); text.append(newline); } return text.toString(); } Где параметр cs означает предполагаемую кодировку текста. Использовать примерно так: String text = readTextFromInputStream(in, Charset.forName("CP1251")); Если хотите избежать всего этого говнокода, у вас два варианта: либо подключить внешние библиотеки (к примеру, Apache Commons IO), либо использовать нормальные языки для JVM, к примеру, Scala, в которой решение займет одну строку: def readFromInputStream(in: InputStream, cs: Codec) = Source.fromInputStream(in)(cs).mkString Дополнение 1. Если хочется сохранить разбиение на строки, то модифицируем первоначальный вариант функции readFromInputStream следующим образом (так, чтобы она возвращала список строк): import java.util.List; import java.util.ArrayList;
static public List readLinesFromInputStream(InputStream in, Charset cs) { List lines = new ArrayList(); BufferedReader reader = new BufferedReader(new InputStreamReader(in, cs)); String line = null; String newline = System.getProperty("line.separator"); while ((line = reader.readLine()) != null) { lines.add(line + newline); } return lines; }

Комментариев нет:

Отправить комментарий