1. 构造函数&字段
java包中提供的一个类File,它代表了与平台无关的文件和目录,目录指的就是文件夹。File类方便对文件与文件夹的属性信息进行操作。
private static void constructor(){
//1.File(String pathname)创建一个File对象可以使用路径名直接构建
File f1 = new File("F:\\大数据组件学习\\21.Java\\8.IO流\\a.txt");
//2.File(String parent,String child)根据parent路径名字符串和child路径名字符串
File f2 = new File("F:\\大数据组件学习\\21.Java\\8.IO流","b.txt");
//3.File(File parent,String child)根据parent抽象路径名和child路径名字符
File parent = new File("F:\\大数据组件学习\\21.Java\\8.IO流");
File f3 = new File(parent,"c.txt");
/*
* 4.在windows系统下,文件名的名称分割符使用的是反斜线(\),在Unix系统下使用的确是斜线(/),
* 所以,在windows系统下可以在文件名中,使用反斜线,但是在Unix系统下就不能运行了。
* 为了使用代码通用,File类提供了字段separator,用来表示与系统有关的默认名称分隔符。
*/
File f4 = new File("F:"+File.separator+"大数据组件学习"+File.separator+"21.Java"+File.separator+"8.IO流"+File.separator+"d.txt");
}
2. 常见功能
2.1. 获取
private static void getDemo(){
File f = new File("1.txt");
//1.txt是相对路径,指的是当前目录下的某个文件,在Java项目中当前目录指的是项目目录
System.out.println("获取文件名:"+f.getName());
//绝对路径是根目录开始的路径,在windows系统是一般都带有盘符,如F:
System.out.println("获取绝对路径:"+f.getAbsolutePath());
//getPath()方法的返回值跟构造File时传入的路径名有关
System.out.println("获取路径:"+f.getPath());
System.out.println("获取文件的大小:"+f.length());
long time = f.lastModified();
Date date = new Date(time);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("获取文件最后一次修改的时间:"+sdf.format(date));
}
2.2. 创建和删除
使用创建一个File对象,这个File对象代表的文件可能存在,也可能不存在。可以使用delete()方法删除文件,createNewFile()创建文件。
private static void fileDemo() throws IOException{
//这里的f指的是一个文件,这个文件可能存在也可能不存在
File f = new File("a.txt");
//使用delete()方法删除,如果文件删除,返回true,否则返回false
boolean flag = f.delete();
System.out.println(flag);
//使用createNewFile()创建文件,如果创建返回true,否则返回false
boolean flag2 = f.createNewFile();
System.out.println(flag2);
}
File既能操作文件,也能操作目录。目录就是通常说的文件夹。
private static void dirDemo(){
//这里的dir指的是一个目录
File dir = new File("aa");
System.out.println("创建目录成功:"+dir.mkdir());
System.out.println("删除目录:"+dir.delete());
File dir1 = new File("bb/cc/dd");
System.out.println("创建联级目录:"+dir1.mkdirs());
//此处的删除,删掉的是dd这个目录
System.out.println("删除目录:"+dir1.delete());
}
2.3. 判断
可以通过File类提供的方法,判断File对象是文件还是目录。
private static void isDemo(){
File f = new File("a.txt");
System.out.println("判断f是不是文件:"+f.isFile());
System.out.println("判断f是不是目录:"+f.isDirectory());
}
如果这个file是文件,那么isFile()返回true,isDirectory()返回false。如果file是目录,则结果相反。但是,如果file不存在,那么这两个方法返回的都是false。
这个file代表的是文件还是目录,不是根据它的后缀名判断的,而是根据创建方式判断的。如果使用createNewFile()创建,它就是文件,如果使用mkdir()创建,它就是目录。
2.4. 获取目录内容
可以通过list()方法查找到目录下的文件和子目录的名字。
private static void getList(){
File dir = new File("F:\\大数据组件学习\\21.Java\\8.IO流\\aa");
//List() 返回目录下的目录和文件的名称
String[] names = dir.list();
for(String name:names){
System.out.println(name);
}
}
输出的时候,会把dir下的文件和子目录的名字全部输出。
注意:
1、调用list()方法的file必须是目录,否则会发生空指针异常。
2、如果这个目录不存在,也会发生空指针异常。
3、如果这个目录是系统级目录,也会发生空指针异常,因为系统级目录我们是访问不了的。
4、如果目录存在但是没有内容,会返回一个数组,但是长度为0.
2.5. 过滤器
list()的重载方法,里面有一个带有过滤器参数的方法list(FilenameFilter filter) ,“返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。除了返回数组中的字符串必须满足过滤器外,此方法的行为与 list() 方法相同。”如果想要获取指定文件,则可以通过过滤器,把需要的文件过滤出出来。
FilenameFilter 是一个接口,里面只有一个方法,就是accept,这个方法里面需要传入两个参数,一个是需要过滤的目录,一个是文件或目录名。可以通过重写accept方法,当文件或目录名满足accept中的过滤条件时,返回true,则将该文件或目录名保留并返回,否则返回false,不保留该文件或目录名。
package com.java.base;
import java.io.File;
import java.io.FilenameFilter;
public class FilterByTxt implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(".txt");
}
}
private static void getList1(){
File dir = new File("F:\\大数据组件学习\\21.Java\\8.IO流\\aa");
//List() 返回目录下的目录和文件的名称
String[] names = dir.list(new FilterByTxt());
for(String name:names){
System.out.println(name);
}
}
在实际应用的时候,需要过滤的不一定是.txt,所以,应该把代码改成可以复用的,把.txt传入过滤器对象,进行判断。
package com.java.base;
import java.io.File;
import java.io.FilenameFilter;
public class FilterByTxt implements FilenameFilter{
private String suffix;//代表要过滤的后缀
public FilterByTxt(String suffix){
this.suffix = suffix;
}
@Override
public boolean accept(File dir, String name) {
// TODO Auto-generated method stub
return name.endsWith(suffix);
}
}
把FilterByTxt对象传入到list()中。可以修改传入的参数,写.txt可以查到所有后缀名为.txt的文件,改成.java则可以找到所有后缀名为.java的文件。
private static void getList1(){
File dir = new File("F:\\大数据组件学习\\21.Java\\8.IO流\\aa");
//List() 返回目录下的目录和文件的名称
String[] names = dir.list(new FilterByTxt(".txt"));
for(String name:names){
System.out.println(name);
}
}
list()获取到目录下所有文件和目录的名称,现在,来看另一个方法listFiles() ,这个方法可以获取目录下的所有File对象。它的重载方法可以过滤File对象,也可以过滤File的名字。
通过listFiles()方法,查找目录下的所有File对象。
private static void getList2(){
File dir = new File("F:\\大数据组件学习\\21.Java\\8.IO流\\aa");
File[] files = dir.listFiles();
for(File f:files){
System.out.println(f);
}
}
也可以使用listFiles()的重载方法listFiles(FileFilter filter)。FileFilter是File对象的过滤器,它是一个接口,里面只有一个accept方法,参数是File对象。
private static void getList3(){
File dir = new File("F:\\大数据组件学习\\21.Java\\8.IO流\\aa");
File[] files = dir.listFiles(new FilterIsFile());
for(File f:files){
System.out.println(f);
}
}
package com.java.base;
import java.io.File;
import java.io.FileFilter;
public class FilterIsFile implements FileFilter{
@Override
public boolean accept(File pathname) {
// TODO Auto-generated method stub
return pathname.isFile();
}
}