Почему мой класс PrintWriter не работает должным образом?

1

У меня есть это приложение, которое запрашивает у пользователя текстовый файл для ввода, из этого текстового файла, содержит строки целых чисел и текста. И оттуда он должен написать в другой текстовый файл result.txt. Прямо сейчас, поскольку я все еще новичок в IO меня возникают проблемы с записью файла, хотя файл успешно создан. Приложение останавливается прямо на части после ввода пользователем имени текстового файла. Могли бы вы, ребята, мне помочь? Заранее спасибо!

import java.util.*;
import java.io.*;

class FileReadingExercise3 {

public static void main(String [] args)
{
    Scanner userInput = new Scanner(System.in);
    Scanner fileInput = null;

    String a = null;
    int sum = 0;

    do
    {
        try
        {
            System.out.println("Please enter the name of a file or type QUIT to finish");
            a = userInput.nextLine();

            if(a.equals("QUIT"))
            {
                System.exit(0);
            }

            fileInput = new Scanner(new File(a));
        }
        catch(FileNotFoundException e)
        {
            System.out.println("Error " + a + " does not exist.");
        }
    }while(fileInput == null);

    PrintWriter output = null;

    try
    {
        output = new PrintWriter(new File("result.txt"));
    }
    catch(IOException g)
    {
        System.out.println("Error");
        System.exit(0);
    }

    while(fileInput.hasNext())
    {
        if(fileInput.hasNextInt())
        {
            int num = fileInput.nextInt();
            sum += num;

            String str = Integer.toString(num);

            output.println(str);

        }
    }

    fileInput.close();
    output.close();
}
}
  • 1
    а) почему вы делаете new File("result.txt")); дважды? б) ваш while(fileInput.hasNext()) за которым следует if(fileInput.hasNextInt()) выглядит хитроумно. Если while истинно, а if ложно, то бесконечный цикл?
  • 0
    @ScaryWombat ой извините, это было для проб и ошибок только сейчас забыл удалить это. эм, я как-то путаюсь с моим циклом while, как ты упомянул, лол.
Показать ещё 2 комментария
Теги:
exception
io
printwriter

1 ответ

1
Лучший ответ

Он застревает, потому что вам нужно вызвать метод next() после вызова hasNext() чтобы указатель hasNext() к следующей строке вашего входного файла.

Также вы не используете sum поэтому проверьте, нужна ли вам эта переменная.

Вот код, который работает:

public static void main(String[] args) throws FileNotFoundException {
        Scanner userInput = new Scanner(System.in);
        Scanner fileInput = null;
        String a = null;
        int sum = 0;
        do {
            try {
                System.out
                        .println("Please enter the name of a file or type QUIT to finish");
                a = userInput.nextLine();
                if (a.equals("QUIT")) {
                    System.exit(0);
                }
                fileInput = new Scanner(new File(a));
            } catch (FileNotFoundException e) {
                System.out.println("Error " + a + " does not exist.");
            }
        } while (fileInput == null);

        PrintWriter output = null;
        try {
            output = new PrintWriter(new File("result.txt"));
        } catch (IOException g) {
            System.out.println("Error");
            System.exit(0);
        }
        while (fileInput.hasNext()) {
            if (fileInput.hasNextInt()) {
                int num = fileInput.nextInt();
                sum += num;
                String str = Integer.toString(num);
                output.println(str);
            } else {
                fileInput.next();
            }
        }
        fileInput.close();
        output.close();
    }
}

Обновление:

Согласно java doc для метода Scanner.hasNext():

Возвращает true, если этот сканер имеет другой токен на своем входе. Этот метод может блокироваться, ожидая ввода для сканирования. Сканер не продвигается мимо какого-либо входа.

Поэтому, чтобы перейти к следующей позиции, вам нужно вызвать метод next(), иначе Сканер будет в том же положении, и программа застрянет в бесконечном цикле.

  • 0
    эй, привет, спасибо за вашу помощь, теперь это работает, но есть кое-что, что я всегда не понимаю, почему мы должны перейти к next() после этого? о да, я понимаю, что переменная sum не используется, но я буду использовать ее после этого, спасибо за напоминание. :)
  • 0
    пожалуйста, я обновил свой ответ, пожалуйста, проверьте.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню