如何使用 Java 在我的目录中向下移动一级?

How can I move down by one level in my directory using Java?

有没有办法使用 Java 来实现 cd */? 在终端上,此命令将我带到第一个子目录。

在寻找解决方案时,我遇到了这个答案: Moving to a directory one level down

但这让我在层次结构中上升了一个层次。它使用一个名为 getParentFile() 的函数。 child有类似的功能吗?

您不能更改 Java 进程的当前工作目录(据我所知),但如果您只需要使用 File 对象,您可以执行类似这个:

File dir = new File("/some/start/path");

File[] children = dir.listFiles(file -> file.isDirectory());
if (children.length > 0) {
    /* You may need a different sort order to duplicate the behavior
       of the * glob character, but for example purposes... */
    Arrays.sort(children, Comparator.comparing(File::getName));

    /* Take the first one */
    dir = children[0];
}

System.out.println("New directory is: " + dir.getAbsoluteFile());

或者如果你想使用 Streams,类似这样的东西可以完成同样的事情:

Path base = Paths.get("/some/start/path");

try (Stream<Path> items = Files.list(base)) {
    Path found = items
            .filter(Files::isDirectory)
            .sorted()
            .findFirst()
                .orElse(base);

    System.out.println("New directory is: " + found);
}

在 Streams 情况下,您应该确保使用 try-with-resources,否则您将泄漏打开的文件句柄。

这是使用较新的 Files.newDirectoryStream 方法的答案。它与 Sean Bright 发布的内容基本相同,尽管它不会在选择第一个文件之前对文件进行排序。

public class DirWalk {
   public static void main( String[] args ) throws IOException {
      List<Path> subDir = StreamSupport.stream( Files.newDirectoryStream( 
              Paths.get( "." ), f -> Files.isDirectory( f ) ).spliterator(), false )
              .limit(1)
              .collect( Collectors.toList() );

      System.out.println( "First sub-directory found: " + subDir );
   }

}