1. 命令行程序
利用main函数可以接受参数 String[] args 这一特点。
public static void main(String[] args)
2. 任务描述
写一个命令行程序,能够
1. 读取一个目录下的所有文件和子目录
2. 在每个文件中寻找一段文本,支持正则查找
3. 把所有符合条件的文件添加到一个ZIP压缩包。
3. 逐步分析
3.1
首先,我们建立一个FileSearchApp 的java class, 根据任务描述,直觉上应该有储存文件地址的String path, 储存正则表达式的String regex,储存压缩文件名的String zipFileName, 储存符合条件的文件的路径列表 List<File> zippFiles. 注【1】
public class FileSearchApp {
private String path;
private String regex;
private String zipFileName;
private List<File> zipFiles = new ArrayList<>();
public static void main(String[] args) {
}
然后说明用法 "USAGE: FileSearch App path [regex] [zipfile]",接受三个参数,分别为path, 正则表达式,和压缩文件名
public static void main(String[] args) {
FileSearchApp app = new FileSearchApp();
switch(Math.min(args.length,3)){
case 0:
System.out.println("USAGE: FileSearch App path [regex] [zipfile]");
return;
case 3:
app.setZipFileName(args[2]);
case 2:
app.setRegex(args[1]);
case 1:
app.setPath(args[0]);
}
try {
app.walkDirectory(app.getPath());
} catch (Exception e) {
e.printStackTrace();
}
}
这里walkDirectory的定义如下:注【2】
public void walkDirectory(String path) throws IOException {
Files.walk(Paths.get(path)).forEach(f-> processFile(f.toFile()));
}
对一个String path, 使用Paths.get() 转化为Path 对象,然后通过Files.walk() 以Path为文件树的根节点,产生一个Stream,注【3】 对每一个Path f转化为File后, 进行processFile 的操作。
注释
注【1】
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。
File对象代表磁盘中实际存在的文件和目录。通过以下构造方法创建一个File对象。
通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。
File(File parent, String child);
通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
File(String pathname)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(String parent, String child)
通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。
File(URI uri)
本次用到的方法:
1 | public String getName() 返回由此抽象路径名表示的文件或目录的名称。 |
4 | public String getPath() 将此抽象路径名转换为一个路径名字符串。 |
6 | public Strin |