使用Files.copy()选择文件名

时间:2015-03-17 14:39:17

标签: java

我在/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创建临时目录,然后在其中移动临时文件,重命名,然后将其移至目标目录。
  • 将临时文件复制到存档目录中,然后在那里重命名。但是如果重命名失败,我在归档目录中会有一些垃圾。
  • 在存档目录中创建一个空文件,然后手动复制其中的源文件内容。

可能存在更清洁的解决方案。你知道吗?

1 个答案:

答案 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)