Java - Как прочитать файл дважды, используя буфер чтения, или дважды использовать поток - PullRequest
0 голосов
/ 16 января 2020

Как прочитать файл дважды, используя буфер чтения или дважды поток * ??? 1001 *

  • Необходимость манипулировать большими объемами данных в коде, поэтому необходимо учитывать производительность.

Пример кода 1 ниже, дает исключение «поток закрыт» -

Url url = 'www.google.com'
InputStream in = url.openStream();
BufferReader br = new BufferReader(in);

Stream<String> ss = br.lines; // read all the lines

List ll = ss.collect();
br.close();
BufferReader br = new BufferReader(in); //exception occurs

Пример кода 2 ниже, дает исключение «поток закрыт / используется "-

Url url = 'www.google.com'
InputStream in = url.openStream();
BufferReader br = new BufferReader(in);

Supplier<Stream<String>> ss = br.lines; // read all the lines

List ll = ss.collect();
List xx = ss.collect();. // Exception occurs

Пожалуйста, игнорируйте синтаксис, это всего лишь черновик кода. Пожалуйста, предложите.

Ответы [ 3 ]

1 голос
/ 16 января 2020

С точки зрения использования stream в некоторой степени аналогичен iterator в том смысле, что его можно использовать только один раз.

Если вы хотите снова использовать содержимое того же потока, вам нужно создать новый поток, как вы сделали первый.

Начиная с Java 12, вы можете передавать значения одного и того же потока в две ветви, используя метод Collectors.teeing().

List.stream().collect(Collectors.teeing(
                Collector1, // do something with the stream
                Collector2, // do something else with the stream
                BiFunction, use to merge results)

Вы также можете сделать это.

Supplier<Stream<String>> ss1 = br.lines; // read all the lines
Supplier<Stream<String>> ss2 = br.lines; // read all the lines

Теперь вы можете использовать ss1 и ss2 как два отдельных потока.

0 голосов
/ 16 января 2020

Вы не можете. Поток похож на реальный водянистый аналог. Вы можете наблюдать, как вода течет под мостом, на котором вы стоите, но вы не можете дать указание воде go вернуться на вершину холма, чтобы вы могли наблюдать ее снова.

Либо каждый потребитель обрабатывает каждую строку перед тем, как перейти к следующей строке, или, если это невозможно, вам нужно будет создать свой собственный «буфер» всей вещи: т.е. сохранить каждую строку в Collection<String>, что для второй (и третьей) и четвертый ...) потребитель может перебирать. Потенциальная проблема с этим состоит в том, что это увеличивает объем памяти. HTML большинства веб-сайтов вряд ли может стать большой проблемой в этом отношении.

Ваш последний пример можно легко исправить, скопировав список.

List ll = ss.collect();
List xx = new ArrayList(ll);
0 голосов
/ 16 января 2020

Вот пример ниже. Вы можете использовать его для чтения столько раз, сколько вам будет sh.

BufferedReader br = new BufferedReader(new FileReader( "users/desktop/xxx.txt" ));
String strLine;
List<String> ans= new ArrayList<String>();

// Read rows
while ((strLine = br.readLine()) != null) {
    System.out.println(strLine);
    ans.add(strLine);
}

// Read again
for (String result: ans) {
    System.out.println(result);
}

ссылка

https://www.dreamincode.net/forums/topic/272652-reading-from-same-file-twice/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...