手写一个文件阅读器
# 手写一个文件阅读器
# 目录结构
- file
-- FileInfo
-- Files
1
2
3
2
3
# FileInfo
FileInfo
类用于存储文件的统计信息和内容,提供了一些方法用于操作和获取这些信息。
属性
lines
:记录读取的文件总行数。files
:记录读取的文件总数。content
:记录读取的文件内容的字符串。
方法
words()
:获取文件内容中的单词数组,使用正则表达式将内容按照非字母字符分割成单词
代码如下:
public class FileInfo {
/** 记录读取的文件总行数 */
private int lines;
/** 记录读取的文件总数 */
private int files;
/** 记录读取的文件内容的字符串 */
private String content = "";
/**
* 获取有多少个单词
* @return 单词数组
*/
public String[] words() {
return content.split("[^a-zA-Z]+");
}
public int getFiles() {
return files;
}
public void setFiles(int files) {
this.files = files;
}
public int getLines() {
return lines;
}
public void setLines(int lines) {
this.lines = lines;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
/**
* 将另一个FileInfo对象的信息追加到当前对象
* @param info 要追加的FileInfo对象
* @return 当前对象
*/
public FileInfo append(FileInfo info) {
if (info != null && info.lines > 0) {
this.files += info.files;
this.lines += info.lines;
this.content = new StringBuilder(this.content)
.append("\n")
.append(info.content)
.toString();
}
return this;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# Files
Files
类提供了静态方法用于读取文件或文件夹下的文件内容,并返回 FileInfo
对象。
主要包含两个方法:
read(String file)
:读取指定文件的内容并返回FileInfo
对象。使用FileReader
和BufferedReader
读取文件内容,并根据换行符统计行数。最后将文件内容和统计信息设置到FileInfo
对象中。read(String dir, String[] extensions)
:递归地读取指定目录下的文件内容并返回FileInfo
对象。- 根据文件的扩展名进行过滤,如果指定了扩展名,则只读取匹配扩展名的文件;
- 如果未指定扩展名,则读取所有文件。
- 递归地处理子目录的文件并累计统计信息。
代码如下:
public class Files {
/**
* 读取文件内容
* @param file 文件路径
* @return FileInfo对象,包含文件内容和统计信息
*/
public static FileInfo read(String file) {
if (file == null) {
return null;
}
FileInfo info = new FileInfo();
StringBuilder sb = new StringBuilder();
try (FileReader reader = new FileReader(file);
BufferedReader br = new BufferedReader(reader)) {
String line;
while ((line = br.readLine()) != null) {
sb.append(line).append("\n");
info.setLines(info.getLines() + 1);
}
int len = sb.length();
if (len > 0) {
sb.deleteCharAt(len - 1);
}
} catch (IOException e) {
e.printStackTrace();
}
info.setFiles(info.getFiles() + 1);
info.setContent(sb.toString());
return info;
}
/**
* 读取文件夹下面的文件内容
* @param dir 文件夹路径
* @param extensions 文件扩展名数组
* @return FileInfo对象,包含文件内容和统计信息
*/
public static FileInfo read(String dir, String[] extensions) {
if (dir == null) {
return null;
}
File dirFile = new File(dir);
if (!dirFile.exists()) {
return null;
}
FileInfo info = new FileInfo();
dirFile.listFiles(new FileFilter() {
@Override
public boolean accept(File subFile) {
String subFilepath = subFile.getAbsolutePath();
if (subFile.isDirectory()) {
info.append(read(subFilepath, extensions));
} else if (extensions != null && extensions.length > 0) {
for (String extension : extensions) {
if (subFilepath.endsWith("." + extension)) {
info.append(read(subFilepath));
break;
}
}
} else {
info.append(read(subFilepath));
}
return false;
}
});
return info;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
# 使用案例
参考笔者此篇文章:方法测试 | 集合 (opens new window)
上次更新: 2024/9/25 11:16:13