-2

有没有办法检查文件是否正确写入,我的意思是最后是否有 EOF?我问这个是因为我有一个程序需要一些文件,将它们合并到一个非常大的文件中,然后使用它从中获取统计信息。关键是第二部分永远不会结束,因为它不识别文件的结尾。

代码的相关部分如下:(请不要要求整个代码,因为我因重要原因无法发布)

    FileWriter file=null;
    PrintWriter pw = null;
    String pathToRead=null;
    InputStreamReader isr = null;
    BufferedReader br = null ;
    FileInputStream fis = null ;
    TestJFileChooser d=new TestJFileChooser();
    int c=1;
            String line=null;

    ....

    //here i select the files

    selectedFile=new File(pathToRead);

    //here I get one buffer reader for each file got with listFiles()

    for(File file_sel:app){
        if (file_sel.getName().startsWith("gtou")){
            System.out.println(file_sel.getName());
            fis = null;
            try {
                fis = new FileInputStream(file_sel);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            isr=new InputStreamReader(fis);
            br=new BufferedReader(isr);
            map.put(i, br);
            num_file++;
            i++; 
        }
    }

    //then I select the output file and open a print writer for it

    fileToWrite=new File(pathToRead);
        try {
            file = new FileWriter(fileToWrite);
            pw= new PrintWriter(file);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        //merging part
        ....
        line=br.readLine();
        while(line!=null){
        System.out.println("line is:"+line);
        ....
        line=br.readLine();
        }   


       //end of merging ....

        pw.flush();
        pw.close();

        try {
            if (file!=null) file.close();
            fis.close();
            isr.close();
            br.close();
            for(int fi=0;fi<num_file;fi++){
                br2=map.get(fi);
                br2.close();
            }

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        so.kill();
        Runtime r=Runtime.getRuntime();
        r.gc();

    //this is a popup that comes out 
    GlitchSquad gli=new GlitchSquad("Completed");

问题是作为输出我得到:

line is: null ; 
line is: null ; 
line is: null ;

等等并且永远不会到达“完成”弹出窗口=(

我无法理解那个 null 到底是什么,因为控制线!= null 不起作用。我也尝试将该空值用作字符串..但什么都没有..我认为这是我如何关闭流的问题,但现在代码对我来说似乎是正确的..但仍然无法阻止它..

建议?提前致谢!

ps它是一个总结版本,以便专注于流..正确声明变量,导入等也是如此

编辑:代码更新

4

3 回答 3

0

您问题的核心是这段代码:

    BufferedReader br = ...
    String line = br.readLine();
    while (line != null) {
        System.out.println("line is:" + line);
        ...
        line = br.readLine();
    }

你说这反复输出:

line is: null ;
line is: null ;

(注意最后的“;”!!!)

可能发生的唯一方法是,如果您正在阅读的文件至少包含如下所示的一行:

null ;

实际上,除非“...”代码包含continue语句,否则输入文件中肯定有很多这样的行。


有没有办法检查文件是否正确写入?

是的。使用文本编辑器查看它和/或检查它的文件大小。

我的意思是最后是否有EOF?

在现代文件系统中,EOF 是一个位置而不是一个标记。具体来说,它是文件最后一个字节之后的位置。所以一个文件没有EOF在逻辑上是不可能的。(你必须有一个无限长的文件才能没有 EOF。)

于 2012-06-06T11:11:23.250 回答
0

我不知道它是否会解决您的问题,但我会改用以下代码:

try {
    fis = new FileInputStream(file_sel);
    isr=new InputStreamReader(fis);
    br=new BufferedReader(isr);
    map.put(num_file++, br);
} catch (FileNotFoundException e) {
    e.printStackTrace();
}

否则,您的“地图”中可能会有未捕获的“NullPointer”异常或奇怪的 BufferedReaders。(我现在不知道new InputStreamReader(null)会如何表现。)

看起来 i 和 num_file 的值总是相等的,所以只需删除 i。或者使用 LinkedList 并删除两者。

如果您不需要进行特殊的合并,我会这样做:

OutputStream os;
try {
    os = new FileOuputStream(outfile);
} catch (FileNotFoundException e) {
    os = null;
    e.printStackTrace();
}
if (os != null) {
    for(File file_sel:app) {
        if (file_sel.getName().startsWith("gtou")) {
            System.out.println(file_sel.getName());
            InputStream is = null;
            try {
                is = new FileInputStream(file_sel);
                byte[] buffer = new byte[1024];
                int readBytes = 0;
                while ((readBytes = is.read(buffer)) > 0) {
                    os.write(buffer, 0, readBytes);
                }
                fos.flush();
                is.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
}

如果您读取具有不同编码的文件,您当然至少必须修改读取。

如果它不起作用,我建议您构建一个“汇总”且可运行的示例程序。

于 2012-06-06T09:33:46.303 回答
0

EOF 是 EOF。没有更多的数据了。除非您在文件中有预期的 EOF 标记,或者有一个自描述协议告诉您 EOF 标记应该在哪里,否则无法确定文件是否已完全写入。

于 2012-06-06T09:47:37.810 回答