Чтение из текстового файла и попытка использовать printWriter для записи в другой результат приводит к пустому файлу.

Мое задание следующее:

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

Пример: если ваша строка ввода гласит:

это проверка

ваш вывод должен читать

  1. это проверка

Я написал то, что я считаю в основном функциональным кодом - при запуске он компилируется и создает новый файл для записи, но этот файл пустой (содержит 0 байтов). Прочитав о проблеме, я попытался убедиться, что мой printWriter и потоки ввода/вывода закрыты/сброшены. На данный момент я не уверен, что-то не так с моим циклом или я вызываю методы закрытия не в том месте. Любая помощь приветствуется.

Код выглядит следующим образом:

package module6lecture;

import java.util.Scanner;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;

public class ReadWriteProgram {

public static void main(String[] args) {
    try
    {
        FileInputStream fis = new FileInputStream("C:\\Users\\Reid\\Desktop\\Chapter11.txt");
        FileOutputStream fos = new FileOutputStream("C:\\Users\\Reid\\Desktop\\rulicny.txt");
        Scanner scan = new Scanner(fis);
        PrintWriter pw = new PrintWriter(fos);
        int lineNumber = 1;
        while(scan.hasNextLine());
        {
            String stringRead = scan.nextLine();
            pw.println(lineNumber + ": " + stringRead);
            lineNumber++;
        }
        pw.close();
    }
    catch(FileNotFoundException fnf)
    {
        System.out.println("Unable to find Chapter11.txt. Exiting...");
        fnf.printStackTrace();
    }
}
}

Отказ от ответственности: я полный новичок.


person phasevii    schedule 05.04.2015    source источник
comment
Попробуйте добавить несколько printlns в свой код, чтобы увидеть, достигаются ли места. Самое главное, линия записи.   -  person Constant    schedule 06.04.2015
comment
Похоже, у вас точно такое же назначение, как этот парень.   -  person Mick Mnemonic    schedule 06.04.2015


Ответы (2)


Сразу после цикла while стоит точка с запятой

while(scan.hasNextLine());
//                       ^

что делает его бесконечным циклом, потому что он представляет пустую инструкцию, точно так же, как

while(scan.hasNextLine()){}

так что вы никогда не входите

{
    String stringRead = scan.nextLine();
    pw.println(lineNumber + ": " + stringRead);
    lineNumber++;
}

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

FileOutputStream fos = new FileOutputStream("C:\\Users\\Reid\\Desktop\\rulicny.txt");

Так что уберите эту точку с запятой.


Кстати, вы можете легко обнаружить такого рода ошибки, если вы позволите коду формата IDE для вас. Eclipse отформатировал ваш пример для меня как

while (scan.hasNextLine())
    ;
{
    String stringRead = scan.nextLine();
    pw.println(lineNumber + ": " + stringRead);
    lineNumber++;
}

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

person Pshemo    schedule 05.04.2015
comment
Кажется, это решило одну проблему. Выходной файл печатается, но он просто печатает первую строку входного файла в бесконечном цикле. Что мне нужно сделать, чтобы сканер считывал строки последовательно? - person phasevii; 06.04.2015
comment
Странно, после удаления этой дополнительной точки с запятой ваш код у меня работает нормально. Подумайте о том, чтобы поделиться текущей версией вашего кода (но не меняйте исходный вопрос, так как это сделает ответы неверными), разместив его, например, на pastebin.com. - person Pshemo; 06.04.2015
comment
Я еще немного поработал с этим, а затем решил попробовать отменить все свои изменения до точки, где я был прямо перед удалением точки с запятой, снова удалил ее, и о чудо, как вы говорите, это работает отлично. Не уверен, что я изменил, но все равно большое спасибо! - person phasevii; 06.04.2015

Попробуйте предопределить String stringRead вне цикла.

person Community    schedule 05.04.2015