【问题标题】:IOException handling during file write in javajava中文件写入期间的IOException处理
【发布时间】:2012-07-25 03:27:09
【问题描述】:

我的应用程序不断将大量字节写入文件。如果我的代码块正在写出字节并在与驱动器或网络的连接丢失的情况下获得 IOException,我如何知道它已经写入了多少字节?

例如,我一次写入 2500 个字节,如果发生 IOException,是否意味着它没有向文件写入任何内容,或者它会将部分字节写入文件?如果部分字节被写入文件我怎么知道写入了多少

仅供参考,我正在使用

DataOutputStream

写出文件。我只在我的应用关闭时刷新。

【问题讨论】:

标签: java file io


【解决方案1】:

你不能,IOException 随时可能发生。如果你仔细想想,IOException 随时可能是由软件或硬件故障引起的,在第一个字节被写入之前,毕竟已经写入但连接发生了问题 - 或者如果数据块很大,则在中间.

重新连接后,您必须检查文件大小或使用其他技术使文件保持一致状态并恢复。最简单的安全网:在写入数据之前读取文件大小并可靠存储,写入数据并在写入后读取文件大小。如果发生错误并且当前文件大小不等于预期文件大小(上次保存),则截断多余的字节并重试。

阅读关系数据库中的事务日志,了解大型和可靠的软件如何处理此类情况。

【讨论】:

    【解决方案2】:

    这取决于写入失败的方式,但 InterruptedIOException 可能是您正在寻找的:

    http://docs.oracle.com/javase/1.4.2/docs/api/java/io/InterruptedIOException.html

    它包含一个“bytesTransferred”字段: "报告在中断之前作为 I/O 操作的一部分传输了多少字节。"

    【讨论】:

    • 这是我一直在寻找的那种异常,如果 try catch 有效,我会进行实验并报告!!谢谢
    • 可能是。但这是针对每个 IO 操作的,如果我没记错的话,不是整个传输...
    • 该异常仅适用于线程被中断的情况,而不是存在真正的 I/O 问题(例如 OP 询问的情况)。
    • 它适用于 I/O 问题,例如 Socket 超时(参见子类),所以我可以假设它也适用于文件 IO。我建议通过不断写入并强制关闭文件来测试它。
    猜你喜欢
    • 1970-01-01
    • 2018-06-03
    • 1970-01-01
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 2013-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多