Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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.nio.file.Path';获取目录中的元素;s_Java_File_Io_Java.nio.file - Fatal编程技术网

使用java.nio.file.Path';获取目录中的元素;s

使用java.nio.file.Path';获取目录中的元素;s,java,file,io,java.nio.file,Java,File,Io,Java.nio.file,我目前正在掌握Java中的文件管理。据我所知,java.nio.file.Path是这样做的首选方式 假设我想将oldDir的内容复制到当前为空的newDir。每次我复制一个文件时,我都需要这行代码来获取新文件的路径: Path newDir=FileSystems.getDefault().getPath(“新”); Path oldDir=FileSystems.getDefault().getPath(“old”); 用于(路径oldFile:oldDir){ Path newFile=F

我目前正在掌握Java中的文件管理。据我所知,java.nio.file.Path是这样做的首选方式

假设我想将oldDir的内容复制到当前为空的newDir。每次我复制一个文件时,我都需要这行代码来获取新文件的路径:

Path newDir=FileSystems.getDefault().getPath(“新”);
Path oldDir=FileSystems.getDefault().getPath(“old”);
用于(路径oldFile:oldDir){
Path newFile=FileSystems.getDefault().getPath(“new”,oldFile.getFileName().toString());//为什么这么复杂?:(
文件。复制(旧文件、新文件);
}

是否有类似于
newDir.getChild(oldFile.getFileName())
的方法来做我想做的事情,还是真的没有更简单的方法来做呢?

为了简化代码,您可以做以下几件事:

  • 使用或创建
    路径
    实例。这两种方法都委托给默认的
    文件系统
    。前者是在Java 11中添加的,现在是首选方法

  • 用于将相对路径附加到某个绝对路径

  • 但是代码中也有一个错误。您正在迭代
    oldDir
    ,这是因为
    Path
    实现了
    Iterable
    。但是,这会迭代路径的名称,而不是路径的子项。换句话说,这:

    Path Path=Path.of(“foo”、“bar”、“file.txt”);
    用于(路径名称:路径){
    System.out.println(名称);
    }
    
    将输出:

    foo
    酒吧
    file.txt
    
    如果您想迭代目录的子目录,您需要使用类似于或的东西(后者有两个重载)。这两种方法都只返回目录的直接子目录。还有其他方法可用于递归迭代目录及其子目录;请浏览
    文件
    文档以查看提供的内容

    因此,您的代码应该如下所示:

    Path oldDir=Path.of(…);
    Path newDir=路径的(…);
    try(DirectoryStream dirStream=Files.newDirectoryStream(oldDir)){
    对于(路径oldFile:dirStream){
    Path newFile=newDir.resolve(oldFile.getFileName());
    文件。复制(旧文件、新文件);
    }
    }
    
    为了简化代码,您可以做以下几件事:

  • 使用或创建
    路径
    实例。这两种方法都委托给默认的
    文件系统
    。前者是在Java 11中添加的,现在是首选方法

  • 用于将相对路径附加到某个绝对路径

  • 但是代码中也有一个错误。您正在迭代
    oldDir
    ,这是因为
    Path
    实现了
    Iterable
    。但是,这会迭代路径的名称,而不是路径的子项。换句话说,这:

    Path Path=Path.of(“foo”、“bar”、“file.txt”);
    用于(路径名称:路径){
    System.out.println(名称);
    }
    
    将输出:

    foo
    酒吧
    file.txt
    
    如果您想迭代目录的子目录,您需要使用类似于或的东西(后者有两个重载)。这两种方法都只返回目录的直接子目录。还有其他方法可用于递归迭代目录及其子目录;请浏览
    文件
    文档以查看提供的内容

    因此,您的代码应该如下所示:

    Path oldDir=Path.of(…);
    Path newDir=路径的(…);
    try(DirectoryStream dirStream=Files.newDirectoryStream(oldDir)){
    对于(路径oldFile:dirStream){
    Path newFile=newDir.resolve(oldFile.getFileName());
    文件。复制(旧文件、新文件);
    }
    }
    
    newDir.resolve(oldFile.getFileName())
    newDir.resolve(oldFile.getFileName())