Java File

I. 总括

简介

根据Java JDK 的官方定义,File 类是文件的抽象表达和文件夹的路径(an abstract representation of file and directory pathnames).

特点

File 类对象本身只是用于代表某个文件或者文件夹,能够返回其一些属性,但是本身不参与I/O 操作(不能直接使用File 类对象进行读写).
同时,用于路径表达的字符串也是取决于系统的:在Unix 中,为”/”;Windows 中,为”:” 和”\”.

II. 使用

注:例子皆以OS X 平台为操作系统

创建

File file = new File("/Users/"); // 实例化File 对象,指向路径为/Users/

此处file 对象为一个文件夹,因为路径为/Users/
所以在调用系统方法isDirectory() 时会返回true

System.out.println(file.isDirectory()); // true 

属性查询

除了isDirectory()方法外,File 还有其他方法来查看路径所指向文件(文件夹)的属性.

System.out.println(file.getAbsolutePath()); // /Users/
System.out.println(file.exists()); // true
System.out.println(file.lastModified()); //21:21:42 GMT, April 21, 2016

文件夹下文件查询

因为此处file 是一个Directory,所以可以通过方法list()获得指向路径下的各个文件(文件夹).

File file = new File("/Users/Desktop/");
String [] files = file.list();
for(int i=0; i < files.length; i++) 
    System.out.println(files[i]);

output://
.DS_Store
.localized
500 Days of Summer.mkv
Android Studio.app
Courses
effectice java
Files
Mills Modern Business Penmanship.pdf
Paragraph Claim.tiff
programs
Punctuation 3.tiff
Redesigned SAT
The Big Bang Theory

此处,list()方法返回了/Users/Desktop/ 文件夹路径下的所有文件,并以String 的形式呈现.
list()方法能够传入参数,达到筛选所需要的文件名的目的;而这里传入的参数,是FilenameFilter interface.
此处在输出时使用了Lambda Expression.

class FileDemo {
    public static FilenameFilter filter(final String regex) {
        return new FilenameFilter() {
            Pattern pattern = Pattern.compile(regex);

            @Override
            public boolean accept(File dir, String name) {
                return pattern.matcher(new File(name).getName()).matches();
            }
        };
    }

    public static void main(String [] args) {
         File file = new File("/Users/Desktop/");
        String[] files = file.list(filter(".*"));
        Arrays.stream(files).forEach(s -> System.out.println(s));
    }
}

output://
.DS_Store
.localized
500 Days of Summer.mkv
Android Studio.app
Courses
effectice java
Files
Mills Modern Business Penmanship.pdf
Paragraph Claim.tiff
programs
Punctuation 3.tiff
Redesigned SAT
The Big Bang Theory

类似的方法listFiles()原理相同,但返回的是File 数组。

III. 文件树

利用list()方法,能够查遍指定目录下的所有文件。

public class Directory {

    public static File[] local(File dir, final String regex) {
        return dir.listFiles(new FilenameFilter() {
            private Pattern pattern = Pattern.compile(regex);

            @Override
            public boolean accept(File dir, String name) {
                return pattern.matcher(new File(name).getName()).matches();
            }
        });
    }

    public static File[] local(File dir) {
        return local(dir, "\n");
    }

    // TODO a two-tuple for returning a pair of objects
    public static class TreeInfo implements Iterable<File> {
        public List<File> files = new ArrayList<>();
        public List<File> dirs = new ArrayList<>();

        @Override
        public Iterator<File> iterator() {
            return files.iterator();
        }

        void addAll(TreeInfo other) {
            files.addAll(other.files);
            dirs.addAll(other.dirs);
        }

        @Override
        public String toString() {
            return "dirs  " + PPrint.pformat(dirs)
                    + "\n\nfiles " + PPrint.pformat(files);
        }

    }

    public static TreeInfo walk(File file) {
        return recurseDirs(file, ".*");
    }

    public static TreeInfo walk(File file, String regex) {
        return recurseDirs(file, regex);
    }

    public static TreeInfo walk(String filePath, String regex) {
        return recurseDirs(new File(filePath), regex);
    }

    public static TreeInfo walk(String filePath) {
        return recurseDirs(new File(filePath), ".*");
    }

    // TODO 搜寻遍指定文件下的文件树
    private static TreeInfo recurseDirs(File startDir, String regex) {
        TreeInfo result = new TreeInfo();
        for (File item: startDir.listFiles()) {
            if (item.isDirectory()) { // Directory
                result.dirs.add(item);
                result.addAll(recurseDirs(item, regex));
            } else // File
                if (item.getName().matches(regex))
                    result.files.add(item);

        }
        return result;
    }

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值