正在设计的自定义文件格式需要强大的文件损坏检查,目前通过附加在文件末尾的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周围编写计数流包装以确保文件长度正确?