Java:文件已锁定?

时间:2016-05-02 13:43:17

标签: java java-io

我已经编写了一个程序副本文件。对于每个文件,都有一个线程,它处理复制过程。复制文件后,我想删除该文件,但该文件已被锁定。在完成此过程后,我已关闭输入流以及文件的输出流。任何想法为什么我不能删除文件,即使在两个流关闭后?该项目非常大,因此我不能在这里发布整个代码。

这是复制文件的部分:

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();
        }
    }
}

2 个答案:

答案 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创建文件。

刚刚在我的机器上测试了您的代码,并且它具有正确的写入权限。