我已经编写了一个程序副本文件。对于每个文件,都有一个线程,它处理复制过程。复制文件后,我想删除该文件,但该文件已被锁定。在完成此过程后,我已关闭输入流以及文件的输出流。任何想法为什么我不能删除文件,即使在两个流关闭后?该项目非常大,因此我不能在这里发布整个代码。
这是复制文件的部分:
OutputStream outputStream = null;
try {
outputStream = new FileOutputStream(outputFile);
int read = 0;
byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read);
}
outputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
if(inputStream != null) {
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
一个可能的原因是您的输入流未在其关闭的try{}/finally{}
块中打开。因此,如果您的InputStream中发生错误,只有在您在上面显示的块内发生该错误时,才会关闭该文件。
第二个可能的原因是你在同一finally
块中关闭了两件事。由于close()
抛出IOException
,如果关闭第一个文件时发生异常,则第二个文件不会被关闭。您可能需要考虑使用try-with-resources语法分配所有可关闭资源,该语法将负责为您关闭文件,并消除一个异常使另一个文件无法正常关闭的可能性。例如,
try(InputStream = new FileInputStream(inputFile); OutputStream outputStream = new FileOutputStream(outputFile)) {
... your logic goes here
}
如果您愿意,可以添加catch
,但不再需要finally
,因为您的文件将被关闭,即使引发了异常。
答案 1 :(得分:0)
您似乎没有足够的权限通过FileOutputStream创建文件。
刚刚在我的机器上测试了您的代码,并且它具有正确的写入权限。