您好我正在将一个文件加载到我的程序中并分配每个值(存储在一个新行上的数组)我似乎无法发现为什么持有文件内容的数组在每个索引中为空。
private void readAndProcessWords() {
try {
FileReader _fr = new FileReader(FILEPATH);
BufferedReader textReader = new BufferedReader(_fr);
int numLines = getNumLines(textReader);
String[] words = new String[numLines];
for(int i=0;i<numLines;i++){
words[i] = textReader.readLine();
System.out.println(words[i]);
}
//clears memory reserved for this buffered reader
textReader.close();
} catch(IOException e) {
System.out.println(e);
}
}
private int getNumLines(BufferedReader textReader) throws IOException{
String line;
int numLines =0;
while((line = textReader.readLine()) != null){
numLines++;
}
return numLines;
}
}
解决方案:在循环上方添加以下代码以“重置”文件阅读器
_fr = new FileReader(FILEPATH);
textReader = new BufferedReader(_fr);
答案 0 :(得分:4)
最简单的解决方案是重新创建Reader
,问题是调用getNumLines()
会将BufferedReader中的位置移动到文件末尾。
BufferedReader textReader = new BufferedReader(_fr);
int numLines = getNumLines(textReader); // <-- textReader is at EOF after this.
textReader.close();
textReader = new BufferedReader(_fr);
答案 1 :(得分:1)
而不是读取文件两次来获取行数(这很慢,很烦人,如果文件在两次调用之间发生变化就无法工作),请将行读入可变大小列表:
private void readAndProcessWords() {
try {
FileReader _fr = new FileReader(FILEPATH);
BufferedReader textReader = new BufferedReader(_fr);
List<String> words = new ArrayList<>();
String line;
while ((line = textReader.readLine()) != null) {
words.add(line);
}
textReader.close();
for (String word : words) {
System.out.println(word);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
好消息:此功能already exists,因此您无需重写它。
private void readAndProcessWords() {
try {
List<String> words = Files.readAllLines(Paths.get(FILEPATH));
for (String word : words) {
System.out.println(word);
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
答案 2 :(得分:0)
由于缓冲的阅读器是一个对象,因此您将其作为对getNumLines()
的引用而不是作为副本传递,因此当您.readLine()
发送到同一缓冲的阅读器时,最终会得到一个空值getNumLines()
,因为您已将.readLine()
运行到其限制。
运行getNumLines()
关闭后,使用新的缓冲读卡器重新打开文档。
我还记得在java中有一个Mark()
和Recall()
方法用于缓冲读者,也可以作为解决方法。
我想是的。
FileReader _fr = new FileReader(FILEPATH);
BufferedReader textReader = new BufferedReader(_fr);
textReader.Mark();
int numLines = getNumLines(textReader);
textReader.Recall();
String[] words = new String[numLines];
for(int i=0;i<numLines;i++)
{
words[i] = textReader.readLine();
System.out.println(words[i]);
}
//clears memory reserved for this buffered reader
textReader.close();