【问题标题】:How To Read A Text File Via Scanner如何通过扫描仪读取文本文件
【发布时间】:2015-07-30 22:26:04
【问题描述】:

我正在尝试从文本文件中读取,但每当程序进入我的 while 循环时,它就会跳过它。我使用了一个之前的示例,我必须检查我是否正确执行了此操作,但这次似乎无法正常工作。

编辑:澄清一下,下面带有“b++”的while被跳过了。

编辑 2:更新代码。

    public static void main(String[] args) throws FileNotFoundException {

    ToDoItem td = new ToDoItem();
    ToDoList tl = new ToDoList();

    File file = new File("ToDoItems.txt");
    Scanner ReadFile = new Scanner(file);
    Scanner keyboard = new Scanner(System.in);

    ArrayList<String> list = new ArrayList<>();
    String inputline;

    System.out.println("Welcome to the list maker!" + "\n" + "Please start typing.");

    try (PrintWriter fout = new PrintWriter(new File("ToDoItems.txt"))) {

        do {
            System.out.println("add to the list? [y/n]");
            inputline = keyboard.nextLine();

            if ("y".equals(inputline)) {
                fout.print(td.getDescription() + "\n");

            } else {
                System.out.println("Here is the list so far:");

                while (ReadFile.hasNext()) {
                    String listString = ReadFile.nextLine();
                    list.add(listString);

                }
            }
        } while ("y".equals(inputline));

    } catch (FileNotFoundException e) {
        System.err.println(e.getMessage());
    }
    System.out.println(list);
}

理想情况下,我希望它在每次通过 while 循环时打印数组的一部分。但它最终会跳过它。 我检查了文本文件本身,它确实有我想要打印到它的信息。然而由于某种原因,扫描仪无法正确读取它。

【问题讨论】:

  • 哪个while被跳过了?
  • 你确定它被跳过了吗?我猜这行:stringArray[b] = ReadFile.nextLine(); 会抛出 ArrayIndexOutOfBoundsException。
  • 第二个,带有“b++”的那个。我知道它被跳过了,因为我试图在它下面打印一个简单的“你能看到我吗”消息,但它从未显示出来。越界异常是我不知道该怎么做的另一个问题。但我试图让错误首先弹出,看看我是否能弄清楚。
  • String[] stringArray = new String[b]; 数组的大小为 0,这是 @aryn.galadar 得到的。将其设置为 b 以外的其他值,因为 b 为 0。

标签: java arrays file text text-files


【解决方案1】:

我猜您的问题是您正在尝试读取当前正在使用的文件,请在读取之前尝试关闭 fout 对象,如下所示:

public static void main(String[] args){
    File file = new File("ToDoItems.txt");
    ToDoItem td = new ToDoItem();
    ToDoList tl = new ToDoList();

    Scanner keyboard = new Scanner(System.in);

    ArrayList<String> list = new ArrayList<>();
    String inputline;

    System.out.println("Welcome to the list maker!" + "\n" + "Please start typing.");
    try (PrintWriter fout = new PrintWriter(file)) {
    //                                       ^^ here
        do {
            System.out.println("add to the list? [y/n]");
            inputline = keyboard.nextLine();

            if ("y".equals(inputline)) {
                fout.print(td.getDescription() + System.lineSeparator());
            } else {
                // Important line is here!
                fout.close(); // <--- Close printwriter before read file

                System.out.println("Here is the list so far:");
                Scanner ReadFile = new Scanner(file);

                while (ReadFile.hasNext()) {
                    String listString = ReadFile.nextLine();
                    list.add(listString);
                }
            }
        } while ("y".equals(inputline));
    } catch (FileNotFoundException e) {
        System.err.println(e.getMessage());
    }
    System.out.println(list);
}

【讨论】:

  • 谢谢!那解决了它。请问为什么会这样。仅仅是因为控制台打开时我无法打印到控制台吗?我记得在将其写入文本文件时能够保持打开状态。
  • 我在读为什么这是不可能的哈哈我相信是因为fout不会在你调用fout.print(string)方法时刷新你的数据所以你必须在每次之后手动调用fout.flush()打印电话,或fout.close()结束
【解决方案2】:

String[] stringArray = new String[b]; 与您的int b = 0; 一样有问题。

此外,您似乎甚至不知道您的阵列有多大。我建议您改用ArrayList。这样您就不需要计数器,只需添加到 ArrayList。

最好是trycatch 你的FileNotFoundException 而不是扔main 但我想你知道你的文件会一直在那里。

【讨论】:

  • 好的,我相信我正确添加了arrayList。我有它,每次它通过第二个while循环时,它将文件的下一行添加到arrayList。但我仍然不知道为什么它会跳过那个 while 循环。
  • 好的,我更新了代码。截至目前,它只打印“[]”。因此可以肯定地说,在 while 循环中,它不会在通过时添加任何内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 2013-12-04
  • 2014-06-11
  • 1970-01-01
相关资源
最近更新 更多