基本Java IO,总是抛出异常

时间:2012-07-20 13:47:27

标签: java io

我是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());
        }


    }
}

3 个答案:

答案 0 :(得分:6)

你在文件的末尾。当你确定文件中的行数时,你已经读到文件结尾,并设置了EOF Flag [编辑:如下@EJP注释,{{ 1}}返回读取超过文件末尾的空值。然而,你的读者不在你想要的地方这一事实仍然是正确的。]在过去,我只是通过关闭并重新打开文件来解决这个问题。或者,查看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。你的问题被另一个人掩盖了。永远不要只是编写自己的错误消息。始终打印出异常附带的那个。如果你这样做了,你可能会立即发现问题。几乎可以肯定,你根本无法打开文件,因为它不存在或者你没有读取权限。例外情况会告诉你。