【问题标题】:Java.nio.files - Copying filesJava.nio.files - 复制文件
【发布时间】:2012-04-25 00:00:16
【问题描述】:

谁能告诉我我在下面的代码中做错了什么。我没有收到任何错误 - 它只是直接进入问题。

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class Main {

    public static void main(String[] args) {
         Path source = Paths.get("C:\\Users\\Public\\Pictures\\SamplePictures");
    Path nwdir = Paths.get("D:\\NetbeansProjects\\CopyingFiles\\copiedImages");

    try{
    Files.copy(source, nwdir);
    }catch (IOException e){
        System.out.println("Unsucessful. What a surprise!");
    }
    }
}

【问题讨论】:

  • 如果你在 catch 中打印出 e.getMessage(),那么它可能会告诉你。
  • 如果您打印堆栈跟踪,您可能对正在发生的事情有更好的线索。将 e.printStackTrace(System.out) 添加到您的 catch 块中。
  • 您是否尝试过,例如 e.printStackTrace() ?你会得到更好的问题描述。
  • receive no errors 因为你忽略了他们。 ;)

标签: java file copying java.nio.file


【解决方案1】:

这就是我设法将文件从一个位置复制到另一个位置的方法:

import java.io.IOException;
import static java.nio.file.StandardCopyOption.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class App  {

 public static void main(String[] args)
 {
    Path source = Paths.get("E:/myFile.pdf");
    Path nwdir = Paths.get("F:");
    try
    { 
       Files.copy(source, nwdir.resolve(source.getFileName()), REPLACE_EXISTING);
       System.out.println("File Copied");
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
 }

}

【讨论】:

    【解决方案2】:

    如果您查看 Files.copy 的 Javadocs,您会注意到这一行(添加了重点):

    如果文件是一个目录,那么它会在目标位置创建一个空目录(目录中的条目不会被复制)。此方法可以与 walkFileTree 方法一起使用,以复制目录和目录中的所有条目,或者在需要时复制整个文件树。

    看来您需要使用 walkFileTree 方法。

    (正如评论者所说,打印出异常,他们会经常告诉你出了什么问题!)

    【讨论】:

    • java.nio.file.NoSuchFileException: C:\Users\Public\Pictures\SamplePictures 在 sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:79) 在 sun.nio.fs。 windowsException.rethrowAsIOException(WindowsException.java:97) 在 sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102) 在 sun.nio.fs.WindowsFileCopy.copy(WindowsFileCopy.java:99) 在 sun.nio.fs .WindowsFileSystemProvider.copy(WindowsFileSystemProvider.java:277) 在 java.nio.file.Files.copy(Files.java:1219) 在 Main.main(Main.java:14)
    • 很好,但是,正如我所说,您的代码将无法工作,因为您尝试使用无法执行递归复制的函数进行递归复制。看看我提供的 API 链接。
    • 递归拷贝是指目录和samplepictures中的文件和目录。如果是这样 - 我已更改路径以直接链接到具有相同错误的单个 .jpg 文件。抱歉,如果我错过了您的观点。
    • 没问题。你最终做了什么来解决它?
    • 目录“示例图片”中有一个空格。我认为java会因为空格而抱怨,所以我将它重命名为“SamplePictures”。但是,这并没有更新路径。发生的另一个问题是我的 nwdir。我认为路径将是我想要文件的位置。这是正确的,但它也需要文件名。
    【解决方案3】:

    在这里寻找一种 NIO Java7 方法来递归地将目录复制到另一个位置。这可以通过 Files.walkFileTree 来完成,正如 Jon7 在另一个答案中提到的那样。我得到的这个代码是一个简单的目录副本:

    final Path srcDir, final Path dstDir;
    Files.walkFileTree(srcDir, new SimpleFileVisitor<Path>() {
        public FileVisitResult visitFile( Path file, BasicFileAttributes attrs ) throws IOException {
            return copy(file);
        }
        public FileVisitResult preVisitDirectory( Path dir, BasicFileAttributes attrs ) throws IOException {
            return copy(dir);
        }
        private FileVisitResult copy( Path fileOrDir ) throws IOException {
            Files.copy( fileOrDir, dstDir.resolve( srcDir.relativize( fileOrDir ) ) );
            return FileVisitResult.CONTINUE;
        }
    });
    

    有关处理文件属性和覆盖现有文件的更详细示例,请参阅http://docs.oracle.com/javase/tutorial/essential/io/examples/Copy.java

    【讨论】:

    • 当心srcDir.relativize( fileOrDir ) 会抛出ProviderMismatchException 如果你使用它来复制不同的文件系统,例如,从一个ZipFile 到默认。
    猜你喜欢
    • 2012-10-25
    • 1970-01-01
    • 2020-06-24
    • 2016-12-19
    • 1970-01-01
    • 2018-07-27
    • 2018-10-03
    • 2014-08-30
    • 2013-02-21
    相关资源
    最近更新 更多