package bjsxt.IO;
import java.util.Arrays;
import java.util.regex.*;
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public class DirList {
public static void main(String[] args) {
File path=new File(".");
String[] list;
if(args.length==0){
list=path.list();
}else{
list=path.list(new DirFilter(args[0]));
}
Arrays.sort(list,String.CASE_INSENSITIVE_ORDER);
for(String dirItem:list){
System.out.println(dirItem);
}
}
}
class DirFilter implements FilenameFilter{
private Pattern pattern;
public DirFilter(String regex){
pattern=Pattern.compile(regex);
}
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return pattern.matcher(name).matches();
}
}
谢谢大家,实验了一下,我没传参数,那个args.length就等于0,代码后面的过滤实际上没执行。
有一个新问题:
File path=new File(".")
这个的绝对路径是C:\Users\yyd\workspace\imooc.IO\.
list=path.list();
打印list却打印出了C:\Users\yyd\workspace\imooc.IO下的所有文件名,所以这个"."相当于是个通配符吗?
仔细看下代码,如果有传入参数,就为通过path创建的list添加一个由传入参数为规则的过滤器(正则表达式),如果没有传入参数则直接创建list。
自己动手实践下便可以知道其效用
对于传入参数
**入口方法的签名就是public static void main(String[] sdss)
必须是public的
必须是static的
必须是void的
方法名必须是main
方法参数必须是String数组
jvm启动就按照这个标准去找这个方法,找到就执行,找不到就报错。**
手机排版渣,见谅
那么假定你定义了一个函数,并且传了一个字符串作为参数。在函数体里面,这个参数你可以使用,也可以不使用,但是你调用这个函数的时候,必须传递一个参数过去。但是通过命令行运行的时候,是可以不传递参数过去的,这个机制和别的函数不同。
我就是瞎说。。
你从CLI启动你的程序是这样的:
java bjsxt.IO.DirList
如果你希望传递一些额外的参数作为,例如
java bjsxt.IO.DirList hello world
这时候args的长度就为2,args[0]是hello,args[1]是world
回到你代码中,实际上是期望从args[0]获得一个目录的参数作为接下去的代码的输出目录,否则就是使用当前目录来输出
回答你第二个问题
. 指代当前目录
.. 指代上一级目录
举个例子
/a/b/c/./
和/a/b/c是同一个目录
/a/b/c/../
和/a/b是同一个目录