Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:文件锁定了吗?_Java_Java Io - Fatal编程技术网

Java:文件锁定了吗?

Java:文件锁定了吗?,java,java-io,Java,Java Io,我已经写了一个程序来复制文件。每个文件都有一个线程,用于处理复制过程。复制文件后,我想删除该文件,但该文件已锁定。进程完成后,我关闭了文件的inputstream和outputstream。知道为什么我不能删除文件吗,即使两个流都关闭了?这个项目相当大,因此我不能在这里发布全部代码 这是复制文件的部分: OutputStream outputStream = null; try { outputStream = new FileOutputStream(outputFile);

我已经写了一个程序来复制文件。每个文件都有一个线程,用于处理复制过程。复制文件后,我想删除该文件,但该文件已锁定。进程完成后,我关闭了文件的inputstream和outputstream。知道为什么我不能删除文件吗,即使两个流都关闭了?这个项目相当大,因此我不能在这里发布全部代码

这是复制文件的部分:

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