[疯狂Java]I/O:File(文件类,也是文件流的节点)、FilenameFilter(文件过滤器)

1. Java的File类简介:

    1) java.io包下的代表与平台无关的文件和目录;

    2) File本身只能完成对磁盘上文件和目录的新建、删除、重命名等操作(即只能修改文件属性,但不能修改文件中的内容);

    3) 也就是说File对象只是一个存储节点,想要修改、访问文件中的内容,必须在File节点上建立文件节点流才行,必须通过流才能修改访问文件中的内容!

    4) File底层必定是和平台相关,各个平台(操作系统)的文件系统实现不尽相同,必然包含具体的平台驱动,只不过虚拟机在应用层面上隐藏了这一差异;


!!以下介绍的都是File类的对象方法;


2. 文件名相关方法:文件、目录通用

    1) 首先File的构造器就要指定一个文件路径名:File(String pathname);

    2) File中有一个数据成员String path,构造后就会用pathname参数来对path赋值;

    3) 例如:File f = new File("dir\\test");  // 在Windows中路径分隔符是反斜杠,因此在字符串常量中需要转义

!!这里就会把字符串dir\test存入path中;

    4) 获取文件名:String getName();  // 这里返回的就是test,即path变量中去掉路径部分

    5) 获取完整的路径名:String getPath();  // 这里返回的就是dir\test,即path的完整值

    6) 获取绝对路径名:String getAbsolutePath();  // 这里返回的诸如D:\doc\eclipse\Test\dir\test的绝对与路径

!!即"环境路径\path",其中环境路径就是new File时运行该JVM时的路径

    7) 获取父目录:String getParent();  // 这里返回的就是dir,如果创建File是传入的路径是xxx\dir\test,那这里返回的就是xxx\dir,即path中去掉后缀文件名的结果

    8) 获得绝对路径包装的File对象:File getAbsoluteFile();  // 返回的File对象中的path的值等于getAbsoluePath的返回值,即用绝对路径来装填path成员变量,得到一个新的File对象

!!可以看到,以上文件名的相关方法都是纯粹的对path这个字符串变量进行解析而已,并不会真正到文件系统中检查该路径指定的文件是否存在,仅仅是一种字符串层面上的解析而已!!!

!!即使给定的文件不存在也可以正常调用这些方法并返回相应的结果;

    9) 修改文件名:renameTo方法,但该方法支持的并不好,各平台之间差异较大,并且有些平台上并不支持,因此这里就不做介绍了;


3. 属性检测:文件、目录通用

    1) 是否存在:boolean exists();

    2) 可读:boolean canRead();

    3) 可写:boolean canWrite();

    4) 是否是目录:boolean isDirectory();

    5) 是否是文件:boolean isFile();

    6) 检测path成员变量的内容是否是绝对路径:boolean isAbsolute();


4. 文件常规属性:只适用于文件

    1) 最后修改时间:long lastModified();

    2) 文件大小(字节):long length();


5. 创建、删除:是适用于文件

    1) 新建文件:boolean createNewFile();  // 按照成员变量path的名称新建一个文件,必须是原文件不存在的情况下才能新建,否则将新建失败(而不会覆盖原文件)而返回false

    2) 删除文件:boolean delete();  // 删除成员path所代表的文件,如果指定的路径不存在将失败返回false

    3) 创建临时文件:static File createTempFile(String prefix, String suffix, File directory);

         i. 以directory+prefix+随机数+suffix作为文件名(装载到path成员变量中)在指定目录directory下创建一个文件;

         ii. 正因为是临时,因此中间用随机数作文件名;

         iii. 例如:File tmp = File.createTempFile("mail", ".tmp", new File("dir"));  // 得到的文件tmp的path变量值为dir\mailXXXXXXX.tmp,并且在dir目录下创建了一个该文件

!!prefix要求至少三个字符,而suffix可以为null;

!!这是File类的静态方法,也就是工具方法!

    4) 一般临时文件都是在程序中临时使用的,都希望能在程序退出时就自动删除这些临时文件:void deleteOnExit();  // 注册了一个删除钩,表示在程序结束时自动删除该文件

!!该方法只要是File对象都能调用,不一定是临时文件;

!!其实临时文件也是普通文件,只不过其名字中有随机生成的数字而已;


6. 目录操作:只适用于目录

    1) 创建单个目录:boolean mkdir();  // 以path指定的名字在当前目录下创建一个目录,必须是原来不存在的,否则会false失败返回

!!该方法不能嵌套创建,比如dir1\dir2这样是不能创建,只能创建单个目录,比如dir1

    2) 嵌套创建:boolean mkdirs(); // 以path指定的名字嵌套创建多级目录,同样必须是原来不存在的,否则会false失败返回

!!只要path路径中有一级不存在就可以成功创建,比如dir1\dir2\dir3,dir1已经存在了,但是dir2不存在,那么同样可以成功创建出dir1\dir2\dir3多级目录

    3) 返回目录下所有文件(包括子目录)的名称:String[] list();

    4) 返回File对象:File[] listFiles();

    5) 利用静态方法listRoots获得操作系统的所有根目录:static File[] listRoots();

!!返回的各个File对象的path值例如:C:\、D:\等,因此调用getName方法得到的是空,之后调用getPath或者getAbsolutePath才能得到真正的路径名,其实就是一个盘符;

!!在Windows中是这样的,如果在Unix/Linux中,返回的是所有挂载到操作系统上的磁盘名称了!!


7. 文件过滤器:

    1) 可以看到在使用list和listFiles方法列出目录中的文件(和目录)时还有第二个版本的重载,即需要一个FilenameFilter的过滤器;

    2) 重载版本:

         i. String[] list(FilenameFilter filter);

         ii. File[] listFiles(FilenameFilter filter);

!!即可以通过过滤器来过滤出你想要的文件;

    3) FilenameFilter是一个函数式接口,里面只有一个方法需要实现,就是:boolean accept(File dir, String name);

         i. name是待检查的文件的名字,dir是该文件所在的目录;

         ii. 在调用list和listFiles时会将目标目录下的所有文件和目录用accept试一下,如果能接受就过滤出来并返回;

         iii. 因此需要实现accept方法来自定义过滤哪些文件;

    4) 示例:

dir.list((dir, name) -> name.endsWith(".txt") || new File(name).isDirectory());
!即我们想要的是.txt文件或者子目录都行;

!!由于是函数式接口,可以使用Lambda表达式;

你可能感兴趣的:(IO,File,FilenameFilter,疯狂Java)