为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

慕森卡 2023-04-26 15:10:48
我正在编写一些代码来读取书名的输入文件,并将读取的行放入一个数组并尝试打印出该数组。但是当我尝试打印出数组时,它只是为每个读取行返回“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 行空值。
查看完整描述

3 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

让我们分解一下:

  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]);
    }

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

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

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

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

(其中一些可能会因您的练习要求而 被排除。将其解决...)


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


查看完整回答
反对 回复 2023-04-26
?
当年话下

TA贡献1890条经验 获得超9个赞

您试图在文件中循环两次,但您已经在第一次到达文件末尾。不要循环两次。将两个 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();


    }

}


查看完整回答
反对 回复 2023-04-26
?
叮当猫咪

TA贡献1776条经验 获得超12个赞

特别是,使用 List 通常比使用数组更好,因为它更灵活。如果你需要一个数组,你总是可以在 List 被填充后使用 toArray() 。

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


查看完整回答
反对 回复 2023-04-26
  • 3 回答
  • 0 关注
  • 118 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信