1. File类主要是JAVA为文件这块的操作(如删除、新增等)而设计的相关类
2. File类的包名是java.io,其实现了Serializable, Comparable两大接口以便于其对象可序列化和比较
public class File implements Serializable,Comparable
{
}
private String path;
public String getPath()
{
return path;
}
public static void main(String[] args)
{
System.out.println(File.separator); //在windows系统下运行结果为\
}
public static final String separator = "" + separatorChar;
public static void main(String[] args)
{
System.out.println(File.pathSeparator); //运行结果为;
}
public static final String pathSeparator = "" + pathSeparatorChar;
注意:构造函数只是创建一个File实例,并没有以文件做读取等操作,因此路径即使是错误的,也可以创建实例不报错
public File(String pathname) {}
public class Test2
{
public static void main(String[] args)
{
File file=new File("xxx");
System.out.println(file.getPath()); //路径结果就是xxx
}
}
public File(String parent, String child) {}
2.1) 若子路径child为Null,会抛出NullPointerException空异常错误
2.2) 当父路径为Null时,会以子路径child作为绝对路径创建实例,等同于调用第一个File(String child )效果一样
public class Test2
{
public static void main(String[] args)
{
String parent=null;
File file=new File(parent,"xxx");
System.out.println(file.getPath()); //路径结果就是xxx
}
}
2.3) 当父路径不为空时,会以父路径作为目录,子路径作为父路径下的目录或者文件名,最后得到的实例对象的路径就是父路径和子路径的组合
public class Test2
{
public static void main(String[] args)
{
String parent = "E:/test";
File parentFile= new File(parent);
String child = "E:/test/1.txt";
File file = new File(parentFile, child);
System.out.println(file.getPath()); // 路径结果就是E:\test\E:\test\1.txt
}
}
public class Test2
{
public static void main(String[] args)
{
String parent = "E:/test";
File parentFile= new File(parent);
String child = "E:/test/1.txt";
File file = new File(parentFile, child);
System.out.println(file.getPath()); // 路径结果就是E:\test\E:\test\1.txt
}
}
public File(URI uri) {}
下面是我E盘下test文件夹的文件情况,以此作为案例
public String getName()}
public class Test2
{
public static void main(String[] args) throws URISyntaxException
{
File file = new File("E:/test/1.txt");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.getName()); // 结果是1.txt
System.out.println(file2.getName()); // 结果是异常1.jpg
System.out.println(file3.getName()); // 结果是xxx
}
}
public String getParent()
public class Test2
{
public static void main(String[] args) throws URISyntaxException
{
File file = new File("E:/test/1.txt");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.getParent()); // 结果是E:\test
System.out.println(file2.getParent()); // 结果是E:\test
System.out.println(file3.getParent()); // 结果是null
}
}
public File getParentFile()
public class Test2
{
public static void main(String[] args) throws URISyntaxException
{
File file = new File("E:/test/1.txt");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.getParentFile()); // 结果是E:\test
System.out.println(file2.getParentFile()); // 结果是E:\test
System.out.println(file3.getParentFile()); // 结果是null
}
}
public String getPath()
public class Test2
{
public static void main(String[] args) throws URISyntaxException
{
File file = new File("E:/test/1.txt");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.getPath()); // 结果是E:\test\1.txt
System.out.println(file2.getPath()); // 结果是E:\test\异常1.jpg
System.out.println(file3.getPath()); // 结果是xxx
}
}
public boolean isAbsolute()
public class Test2
{
public static void main(String[] args) throws URISyntaxException
{
File file = new File("E:/test/1.txt");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.isAbsolute()); // 结果是true
System.out.println(file2.isAbsolute()); // 结果是true
System.out.println(file3.isAbsolute()); // 结果是false
}
}
public String getAbsolutePath()
public class Test2
{
public static void main(String[] args) throws URISyntaxException
{
File file = new File("E:/test/1.txt");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.getAbsolutePath()); // 结果是E:\test\1.txt
System.out.println(file2.getAbsolutePath()); // 结果是E:\test\异常1.jpg
System.out.println(file3.getAbsolutePath()); // 结果是D:\workspace\lettcode\xxx(编译器的工作空间作为解析目录了)
}
}
public boolean exists()
public class Test2
{
public static void main(String[] args) throws URISyntaxException
{
File file = new File("E:/test/1.txt");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.exists()); // 结果是true
System.out.println(file2.exists()); // 结果是true
System.out.println(file3.exists()); // 结果是false
}
}
public boolean isFile()
public class Test2
{
public static void main(String[] args) throws URISyntaxException
{
File file = new File("E:/test/1.txt");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.isFile()); // 结果是true
System.out.println(file2.isFile()); // 结果是true
System.out.println(file3.isFile()); // 结果是false
}
}
public boolean isDirectory()
public class Test2
{
public static void main(String[] args) throws URISyntaxException
{
File file = new File("E:/test/1.txt");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.isDirectory()); // 结果是false
System.out.println(file2.isDirectory()); // 结果是false
System.out.println(file3.isDirectory()); // 结果是false
}
}
public boolean createNewFile() throws IOException
public class Test2
{
public static void main(String[] args) throws IOException
{
File file = new File("E:/test/1.txt");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.createNewFile()); // 结果是false,已经存在无法创建
System.out.println(file2.createNewFile()); // 结果是false,已经存在无法创建
System.out.println(file3.createNewFile()); // 结果是true,不存在可以创建
}
}
创建的XXX文件的目录地址是以编译器的工作空间为上级目录加上创建实例对象的时候的路径名形成最后的路径
public boolean delete()
public class Test2
{
public static void main(String[] args) throws IOException
{
File file = new File("E:/test/");
File file2 = new File("E:/test/异常1.jpg");
File file3 = new File("xxx"); // 错误路径
System.out.println(file.delete()); // 结果是false,目录无法删除
System.out.println(file2.delete()); // 结果是true,文件可以删除
System.out.println(file3.delete()); // 结果是true,文件可以删除
}
}
执行方法后的test文件如下:
public boolean mkdir()
public class Test2
{
public static void main(String[] args) throws IOException
{
File file = new File("E:/test1/");
File file2 = new File("E:/test2/异常1.jpg");
File file3 = new File("E:/ceshi");
File file4 = new File("E:/ceshi2/2018");
System.out.println(file.mkdir()); // false 因为test1目录已存在
System.out.println(file2.mkdir()); // false,因为上级目录test2不存在
System.out.println(file3.mkdir()); // true,因为ceshi目录不存在且是上级目录是E盘存在的
System.out.println(file4.mkdir()); // false,因为ceshi2目录不存在,所以不成功
}
}
public boolean mkdirs()
public class Test2
{
public static void main(String[] args) throws IOException
{
File file = new File("E:/test1/");
File file2 = new File("E:/test2/异常1.jpg");
File file3 = new File("E:/ceshi");
File file4 = new File("E:/ceshi2/zhagnsan");
System.out.println(file.mkdirs()); // false 因为test1目录已存在
System.out.println(file2.mkdirs()); // true,因为目录不存在所以可以创建,但注意生成的异常1.jpg是文件夹不是图片
System.out.println(file3.mkdirs()); // true,因为目录不存在所以可以创建
System.out.println(file4.mkdirs()); // true,因为目录不存在所以可以创建
}
}
public String[] list()
1. 当实例对象代表的是文件不是目录时,返回NUll对象
2. 获取的是该目录下的文件名和目录名,并不包含该目录名称和其上级目录名称
3. 字符串数组中都是文件名或目录名并不是路径名
4. 字符串中的元素并不是按照实际系统中目录下的顺序排列的
例如E盘test文件夹里面是这样的
调用list方法
public class Test2
{
public static void main(String[] args) throws IOException
{
File file2 = new File("E:/test");
String[] list = file2.list();
for (int i = 0; i < list.length; i++)
{
System.out.println(list[i]); // 结果为1.txt、xxx、工资表.xls、异常1.jpg、第一个目录、第三个目录
}
}
}
public String[] list(FilenameFilter filter)
1. 过滤器是FilenameFilter类对象,当传入null时,效果和list()方法一样
2. 过滤器是指过滤掉不符合名称的名字
3. FilenameFilter 是一个接口,因此需要自己新建一个类来实现该接口作为参数传入进去
4.仔细研究方法的源码可以发现,所谓过滤就是要重写FilenameFilter的accept方法并在方法中过滤
public String[] list(FilenameFilter filter) {
String names[] = list();
if ((names == null) || (filter == null)) {
return names;
}
List v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {
if (filter.accept(this, names[i])) { //必须重写accept方法,并在方法内对传入的name进行判定是否合乎过滤条件
v.add(names[i]);
}
}
return v.toArray(new String[v.size()]);
}
5. 例如我们只要后缀名是txt的文件名称,那么可以按照以下逻辑来处理
创建FilenameFilter的实现类TxtFilter并重写accept方法,在方法中进行判定
public class TxtFilter implements FilenameFilter
{
@Override
public boolean accept(File dir, String name)
{
if(name.endsWith(".txt"))
{
return true;
}
return false;
}
}
但是仔细思考,如果我还需要过滤.java结束的呢?难道又去重新创建实现类?因此可以用过滤条件作为构造参数传入构造方法中初始化其变量,这样就是可变的
public class TxtFilter implements FilenameFilter
{
private String FilterName; // 作为过滤器名称变量
public TxtFilter(String FilterName)
{
this.FilterName = FilterName; // 初始化构造过滤器名称,这样就不用每次都创建新类
}
public String getFilterName()
{
return FilterName; // 公有的域访问器方法,提供接口获取
}
@Override
public boolean accept(File dir, String name)
{
String fileterNameString = this.getFilterName(); // this代表着调用accept方法的变量
if (name.endsWith(fileterNameString))
{
return true;
}
return false;
}
}
我们测试下结果
public class Test2
{
public static void main(String[] args) throws IOException
{
File file2 = new File("E:/test");
TxtFilter filter=new TxtFilter(".txt"); //过滤器,只需要.txt结尾的
String[] list = file2.list(filter);
for (int i = 0; i < list.length; i++)
{
System.out.println(list[i]); // 结果为1.txt
}
}
}