【问题标题】:Why are the last few lines missing from a text file that I'm creating?为什么我正在创建的文本文件中缺少最后几行?
【发布时间】:2011-05-05 17:08:21
【问题描述】:

我有一个函数可以创建 7 个不同的带有数据行的文本文件。然后使用以下函数将这 7 个文件组合成不同函数中的单个文件:

public void createSingle683File(int groupNumber, FileWriter wr){
        try{
            if(new File(printDir+"683_"+groupNumber+".txt").exists()){
                File f683 = new File(printDir+"683_"+groupNumber+".txt");
                BufferedReader input = new BufferedReader(new FileReader(f683));
                String line = null;
                while ((line = input.readLine()) != null){
                    //write contents of existing file to new file
                    wr.write(line+"\n");
                }
                //close bufferedInput
                input.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

调用代码:

    File fileHandle683 = new File(printDir+"683.txt");
                FileWriter wr683 = new FileWriter(fileHandle683);
                for (int groupNumber = 1; groupNumber < 8; groupNumber++){
                    createSingle683File(groupNumber,wr683);
                }
.
.
.
.
.//stuff
wr683.close();

Alaways 最终的 683.txt 从第 7 个文件 (683_7.txt) 中丢失了大约 50 行,我不知道为什么。它总是而且只有最终文件的最后几行丢失。我不知道我是要关闭 bufferInput 还是什么。

任何想法将不胜感激。我可以很快测试任何想法。

谢谢!

【问题讨论】:

    标签: java file bufferedreader


    【解决方案1】:

    您是否在该 FileWriter 实例上调用 flush() 和/或 close()

    【讨论】:

    • 是的,我在函数末尾使用 wr683.close() 关闭了 wr683;
    • 你确定close()正在被执行吗?
    【解决方案2】:

    我看不到你在哪里关闭wr683。我怀疑当进程关闭时数据被留在缓冲区中。至少打电话给flush()

    【讨论】:

    • flush() 做了什么而 close() 没有?
    • 它将所有数据写入磁盘,但让写入器保持打开状态以获得更多输出。如果您想继续写入,但又想尽量减少丢失到目前为止写入的数据的机会,这很有用。
    • 是的,我逐步检查并看到它正在被调用。我刚刚将 flush() 添加到 7 个文件的每个文件的 for 循环中,这修复了它!谢谢!
    • 调用close() 也会刷新文件 - 所以这似乎意味着close() 的代码永远不会到达作者
    • @northpole - 这很奇怪。正如@matt 所说,调用close()应该自动调用flush()。 Java 库中的某个地方可能存在错误(尽管这不太可能),或者您有多个线程访问文件和/或wr683。还是wr683//stuff 内部被重新分配?
    【解决方案3】:

    目前您没有关闭最终文件的文件编写器。因此,您当前缺少的内容可能仍在流 I/O 的缓存中。所以关闭最终文件的FileWriter实例,查看文件内容。

    所以在for循环之后你只需输入

    wr683.close();

    希望对你有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-03
      • 2011-02-06
      • 1970-01-01
      • 2012-10-01
      • 2021-08-23
      • 1970-01-01
      相关资源
      最近更新 更多