使用 BufferedReader 从目录中读取文件
Read files from directory using BufferedReader
我写了一段代码来从目录中读取文件。
该目录包含许多文件。首先,我计算目录中的文件数,然后我想计算扩展名为 .info
和 .data
的文件中的行数
我的代码如下:
public void checkEmptyEntryFileLoader(String directory) {
File name = new File(directory);
String filenames[]=name.list();
long countFile = 0;
long countLineData = 0;
long countLineInfo = 0;
for(String filename:filenames){
//System.out.println(filename);
countFile++;
}
System.out.println(countFile); // this bloc worked well
File files[]=name.listFiles();
for(File file:files){
String fileName = file.getName();
if(fileName.endsWith("data")) {
try {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
while (reader.readLine() != null) {
countLineData++;
}
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileName.endsWith("info")) {
try {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
while (reader.readLine() != null) {
countLineInfo ++;
}
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(countLineInfo );
}
}
我遇到了错误:
java.io.FileNotFoundException: my_file_name.data (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at java.io.FileReader.<init>(FileReader.java:58)
错误涉及 the FileReader
,它只接受 string
,而 filename
是 String
你有什么想法吗?
谢谢
不要在 FileReader()
中传递 filename
,而是尝试传递 file
。
BufferedReader reader = new BufferedReader(new FileReader(file));
我的回答假定您作为输出给出的错误是打印在 try-catch 块中的堆栈跟踪,而不是您尝试 compile/run 代码时遇到的错误。
@SARVESH TANDON 的回答看起来会解决您的问题,请注意您扫描文件系统两次。
考虑使用 NIO 和流来扫描大型文件系统,因为 File.list
/ File.listFiles
在文件数量变大时性能非常差,或者您需要更深入地扫描,因为它们需要重复.
这里是使用 NIO 的代码示例。它使用过滤器将搜索限制为仅具有正确扩展名的文件,您可以将 find depth=1
参数更改为 Integer.MAX_VALUE
以进行深度扫描,并处理异常:
Path dir = Path.of(directory);
long[] counts = new long[3]; // FILES, MATCHFILES, LINECOUNT
try(Stream<Path> stream = Files.find(dir, 1, (p, a) -> ++counts[0] > 0 && a.isRegularFile())) {
stream.filter(p -> { String fn = p.getFileName().toString();
return (fn.endsWith("data") || fn.endsWith("info")) && ++counts[1] > 0; })
.forEach(p -> {
try(Stream<String> lines = Files.lines(p)) {
long count = lines.count();
counts[2]+=count;
System.out.println("path: "+p+" lines:"+count);
} catch (IOException io) {
throw new UncheckedIOException(io);
}
});
}
System.out.println("Total files: "+(counts[0]-1)); // dir is counted too
System.out.println("Match files: "+counts[1]);
System.out.println("Total lines: "+counts[2]);
我写了一段代码来从目录中读取文件。
该目录包含许多文件。首先,我计算目录中的文件数,然后我想计算扩展名为 .info
和 .data
我的代码如下:
public void checkEmptyEntryFileLoader(String directory) {
File name = new File(directory);
String filenames[]=name.list();
long countFile = 0;
long countLineData = 0;
long countLineInfo = 0;
for(String filename:filenames){
//System.out.println(filename);
countFile++;
}
System.out.println(countFile); // this bloc worked well
File files[]=name.listFiles();
for(File file:files){
String fileName = file.getName();
if(fileName.endsWith("data")) {
try {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
while (reader.readLine() != null) {
countLineData++;
}
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fileName.endsWith("info")) {
try {
BufferedReader reader = new BufferedReader(new FileReader(fileName));
while (reader.readLine() != null) {
countLineInfo ++;
}
}catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(countLineInfo );
}
}
我遇到了错误:
java.io.FileNotFoundException: my_file_name.data (No such file or directory)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at java.io.FileReader.<init>(FileReader.java:58)
错误涉及 the FileReader
,它只接受 string
,而 filename
是 String
你有什么想法吗? 谢谢
不要在 FileReader()
中传递 filename
,而是尝试传递 file
。
BufferedReader reader = new BufferedReader(new FileReader(file));
我的回答假定您作为输出给出的错误是打印在 try-catch 块中的堆栈跟踪,而不是您尝试 compile/run 代码时遇到的错误。
@SARVESH TANDON 的回答看起来会解决您的问题,请注意您扫描文件系统两次。
考虑使用 NIO 和流来扫描大型文件系统,因为 File.list
/ File.listFiles
在文件数量变大时性能非常差,或者您需要更深入地扫描,因为它们需要重复.
这里是使用 NIO 的代码示例。它使用过滤器将搜索限制为仅具有正确扩展名的文件,您可以将 find depth=1
参数更改为 Integer.MAX_VALUE
以进行深度扫描,并处理异常:
Path dir = Path.of(directory);
long[] counts = new long[3]; // FILES, MATCHFILES, LINECOUNT
try(Stream<Path> stream = Files.find(dir, 1, (p, a) -> ++counts[0] > 0 && a.isRegularFile())) {
stream.filter(p -> { String fn = p.getFileName().toString();
return (fn.endsWith("data") || fn.endsWith("info")) && ++counts[1] > 0; })
.forEach(p -> {
try(Stream<String> lines = Files.lines(p)) {
long count = lines.count();
counts[2]+=count;
System.out.println("path: "+p+" lines:"+count);
} catch (IOException io) {
throw new UncheckedIOException(io);
}
});
}
System.out.println("Total files: "+(counts[0]-1)); // dir is counted too
System.out.println("Match files: "+counts[1]);
System.out.println("Total lines: "+counts[2]);