Почему BufferedWriter не записывает содержимое URL в текстовый файл? - PullRequest
0 голосов
/ 23 апреля 2020

Я пытаюсь записать текст из URL в текстовый файл партиями по 35 строк, нажимая клавишу ввода, чтобы перейти к следующей партии из 35 строк. Если я не попытаюсь записать в файл партиями по 35 строк, он прекрасно работает и записывает все содержимое в текстовый файл. Но когда я пытаюсь использовать оператор if для печати партиями по 35, он не будет печататься в файл, если я не введу sh около 15 раз. И даже тогда это не все печатает. Мне кажется, что это как-то связано с оператором if, но я не могу этого понять.

String urlString = "https://www.gutenberg.org/files/46768/46768-0.txt";

    try {
        URL url = new URL(urlString);
        try(Scanner input = new Scanner(System.in);
            InputStream stream = url.openStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream));
            BufferedWriter writer = new BufferedWriter(new FileWriter("C:\\Users\\mattj\\Documents\\JuliusCeasar.txt"));) {

            String line;
            int PAGE_LENGTH = 35;
            int lineCount = 0;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
                writer.write(line + "\n");
                lineCount++;
                if (lineCount == PAGE_LENGTH){
                    System.out.println();
                    System.out.println("- - - Press enter to continue - - -");
                    input.nextLine();
                    lineCount = 0;
                }
            }
        }
    } catch (MalformedURLException e) {
        System.out.println("We encountered a problem regarding the following URL:\n"
                + urlString + "\nEither no legal protocol could be found or the "
                + "string could not be parsed.");
        e.printStackTrace();
    } catch (IOException e) {
        System.out.println("Attempting to open a stream from the following URL:\n"
                + urlString + "\ncaused a problem.");
        e.printStackTrace();
    }

1 Ответ

1 голос
/ 23 апреля 2020

Я не знаю Java, но в этом есть очень похожие понятия. NET. Я думаю, что есть несколько вещей, чтобы рассмотреть здесь.

BufferWriter не будет записывать в файл немедленно, он действует - как следует из названия - как буфер, собирая запросы на запись со временем, затем делая это в пакетном режиме. У BufferWriter есть метод flush, чтобы грипп sh немедленно записывал в очередь записи в файл - так что я бы сделал это, когда вы нажмете свои 35 (никогда не грипп sh при каждой записи).

Кроме того, BufferedReader и BufferedWriter могут быть закрыты, поэтому убедитесь, что заключили их в оператор try, чтобы убедиться, что ресурсы правильно разблокированы / очищены.

...