有没有办法使用Java实现cd */
?
在终端上,此命令将我带到第一个子目录。
在寻找解决方案时,我遇到了这个答案: Moving to a directory one level down
但是这会让我在层次结构中达到一个级别。它使用名为getParentFile()
的函数。可能是孩子有类似的功能吗?
答案 0 :(得分:0)
您无法更改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,否则您将泄漏打开的文件句柄。
答案 1 :(得分:0)
以下是使用较新的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 );
}
}