我在/tmp
中有一个临时文件,我想在某处存档,所以我尝试了:
import java.nio.file.Files;
[...]
Path source = Paths.get("/tmp/path/to/file_123456789.xml");
Path destination = Paths.get("/path/to/archive/dir/file.xml");
Files.copy(source, destination).
这失败是因为:
/path/to/archive/dir/file.xml不是目录
我知道了!但我只是想选择目标文件的名称。
到目前为止,我有一些不满足我的解决方案:
Files.createTempDirectory
创建临时目录,然后在其中移动临时文件,重命名,然后将其移至目标目录。可能存在更清洁的解决方案。你知道吗?
答案 0 :(得分:1)
在Jon的帮助下,我发现/path/to/archive/dir
实际上是一个文件。该错误消息具有误导性,因为它表示即使问题来自/path/to/archive/dir/file.xml
,/path/to/archive/dir
也不是目录。
在linux下重现的步骤:
1)创建文件/tmp/fakedir
touch / tmp / fakedir
2)在Java中,执行以下代码:
Path tempFile = Files.createTempFile("test", "test");
Files.copy(tempFile, Paths.get("/tmp/fakedir/destination.xml"));
您收到错误消息:
Exception in thread "main" java.nio.file.FileSystemException: /tmp/fakeDir/destination.xml: is not a directory
at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)
at sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)
at sun.nio.fs.UnixCopyFile.copyFile(UnixCopyFile.java:243)
at sun.nio.fs.UnixCopyFile.copy(UnixCopyFile.java:581)
at sun.nio.fs.UnixFileSystemProvider.copy(UnixFileSystemProvider.java:253)
at java.nio.file.Files.copy(Files.java:1271)
at Test.main(Test.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)