Java 扫描器从我的文本文件中读取 null?

我正在编写一些代码来读取书名的输入文件,并将读取的行放入一个数组并尝试打印出该数组。但是当我尝试打印出数组时,它只是为每个读取行返回“null”。我不确定我做错了什么或我的代码在做什么。有什么建议么?谢谢!


代码:


    import java.io.*;

import java.util.*;

public class LibraryInputandOutputs {

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

        int lineCount = 0;

        File inputFile = new File("bookTitles.inp.txt");

        Scanner reader = new Scanner(inputFile);

        while(reader.hasNextLine()) {

            reader.nextLine();

            lineCount++;

        }


        String[] bookArray = new String[lineCount];

        while (reader.hasNextLine()) {

            for (int i = 0; i < lineCount; i++) {

                bookArray[i] = reader.next();

             }

        }

        for (int k = 0; k < lineCount; k++) {

            System.out.println(bookArray[k]);

        }

        reader.close();

        inputFile.close();


    }

}

我正在阅读的文本文件有 20 个书名,每行都不同。我在终端上的输出是 20 行空值。


慕森卡
浏览 157回答 3
3回答

沧海一幻觉

让我们分解一下:这将读取输入文件的每一行,计算每一行,然后丢弃它们:while(reader.hasNextLine())&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;reader.nextLine(); &nbsp;&nbsp;&nbsp;&nbsp;lineCount++; }您现在位于文件末尾。分配一个足够大的字符串数组。String[]&nbsp;bookArray&nbsp;=&nbsp;new&nbsp;String[lineCount];尝试阅读更多行。循环将立即终止,因为reader.hasNextLine()将返回false。您已经在文件末尾。所以你分配给的语句bookArray[i]不会被执行。while&nbsp;(reader.hasNextLine())&nbsp;{&nbsp; &nbsp;&nbsp;&nbsp;for&nbsp;(int&nbsp;i&nbsp;=&nbsp;0;&nbsp;i&nbsp;<&nbsp;lineCount;&nbsp;i++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bookArray[i]&nbsp;=&nbsp;reader.next(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} }由于bookArray[i] = ...上面从未执行过,所有数组元素仍将是null.for&nbsp;(int&nbsp;k&nbsp;=&nbsp;0;&nbsp;k&nbsp;<&nbsp;lineCount;&nbsp;k++)&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;System.out.println(bookArray[k]); }一种解决方案是打开并读取文件两次。另一种解决方案是将文件“重置”回开头。(有点复杂。)另一种解决方案是使用 aList而不是数组,这样您就不需要读取文件两次。另一种解决方案是在 javadoc 中搜索一种方法,该方法会将文件/流的所有行读取为字符串数组。(其中一些可能会因您的练习要求而 被排除。您将其解决...)第3步的嵌套循环也是错误的。您不需要在 while 循环中使用 for 循环。您需要一个循环来“遍历”行并递增数组索引 (&nbsp;i)。它们不需要都由循环语句本身来完成。您可以在循环体中执行一个或另一个(或两个)。

当年话下

您试图在文件中循环两次,但您已经在第一次到达文件末尾。不要循环两次。将两个 while 循环“合并”为一个,删除 while 循环内的 for 循环并收集所有书名。然后您可以使用列表的大小稍后打印它们。我的 Java 可能生锈了,但它在这里 -import java.io.*;import java.util.*;public class LibraryInputandOutputs {    public static void main(String args[]) throws IOException {        // int lineCount = 0; - You don't need this.        File inputFile = new File("bookTitles.inp.txt");        Scanner reader = new Scanner(inputFile);        // Use an array list to collect book titles.        List<String> bookArray = new ArrayList<>();         // Loop through the file and add titles to the array list.        while(reader.hasNextLine()) {            bookArray.add(reader.nextLine());            // lineCount++; - not needed        }        // Not needed -        // while (reader.hasNextLine()) {        //     for (int i = 0; i < lineCount; i++) {        //         bookArray[i] = reader.next();        //      }        // }        // Use the size method of the array list class to get the length of the list         // and use it for looping.        for (int k = 0; k < bookArray.size(); k++) {              System.out.println(bookArray[k]);        }        reader.close();        inputFile.close();    }}

叮当猫咪

特别是,使用 List 通常比使用数组更好,因为它更灵活。如果你需要一个数组,你总是可以在 List 被填充后使用 toArray() 。你的书名是分开的吗?如果是这样,您可能不需要 Scanner 类,可以使用 BufferedReader 或 LineNumberReader 之类的东西。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java