Java:文件锁定了吗?
我已经写了一个程序来复制文件。每个文件都有一个线程,用于处理复制过程。复制文件后,我想删除该文件,但该文件已锁定。进程完成后,我关闭了文件的inputstream和outputstream。知道为什么我不能删除文件吗,即使两个流都关闭了?这个项目相当大,因此我不能在这里发布全部代码 这是复制文件的部分:Java:文件锁定了吗?,java,java-io,Java,Java Io,我已经写了一个程序来复制文件。每个文件都有一个线程,用于处理复制过程。复制文件后,我想删除该文件,但该文件已锁定。进程完成后,我关闭了文件的inputstream和outputstream。知道为什么我不能删除文件吗,即使两个流都关闭了?这个项目相当大,因此我不能在这里发布全部代码 这是复制文件的部分: OutputStream outputStream = null; try { outputStream = new FileOutputStream(outputFile);
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();
}
}
}
一个可能的原因是您的输入流没有在其关闭的
try{}/finally{}
块中打开。因此,如果InputStream中发生错误,则仅当错误发生在上面显示的块内时,文件才会关闭
第二个可能的原因是您在同一finally
块中关闭了两个对象。由于close()
抛出IOException
,因此如果在关闭第一个文件时发生异常,第二个文件将不会关闭。您可能想考虑使用语法分配所有可关闭资源,这将为您关闭文件并消除一个异常的可能性,从而使另一个文件正确关闭。比如说,
try(InputStream = new FileInputStream(inputFile); OutputStream outputStream = new FileOutputStream(outputFile)) {
... your logic goes here
}
如果愿意,您可以添加一个
catch
,但您不再需要finally
,因为即使抛出异常,您的文件也将被关闭。您似乎没有足够的权限通过FileOutputStream创建文件
刚刚在我的机器上测试了你的代码,它在正确的写入权限下工作。你说的“复制”是什么意思?无论如何,不要重新发明轮子:仅仅因为可以用java程序复制它并不意味着java程序就是锁定文件的程序。可能您计算机上的其他东西锁定了该文件?您使用的是哪个操作系统?如果您没有使用超旧版本的Java(Java 7或更高版本),那么您只需一行即可复制文件:
文件。复制(…)
-比手动复制过程简单得多。@NicolasFilotto Windows 8.1