2017-08-10 27 views
0

例如,我想从网络上保存大文件(3G +)。代码示例:如果在从InputStream保存文件的过程中发生错误,删除文件是否安全?

try { 
    Files.copy(inputstream, destFilePath); 
} catch (IOException ex) { 
    Files.deleteIfExists(destFilePath); 
} finally { 
    IOUtils.closeQuietly(inputstream); 
} 

根据的JavaDoc deleteIfExists

在某些操作系统可能无法删除文件时 *这是此Java虚拟机或打开和使用其他程序。

以这种方式删除文件是否安全? Files.copy发布输出流偶发生错误,是否保证JVM释放锁定文件?

+1

你可以在删除它之前调用file.close()。 – ivange94

+0

@ ivange94,我不确定我能否找到这个方法'File :: close'。 – eg04lt3r

+0

对不起。该方法实际上存在,但在FileInputStream中。不是文件。 – ivange94

回答

0

文件不应该在你的情况下使用。考虑到Files.copy不会要求您输出OutputStream或File,仅用于路径。不管是否例外,它都可能在退出时打开一个文件描述符,这会很奇怪。在这种情况下,文件API将被打破。无论如何,File javadoc会通知您这种可能性。在任何情况下,如果你想尽量减少文件被删除的可能性,你也可以添加一个file.deleteOnExit();那么当jvm终止时,它会做另一次尝试删除文件(除非jvm异常终止)。

+0

它需要Path并在'copy'方法内创建OutputStream。 – eg04lt3r

+0

我知道,我的意思是outputstream不是输入参数,而是由Files.copy方法本身创建的。因此,该方法的可靠性就是正确释放所有内容。否则,这将是一个缺陷;至少,如果没有在javadoc中明确声明(如果你很好奇,你可以查看文件源代码,你会看到它实际上关闭了它创建的输出流)。 –

+0

你对发布输出流是正确的。我认为我有某种偏执=)。 – eg04lt3r

相关问题