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表达式;