Java 使用nio遍历目录结构时将文件读入内存

Java 使用nio遍历目录结构时将文件读入内存,java,io,nio,Java,Io,Nio,如何在使用JavaNIO遍历目录树时将文件读入内存 以下代码是我的第一次尝试: String dirStart = "/start/directory/"; Path root = Paths.get(dirStart); Files.walkFileTree(root.toAbsolutePath().normalize(), new SimpleFileVisitor<Path>() { @Override public FileVisitResult visi

如何在使用JavaNIO遍历目录树时将文件读入内存

以下代码是我的第一次尝试:

String dirStart = "/start/directory/";

Path root = Paths.get(dirStart);
Files.walkFileTree(root.toAbsolutePath().normalize(), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, java.nio.file.attribute.BasicFileAttributes attrs) throws IOException {
    System.out.println(file);
    String[] dirs = file.toString().split("/");
    String var1 = dirs[2];String var2 = dirs[3];String var3 = dirs[4];
    System.out.println("var1 is: "+var1);
    System.out.println("var2 is: "+var2);
    System.out.println("var3 is: "+var3);
    BufferedReader bufferedReader = null;
    try {
        InputStream inputStream = Files.newInputStream(file);
        bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
        System.out.println("Reading Line: " + bufferedReader.readLine());
        } catch (IOException e) {e.printStackTrace();
    }
    finally {
        try {bufferedReader.close();}
        catch (IOException ioe) {ioe.printStackTrace();}
    }
    return FileVisitResult.CONTINUE;
    }
});  
也许问题是上面的代码混合了
java.nio
java.io
,但是我如何修复它呢

回答:

根据
SotiriosDelimanolis
的建议,我尝试嵌套
try with resources
语句,得到了以下代码,解决了这个问题并回答了这个问题:

Path root = Paths.get(dirStart);
Files.walkFileTree(root.toAbsolutePath().normalize(), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, java.nio.file.attribute.BasicFileAttributes attrs) throws IOException {
        try(InputStream inputStream = Files.newInputStream(file);BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))){
            System.out.println("Reading Line: " + bufferedReader.readLine());
        } catch (IOException e) {e.printStackTrace();}
    return FileVisitResult.CONTINUE;
}
});  
Path root=Path.get(dirStart);
Files.walkFileTree(root.toabsolutionPath().normalize(),新的SimpleFileVisitor()){
@凌驾
公共文件VisitResult visitFile(路径文件,java.nio.file.attribute.BasicFileAttributes attrs)引发IOException{
try(InputStream InputStream=Files.newInputStream(文件);BufferedReader BufferedReader=new BufferedReader(new InputStreamReader(InputStream))){
System.out.println(“读取行:+bufferedReader.readLine());
}catch(IOE异常){e.printStackTrace();}
返回FileVisitResult.CONTINUE;
}
});  

为什么不使用
try with resources
?在初始化
bufferedReader
之前,您的代码中可能还有其他东西抛出异常。由于您的代码不会尝试捕获这样的异常,因此在将异常抛出给调用方之前,
最终执行。使用
尝试使用资源
。您可以嵌套声明。@SotiriosDelimanolis我使用您的建议来派生一些有效的代码。非常感谢。我把它贴在上面我的文章末尾。如果你想把它写下来作为一个答案,我很乐意把它标记为被接受。啊,那很好。你可以自己写一个答案。请注意,如果出现异常,可能需要返回不同的
FileVisitResult
Path root = Paths.get(dirStart);
Files.walkFileTree(root.toAbsolutePath().normalize(), new SimpleFileVisitor<Path>() {
    @Override
    public FileVisitResult visitFile(Path file, java.nio.file.attribute.BasicFileAttributes attrs) throws IOException {
        try(InputStream inputStream = Files.newInputStream(file);BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))){
            System.out.println("Reading Line: " + bufferedReader.readLine());
        } catch (IOException e) {e.printStackTrace();}
    return FileVisitResult.CONTINUE;
}
});