Записать в другой файл после того, как конец файла в буфере - PullRequest
0 голосов
/ 28 декабря 2018

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

public class TestClass {
    public static BufferedWriter mainFile;
    public static BufferedWriter transactionFile;
    public static Scanner input = new Scanner(System.in);

    public static void openFile() {
        // Code to open file
    }

    public static void addRecordToMainFile() {
        try{
            System.out.println("\t\tEnter data to Master File");
            System.out.printf(" %s %s %s%n? ","Master file account number" , "Name" ,"Balance");
            while(input.hasNext()) {
                try {
                    mainFile.write(String.format("%-10d %-12s %.2f" , input.nextInt() , input.next() ,input.nextDouble()));
                } catch(IllegalStateException e) {
                    System.err.println("Please Enter a valid input.%nTry Again");
                    input.nextLine();
                } catch(NoSuchElementException e) {
                    System.err.println("Please Enter a valid input.%nTry Again");
                    input.nextLine();
                }
                System.out.print("? ");
            }

        }catch (IOException e) {
            System.err.println("File is Closed... Closing Application");
            System.exit(1);
        }
        input.nextLine();
    }


    public static void addRecordToTransactionFile() {
        try {
            System.out.println("\n\t\tEnter data to the Transaction File");
            System.out.printf("%s\t%s%n?" ,"Transaction file account number" ,"Transaction amount" );
            while(input.hasNext()) {
                try{
                    transactionFile.write(String.format("%-10d %.2d" , input.nextInt(),input.nextDouble()));

                }catch(NoSuchElementException e) {
                    System.err.println("Enter a valid input %nPlease try again");
                    input.nextLine();
                }
            }
        }catch (IOException e) {
            System.err.println("File is Closed... Closing Application");
            System.exit(1);
        }
    }

    public static void closeFile() {
        //Code to close file
    }

    public static void main(String[] args) {
        openFile();
        addRecordToMainFile();
        addRecordToTransactionFile();
        closeFile();
    }
}

OUTPUT:

        Enter data to Master File
 Master file account number Name Balance
? 100 Alan_Jones 232.32
? ^D

        Enter data to the Transaction File
Transaction file account number Transaction amount
?
Process finished with exit code 0

Эта программа не принимает никакого ввода после вставки символа eof,

1 Ответ

0 голосов
/ 28 декабря 2018

После закрытия stdin (путем ввода ^D с клавиатуры) он больше не будет вводить.Таким образом, input.hasNext() в вашем методе addRecordToMainFile будет работать, пока stdin не будет исчерпан.Когда addRecordToTransactionFile выполняется, stdin является все еще закрытым и больше не будет вводить , поэтому метод полностью пропускает цикл while.

Чтобы получить один вход для записи внесколько выходных файлов, я бы порекомендовал один из двух следующих параметров:

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

M 100 Alan_Jones 232.32 (goes to main file) T 100 Alan_Jones 232.32 (goes to transaction file)

  • Используйте разделитель между сечениями входного файла.Например:

MAIN 100 Alan_Jones 232.32 100 Alan_Jones 232.32 100 Alan_Jones 232.32 100 Alan_Jones 232.32 (all these go into the main file) TRANSACTION 100 Alan_Jones 232.32 100 Alan_Jones 232.32 100 Alan_Jones 232.32 100 Alan_Jones 232.32 (all these go into the transaction file)

Ваша логика чтения ввода должна быть более сложной, чтобы обрабатывать ввод.Обратите внимание, что второй вариант очень похож на схему, которую вы уже опробовали, за исключением того, что символ «конец файла» (^D) был заменен другим маркером в файле, который не является «специальным» для потока UNIX.system: строка «TRANSACTION».

Но вы не можете прочитать из stdin после закрытия потока, поэтому поиск ^D / ожидание input.hasNext возврата false не будет работать.

...