1

我是 Java 新手,正在尝试编写一个具有一个参数的程序,即文本文件的路径。该程序将找到文本文件并将其打印到屏幕上。最终,我将构建它以格式化给定的文本文件,然后将其打印到输出文件中,但我稍后会到达那里。

无论如何,我的程序总是抛出 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());
        }


    }
}
4

3 回答 3

6

你在文件的末尾。当您确定文件中的行数时,您已经阅读到文件末尾,并且EOF Flag设置了。[编辑:正如@EJP 下面的注释,BufferedReader在文件末尾返回 null 读数。然而,您的阅读器不在您想要的位置,这一事实仍然是正确的。] 过去,我只是通过关闭和重新打开文件来解决这个问题。或者,查看Array Lists或简单Lists. 它们会动态调整大小,因此您无需提前知道文件中的行数。

于 2012-07-20T13:49:40.450 回答
1

正如@mikeTheLiar 所提到的,您位于文件末尾。BufferedReaderreference 是文件处理程序,其内部光标指向文件中的当前位置。当你触发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

于 2012-07-20T14:13:31.743 回答
0

与这里的几个答案相反, readLine() 不会在文件末尾抛出异常,它只是不断返回 null。你的问题被另一个问题掩盖了。永远不要只编造自己的错误信息。始终打印带有异常的那个。如果您这样做了,您可能会立即发现问题。几乎可以肯定,您根本无法打开该文件,要么是因为它不存在,要么您没有读取权限。例外会告诉你。

于 2012-07-20T19:52:40.717 回答