我是Java的新手,我正在尝试编写一个包含一个参数的程序,即文本文件的路径。程序将找到文本文件并将其打印到屏幕上。最终我要构建它来格式化给定的文本文件,然后将其打印到outfile,但我稍后会到达。
无论如何我的程序总是抛出和IOException,我不知道为什么。给定参数C:\ JavaUtility \ input.txt,我在运行时收到“错误,无法读取文件”。我的代码位于下方。
import java.io.*;
public class utility {
public static void main(String[] path){
try{
FileReader fr = new FileReader(path[0]);
BufferedReader textReader = new BufferedReader(fr);
String aLine;
int numberOfLines = 0;
while ((aLine = textReader.readLine()) != null) {
numberOfLines++;
}
String[] textData = new String[numberOfLines];
for (int i=0;i < numberOfLines; i++){
textData[i] = textReader.readLine();
}
System.out.println(textData);
return;
}
catch(IOException e){
System.out.println("Error, could not read file");
}
}
}
[编辑]感谢所有人的帮助!因此,考虑到我的最终目标,我认为找到行数并存储在有限数组中仍然是有用的。所以我最后写了两个班。第一个,ReadFile.java
找到了我想要的数据,并处理了大部分的阅读。第二个FileData.java
调用ReadFile中的方法并打印出来。我已将它们发布在下面,以后有人发现它们很有用。
package textfiles;
import java.io.*;
public class ReadFile {
private String path;
public ReadFile(String file_path){
path = file_path;
}
int readLines() throws IOException{
FileReader file_to_read = new FileReader(path);
BufferedReader bf = new BufferedReader(file_to_read);
String aLine;
int numberOfLines = 0;
while ((aLine = bf.readLine()) != null){
numberOfLines++;
}
bf.close();
return numberOfLines;
}
public String[] OpenFile() throws IOException{
FileReader fr = new FileReader(path);
BufferedReader textReader = new BufferedReader(fr);
int numberOfLines = readLines();
String[] textData = new String[numberOfLines];
for(int i=0; i < numberOfLines; i++){
textData[i] = textReader.readLine();
}
textReader.close();
return textData;
}
}
package textfiles;
import java.io.IOException;
public class FileData {
public static void main(String[] args)throws IOException{
String file_name = args[0];
try{
ReadFile file = new ReadFile(file_name);
String[] aryLines = file.OpenFile();
for(int i=0; i < aryLines.length; i++){
System.out.println(aryLines[i]);
}
}
catch (IOException e){
System.out.println(e.getMessage());
}
}
}
答案 0 :(得分:6)
你在文件的末尾。当你确定文件中的行数时,你已经读到文件结尾,并设置了 [编辑:如下@EJP注释,{{ 1}}返回读取超过文件末尾的空值。然而,你的读者不在你想要的地方这一事实仍然是正确的。]在过去,我只是通过关闭并重新打开文件来解决这个问题。或者,查看EOF Flag
。BufferedReader
或简单Array Lists
。它们是动态重新调整大小的,因此您不需要提前知道文件中的行数。
答案 1 :(得分:1)
正如@mikeTheLiar所提到的,你在文件的末尾。 BufferedReader
引用是文件处理程序,内部光标指向文件中的当前位置。当您触发readLine()
方法时,指针会读取字符,直到它到达换行符,然后返回字符串。指针设置为新位置。读完所有行后,readLine()
会返回null
。 之后,如果你调用正如readLine()
,它将抛出IOException。@EJP
所述
使用IO API时最好的编码规则之一是始终检查EOF条件 - 您在第一次循环中的方式。一旦你达到EOF之后你就不应该在不重置光标的情况下在同一个参考上调用read方法 - 这可以通过调用reset()
方法完成。
恕我直言,在您的情况下,不需要第二次循环。您只能使用一个循环来实现功能。
import java.io.*;
import java.util.ArrayList;
public class utility {
public static void main(String[] path){
try{
FileReader fr = new FileReader(path[0]);
BufferedReader textReader = new BufferedReader(fr);
String aLine;
int numberOfLines = 0;
ArrayList readLines = new ArrayList();
while ((aLine = textReader.readLine()) != null) {
numberOfLines++;
readLines.add(aLine);
}
//Assuming you need array of lines, if not then you can print the lines directly in above loop
String[] textData = readLines.toArray();
System.out.println(textData);
return;
}
catch(IOException e){
System.out.println("Error, could not read file");
}
}
}
修改强> 的
我尝试了你的代码 - 它工作正常并打印数组引用。正如评论中所建议的那样,问题在于源(由于安全性或任何其他原因,文件可能无法读取) - 如果您可以打印异常消息并获取抛出异常的确切行号,那将会很有帮助。
除IO异常外的一些观察结果:
您正尝试打开该文件两次。从readLines()
内调用OpenFile()
方法。当您创建OpenFile()
时,首先在textReader
中打开代码文件序列。之后,您正在调用readLines()
,它会在您创建file_to_read
时再次尝试打开该文件。
你应该尽量避免这种情况,在你的流程中,你应该在int numberOfLines = readLines();
之前致电FileReader fr = new FileReader(path);
再次恕我直言,应该只有一种方法,你应该只对文件进行一次迭代 - 从效率/性能和代码可维护性的角度来看。您可以按如下方式更改ReadFile
课程:
package textfiles;
import java.io.*;
import java.util.ArrayList;
public class ReadFile {
private String path;
public ReadFile(String file_path){
path = file_path;
}
//You need not have separate file for counting lines in file
//Java provides dynamic sized arrays using ArrayList
//There is no need to count lines
public String[] OpenFile() throws IOException{
FileReader fr = new FileReader(path);
BufferedReader textReader = new BufferedReader(fr);
ArrayList fileLines = new ArrayList();
String readLine = textReader.readLine();
while(readLine != null){
fileLines.add(readLine);
readLine = textReader.readLine();
}
textReader.close();
return fileLines.toArray();
}
}
另一个小观察:在某些地方不遵循java变量命名约定。 OpenFile()
方法应为openFile()
,file_to_read
应为fileToRead
答案 2 :(得分:0)
与此处的几个答案相反,readLine()不会在文件末尾抛出异常,它只是一直返回null。你的问题被另一个人掩盖了。永远不要只是编写自己的错误消息。始终打印出异常附带的那个。如果你这样做了,你可能会立即发现问题。几乎可以肯定,你根本无法打开文件,因为它不存在或者你没有读取权限。例外情况会告诉你。