File类
file:文件
directory:文件夹/目录
path:路径
1.File中静态成员变量
separator:系统默认的名称分隔符,Windows用反斜杠\,Linux用正斜杠/
separatorChar: public static final String separator = "" + separatorChar; separator是separatorChar变换过来的
pathSeparator:系统默认的路径分隔符,Windows默认为; Linux默认为:
pathSeparatorChar:public static final String pathSeparator = "" + pathSeparatorChar;
作用:在做项目的时候,操作路径不能写死
c:\develop\a\a.txt Windows下的路径
c:/develop/a/a.txt Linux下的路径
可以这么写,避免不同的操作系统出错:"c:"+File.separator+"develop"+File.separator+"a"+File.separator+"a.txt "
路径:
绝对路径:完整的路径,以盘符开始的路径(c:,d:)
相对路径:是一个简化的路径,指相对当前项目的根目录 D:\\IDEA\\project\\Test01
如果使用当前项目的根目录,可简化书写
D:\\IDEA\\project\\Test01\\a.txt----》简化为a.txt(可以省略当前项目的根目录)
注意:1.路径是不区分大小写的
2.路径中的文件名称分隔符在Windows中为反斜杠,反斜杠为转义字符,两个反斜杠代表一个反斜杠(路径为string中)
"D:\\IDEA\\project\\Test01"-->正确
"D:\IDEA\project\Test01"-->错误
2.File的构造方法
public File(String pathname)
public File(String parent, String child):parent与child只是将pathname拆分成两部分,这样便于路径的利用和转换
public File(File parent, String child) :注意parent为File类型,也相当于一个路径
3.File的获取方法
3.1 public String getAbsolutePath() 方法,
无论创建的文件是用相对路径还是绝对路径,返回结果都是绝对路径
3.2 public String getPath()方法,只返回创建文件对象时的pathname,不区分绝对路径,相对路径*/
3.3 public String getName(),返回文件名或目录名,为创建file对象时pathname的目录分隔符(\\)的最后信息*/
3.4 public long length()--该方法返回的是文件的大小,以字节为单位
注意:1.相应的路径下文件不存在,返回0
2.如果相应的路径下为目录,返回0
4.File的判断方法
/* public boolean exists() ---判断创建file对象的路径下文件或目录是否存在
文件或目录存在,返回true,否则false
*/
/*
* public boolean isDirectory()---判断创建file对象的路径下是否为目录(文件夹)
文件夹存在,返回true,否则false*/
/*
* public boolean isFile() --判断创建file对象的路径下是否为文件
文件存在,返回true,否则false*/
5.File类中的创建、删除方法
/*public boolean createNewFile() ---当且仅当该目录下的文件不存在时,创建文件
* 文件不存在,文件创建成功,返回true
* 文件存在,创建失败,返回false
* 注意:1.这个方法只用于创建文件,不能创建文件夹
* 2.创建文件的路径必须存在,否则会抛出异常*/
/*public boolean mkdir()--创建单级文件夹,只能创建一级文件夹
* 文件夹不存在,文件夹创建成功,返回true
* 文件夹存在,创建失败,返回false
* public boolean mkdirs()--可以创建多级文件夹,只能创建文件夹
* 任意给一个地址都能创建成功true,再次创建时相同路径文件夹时false
*
* 注意:1.这两个方法只能创建文件夹,不能创建文件
* 2.看是否为文件还是文件夹,看文件类型,不能看文件名称*/
/*public boolean delete()--既可以删除文件,也可以删除目录,且只能删一个,删除成功,返回true
* 当删除目录时,该目录必须为空,才删除成功true,否则false
当路径不存在,返回false
* 注意:delete是在硬盘上直接删除文件或文件夹,不走回收站,需要谨慎删除*/
5.目录的遍历
/*
* public String[] list()--遍历File对象目录下的子文件和目录,返回一个string数组
* 路径底部必须是目录,如果是文件会出现异常
* 路径不存在,返回false
* 隐藏文件和文件夹也可显示出来*/
/*
* public File[] list()--遍历File对象目录下的子文件和目录,返回一个File数组
* 路径底部必须是目录,如果是文件会出现异常
* 路径不存在,返回false
* 隐藏文件和文件夹也可显示出来*/
package iotest.file; import java.io.File; //测试File类下的list(),listFiles()遍历目录方法 public class TestFile06 { public static void main(String[] args) { // show1(); show2(); } /* * public File[] list()--遍历File对象目录下的子文件和目录,返回一个File数组 * 路径底部必须是目录,如果是文件会出现异常 * 路径不存在,返回false * 隐藏文件和文件夹也可显示出来*/ private static void show2() { File file = new File("C:\\test\\aaa"); File[] files = file.listFiles(); for (File f : files) { System.out.println(f); } } /* * public String[] list()--遍历File对象目录下的子文件和目录,返回一个string数组 * 路径底部必须是目录,如果是文件会出现异常 * 路径不存在,返回false * 隐藏文件和文件夹也可显示出来*/ private static void show1() { File file = new File("C:\\test\\aaa"); String[] list1 = file.list(); for (String listname : list1) { System.out.println(listname); } } }
6.目录的遍历时,可对文件或目录进行过滤,用过滤器FileFilter或FilenameFilter
public File[] listFiles(FileFilter filter)
public File[] listFiles(FilenameFilter filter)
listFiles()方法做了三件事情:
1.listFiles方法对构造方法中传递的目录进行遍历,对目录中的文件/文件夹--》封装成File对象
2.listFiles会调用参数传递的过滤器中的方法accept
3.listfiles会将遍历得到的每一个File对象,作为参数传递给accept,作为其参数pathname.
FileFilter是一个接口,里面只有一个抽象方法boolean accept(File pathname)
需要自定义过滤器,实现FileFilter接口中accept方法,一般可写成匿名内部类来写过滤器,或lambda表达式
pathname就是listFiles方法传递的每一个File对象
FilenameFilter是一个接口,里面只有一个抽象方法boolean accept(File dir, String name);
需要自定义过滤器,实现FilenameFilter接口中accept方法,一般可写成匿名内部类来写过滤器,或lambda表达式
dir为父目录,name是父目录下一个文件或文件名的名字,可以用public File(String parent, String child)构造方法,创建当前文件的File对象
没使用过滤器:
package iotest.file; import java.io.File; /*指定文件下的.java文件搜索---指定文件搜索*/ public class TestFile07 { public static void main(String[] args) { TestFile07.getJavaFile(new File("C:\\test")); } public static void getJavaFile(File file){ File[] files = file.listFiles();//遍历目录下的文件或文件夹 for (File f : files) { //判断遍历得到的对象是否为文件夹,是,继续遍历,否开始判断文件格式 if(f.isDirectory()) { getJavaFile(f); }else { /* //获取文件名 String path = f.getPath(); //忽略大小写 String s = path.toLowerCase(); //判断是否以.java 结尾 boolean b = s.endsWith(".java"); if(b){ System.out.println(f); }*/ //链式编写 if (f.getPath().toLowerCase().endsWith(".java")){ System.out.println(f); } } } } }
使用FileFilter自定义过滤器:
package iotest.file; import java.io.File; import java.io.FileFilter; public class TestFileFilter02 { public static void main(String[] args) { TestFileFilter.getJavaFile(new File("C:\\test")); } public static void getJavaFile(File file){ //用匿名构造器来构造过滤器 /*File[] files = file.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.isDirectory()||pathname.getPath().toLowerCase().endsWith(".java"); } });*/ //使用lambda表达式来优化匿名内部类 File[] files = file.listFiles((File pathname)->{ return pathname.isDirectory()||pathname.getPath().toLowerCase().endsWith(".java"); }); for (File f : files) { if (f.isDirectory()){ getJavaFile(f); }else { System.out.println(f); } } } }
使用FilenameFilter自定义过滤器:
package iotest.file; import java.io.File; import java.io.FileFilter; import java.io.FilenameFilter; public class TestFilenameFilter { public static void main(String[] args) { TestFilenameFilter.getJavaFile(new File("C:\\test")); } public static void getJavaFile(File dir){ //用匿名构造器来构造过滤器 /*File[] files = dir.listFiles(new FilenameFilter() { @Override //dir为父目录,name是父目录下一个文件或文件名的名字 public boolean accept(File dir, String name) { return new File(dir.getPath(),name).isDirectory()||name.toLowerCase().endsWith(".java"); } });*/ //使用lambda表达式来优化匿名内部类 File[] files = dir.listFiles((File d,String name)->{ return new File(d.getPath(),name).isDirectory()||name.toLowerCase().endsWith(".java"); }); for (File f : files) { if (f.isDirectory()){ getJavaFile(f); }else { System.out.println(f); } } } }