Добавить информацию в bufferWriter перед сбросом его Java - PullRequest
0 голосов
/ 27 сентября 2018

Я понимаю, что BufferedWriter хранит информацию до того, как я записываю ее в файл, перед тем как выполнить запись в файл, используя flush(), Append() и т. Д.

Я собираю информациюиз нескольких источников, поэтому в настоящее время я зацикливаюсь на каждом источнике и каждый раз добавляю его непосредственно в файл, но я пытаюсь добиться добавления всей информации в BufferedWriter и после завершения цикла,Как это можно записать в файл?

Я пытаюсь повысить производительность, не сбрасывая данные в файл столько раз.Производительность является проблемой, потому что это может зацикливаться 1 миллион раз.

Вот что я сейчас делаю:

  1. Открыть BufferedWriter
  2. чтение данных издругой источник и сохранение в буфере
  3. добавление сохраненных данных в текстовый файл (здесь буфер очищается)
  4. повторение шагов 2 и 3 - 50 раз
  5. закрытие текстового файла

Вот что я пытаюсь сделать:

  1. Открыть BufferedWriter
  2. читать данные из другого источника и сохранять вбуфер
  3. повторите шаг 2.- 50 раз
  4. добавьте все собранные данные (данные, собранные за 50 циклов)
  5. закройте файл

вот код.

 for (int mainLoop = 0; mainLoop < 50; mainLoop++){

        try {
            BufferedWriter writer = writer = new BufferedWriter(new 
FileWriter
                    ("path to file in computer" + mainLoop + ".txt", true));


        for(int forloop = 0; forloop < 50; forloop++) {
            final Document pageHtml= 
Jsoup.connect("link to a page").get();


            Elements body = pageHtml.select("p");

            writer.append(System.getProperty("line.separator"));
            writer.append(System.getProperty("line.separator"));
            writer.append(body.text());

            System.out.println(forloop);
        }
        writer.close();
        } catch (IOException e) {
            e.printStackTrace();
        }continue;
    }

Ответы [ 2 ]

0 голосов
/ 29 сентября 2018

Буферный писатель будет очищаться, когда вы дадите ему указание.А также в любое время, когда буфер заполняется.Может быть сложно определить, когда буфер заполнится.И действительно, вам все равно.Буферный писатель будет улучшать производительность независимо от того, когда именно он сбрасываетсяВместо этого ваш выходной код должен использовать BufferedWriter , как и любой другой Writer.

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

0 голосов
/ 27 сентября 2018

я пытаюсь повысить производительность, не сбрасывая данные в файл dely часто

Вы сбрасываете данные вручную после каждой записи?Не делай этого.

В противном случае укажите больший размер при создании экземпляра BufferedWriter.

У вас есть возможность использовать StringBuilder для агрегирования выходных данных.Тем не менее, я предполагаю, что у вас больше вывода, чем вы хотите сохранить в памяти.

Наконец, действительно ли снижается производительность?

===

BufferedWriter оптимизирует фактические записи, которые он выполняет.Пока вы указываете большой размер буфера, например, 10 000, многократные небольшие записи в буфер не будут вызывать запись, пока буфер не заполнится.Я вижу комментарий, что вы "очищаете" буфер.Не делай этого.Оставьте BufferedWriter в покое и позвольте ему делать свое дело.

Если вы накапливаете информацию, а затем, по какой-то причине, отбрасываете ее, используйте StringBuilder для накопления, а затем записываете содержимое StringBuild в Writer.

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