繁体   English   中英

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

[英]Java scanner reading null from my text file?

我正在编写一些代码来读取书名的输入文件,并将读取的行放入数组中并尝试打印出该数组。 但是,当我尝试打印出数组时,它只会为每个读取行返回“ 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行的null。

让我们分解一下:

  1. 这将读取输入文件的每一行,对每一行进行计数,然后将其丢弃:

     while(reader.hasNextLine()) { reader.nextLine(); lineCount++; } 

    您现在位于文件末尾。

  2. 分配足够大的字符串数组。

     String[] bookArray = new String[lineCount]; 
  3. 尝试阅读更多行。 该循环将立即终止,因为reader.hasNextLine()将返回false 已经在文件末尾了。

    因此,将不会执行分配给bookArray[i]的语句。

     while (reader.hasNextLine()) { for (int i = 0; i < lineCount; i++) { bookArray[i] = reader.next(); } } 
  4. 由于bookArray[i] = ...从未在上面执行过,因此所有数组元素仍将为null

     for (int k = 0; k < lineCount; k++) { System.out.println(bookArray[k]); } 

一种解决方案是打开并读取文件两次。

另一个解决方案是将文件“重置”回开始。 (有点复杂。)

另一种解决方案是使用List而不是数组,这样您就不需要两次读取文件。

另一个解决方案是在javadocs中搜索一种方法,该方法将以字符串数组的形式读取文件/流的所有行。

(其中一些要求可能会因您的锻炼要求而被排除需要进行锻炼...)


步骤3中的嵌套循环也是错误的。 在while循环内不需要for循环。 您需要一个循环来“遍历”行并增加数组索引( i )。 它们都不需要由loop语句本身完成。 您可以在循环主体中执行一个或另一个(或同时执行两个)。

Stephen C已经指出了您的逻辑存在的主要问题。 您试图在文件中循环两次,但是第一次已经到达文件末尾。 不要循环两次。 将两个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();

    }
}

我同意StephenC。特别是,使用List通常比数组更好,因为它更灵活。 如果需要数组,则在列表填充后始终可以使用toArray()。

您的书名是否分开? 如果是这样,您可能不需要Scanner类,可以使用BufferedReader或LineNumberReader之类的东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM