从未关闭的FileOutputStream中检索文件长度

时间:2015-03-08 06:56:02

标签: java validation fileoutputstream try-with-resources

正在设计的自定义文件格式需要强大的文件损坏检查,目前通过附加在文件末尾的SHA-2校验和来实现。鉴于给定文件的大小,验证SHA-2校验和需要一段时间,因此已决定将最终文件大小放在文件的开头附近,以快速过滤掉文件长度不匹配的文件。

也许我只是在思考太多,但无论如何,下面的例子会失败吗?

File outputFile = ... // Output file

try(FileOutputStream fOut = new FileOutputStream(outputFile);
    FileChannel fChannel = fOut.getChannel()){

    fOut.write(MAGIC);       // byte array to magic header
    fOut.write(new Byte[8]); // reserve space for eventual file size

    //// [Bulk Writing to File] ////

    // Ensure all writing is complete

    fOut.flush();

    fOut.getFD().sync(); // Is this necessary?

    // Write final file size to file

    ByteBuffer finalFileSize = ByteBuffer.allocate(8);
    finalFileSize.order(ByteOrder.BIG_ENDIAN);
    finalFileSize.putLong(outputFile.length()); // Will this statement return an inaccurate file length?

    fChannel.position(MAGIC.length);
    fChannel.write(finalFileSize);

}catch(IOException ex){
    // Exception handle code... deletes current file and starts again.
}

由于文件流未被封闭,我特别担心outputFile.length()返回无效长度(因此某些字节可能会在特定平台上未更新的内存/元数据中持续存在)。

在我的特定情况下,将文件长度简单地不可用(写为0)比使其无效更好,因为损坏检测代码将忽略文件长度< = 0并继续进行SHA-2验证但将拒绝正面文件长度不匹配。

我的实现是否足够,或者我是否需要在FIS周围编写计数流包装以确保文件长度正确?

0 个答案:

没有答案