[英]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。
让我们分解一下:
这将读取输入文件的每一行,对每一行进行计数,然后将其丢弃:
while(reader.hasNextLine()) { reader.nextLine(); lineCount++; }
您现在位于文件末尾。
分配足够大的字符串数组。
String[] bookArray = new String[lineCount];
尝试阅读更多行。 该循环将立即终止,因为reader.hasNextLine()
将返回false
。 您已经在文件末尾了。
因此,将不会执行分配给bookArray[i]
的语句。
while (reader.hasNextLine()) { for (int i = 0; i < lineCount; i++) { bookArray[i] = reader.next(); } }
由于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.