Java 使用nio遍历目录结构时将文件读入内存
如何在使用JavaNIO遍历目录树时将文件读入内存 以下代码是我的第一次尝试: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
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;
}
});