Java NIO2 中临时文件中 Files.copy 上的 AccessDeniedException

Sil*_*ier 5 java permissions file nio2

我正在习惯 Java 7 和新Files类。

我正在编写一个小型应用程序,它在某些时候必须替换文件的内容。我使用临时文件来避免在出现问题时删除目标文件。AccessDeniedException但是,在执行实际副本时我总是收到。

这是我的代码:

// Temporary file generation.
Path target = getCurrentConfigFile(); // Returns a path, works ok.
Path tempFile = Files.createTempFile("tempfile", null);
Files.write(tempFile, conf.getBytes(Charset.defaultCharset()), StandardOpenOption.WRITE);

// Actual copy.
Files.copy(tempFile, target, StandardCopyOption.REPLACE_EXISTING);

// Cleanup.
Files.delete(tempFile);
Run Code Online (Sandbox Code Playgroud)

getCurrentConfigFile()处理目标文件路径创建:

(... generates various strings from configuration parameters)
return FileSystems.getDefault().getPath(all, these, various, strings);
Run Code Online (Sandbox Code Playgroud)

当我执行代码时,它是通过.bat脚本执行的,并且我在标准命令提示符或提升中都会收到错误。目标文件位于C:\temp\tests我使用同一 Windows 用户创建的目录中。

问题似乎在于从临时文件中读取,因为直接写入目标是有效的。接下来我该看哪里?

ass*_*ias 2

不是答案,但评论太长。我运行下面的代码(从 Windows 7 上的命令行),它按预期工作:

public static void main(String[] args) throws IOException {
    Path target = Paths.get("C:/temp/test.txt"); // Returns a path, works ok.
    Path tempFile = Files.createTempFile("tempfile", null);
    Files.write(tempFile, "abc".getBytes(UTF_8), StandardOpenOption.WRITE);

    // Actual copy.
    Files.copy(tempFile, target, StandardCopyOption.REPLACE_EXISTING);

    // Cleanup.
    Files.delete(tempFile);
}
Run Code Online (Sandbox Code Playgroud)

所以你的问题不在于该代码。它可能位于代码中的其他位置,或者由于您正在使用的文件/文件夹的权限而导致。

  • 经过一些代码探索后,我发现一个“BufferedReader”在该文件上没有正确关闭,在之前调用的其他类中。我会接受您的“长评论”作为我问题的答案:“您的代码很好,请在其他地方搜索。” (2认同)