File类
1.1概述
据最终保存在硬盘上,在硬盘上是以1和0 保存的。而给我们展示出来的并不是二进制数据,而是一个一个的文件,换句话说数据最终都保存在这些文件中。而这些文件又被文件夹管理。
通过上述描述我们发现在计算机硬盘中就存在两种事物:文件和文件夹事物。而在Java中使用class类来描述生活中存在的事物,那么Java中是如何描述文件和文件夹这两类事物呢?
使用File类来描述文件和文件夹事物。
java.io.File
类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。
说明:
1)Java中的定义的io技术的类基本都在java.io包下;
2)使用File类来描述文件和文件夹事物的;
3)File类它主要是对持久设备上的文件和文件夹进行操作。它不能去操作文件中的数据。将来我们只要需要操作持久设备上的文件或文件夹直接找File类完成,如果要操作文件中的数据只能使用IO流技术搞定;
结论:File类就是描述文件或文件夹的,只要我们在Java中要操作文件或文件夹,就找File类。
1.2 构造方法
-
public File(String pathname)
:表示根据文件或文件夹的路径名创建一个File对象。
使用File类的构造函数可以把指定的字符串封装成File类的对象,但是这个字符串表示的路径或者文件到底是否存在,File类是不进行判断的。
-
例子:
真实路径是
File file1 = new File("D:\\学习专用2\\day08\\note "); -
不真实路径是
-
File file1 = new File("D:\\学习专用2\\note "); 这样也不会报错
-
注意:File类表示文件和目录路径名的抽象表示形式。那么该路径代表的文件或文件夹不一定存在。
-
public File(String parent, String child)
:从父路径名字符串和子路径名字符串创建新的 File实例。 -
public File(File parent, String child)
:从父抽象路径名和子路径名字符串创建新的 File实例。
构造举例,代码如下:
/*
1.File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
参数:pathname 根据指定路径名获取File类的对象
补充:对于 pathname 表示的路径是否存在,在File类的构造函数中不会作为判断是否存在
2.File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。
参数:
parent 表示父目录 D:\aaa 属于String类型
child 表示子目录 it
举例:
D:\aaa\it
3.File(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。
参数:
parent 表示父目录 D:\aaa 属于File类型
child 表示子目录 it
*/
public class FileDemo01 {
public static void main(String[] args) {
//创建File类的对象
/*File f = new File("D:\\aaa\\it");
System.out.println("f = " + f);//f = D:\aaa\it*/
//使用构造函数创建对象 File(String parent, String child)
/*String parent = "D:\\aaa";
String child = "it";
File f = new File(parent, child);
System.out.println("f = " + f);//f = D:\aaa\it*/
File parent = new File("D:\\aaa");
String child = "it";
File f = new File(parent, child);
System.out.println("f = " + f);//f = D:\aaa\it
}
}
小贴士:
-
一个File对象代表硬盘中实际存在的一个文件或者目录。
-
无论该路径下是否存在文件或者目录,都不影响File对象的创建。
1.3 常用方法
File类是描述文件和文件夹的。使用File类的对象就可以获取当前File类描述的那个文件或文件夹的信息(信息包括文件或者文件夹的名称、大小、类型、日期等)。
获取功能的方法
-
public String getAbsolutePath()
:获取的当前调用这个方法的File对象的全路径(绝对路径或者真实路径) 返回的是路径的字符串; 说明:在操作文件时,需要指定文件的路径,而路径在程序中有两种表现形式:
1、 绝对路径(真实路径):是从盘符开始的路径,带有根目录的路
径 例: D:\abc\test\Demo.java D就是根目录。
2、 相对路径:是从当前路径开始的路径,或者可以理解不带根目录的路径
例: 当前路径为D:\abc,要描述相对路径,只需输入test\Demo.java
-
public String getPath()
:获取到当前File类的对象中封装的内容。 -
public String getName()
:获取的是File类的对象中封装的文件或目录的最后一级名称。 -
public long length()
:获取文件大小long size = file.length();
-
绝对路径:从盘符开始的路径,这是一个完整的路径。
-
相对路径:相对于项目目录的路径,这是一个便捷的路径,开发中经常使用。
代码演示:
/*
File类中的获取方法讲解:
1.String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串。
说明:
绝对路径:也称为全路径 D:\\aaa\\it 只要带盘符的就是绝对路径
相对路径:现在在D:\\aaa盘符下 相对路径 it不带盘符的就是相对路径
补充:如果我们在idea中书写不带盘符的路径 aaa\\test 一般都是相对于idea中的当前项目
2.String getPath() 将此抽象路径名转换为路径名字符串。
创建File类对象时指定什么就获取什么
3.String getName() 获取文件或者文件夹名字--->123.txt
4.long length() 返回由此抽象路径名表示的文件的长度。 注意:不能获取文件夹长度,如果获取会有可能不准确
*/
public class FileDemo01 {
public static void main(String[] args) {
//创建File类的对象
File f = new File("D:\\test\\2.txt");
// File f = new File("aaa\\it");//相对
//使用对象调用非静态方法获取f的绝对路径
// String absolutePath = f.getAbsolutePath();
// System.out.println("absolutePath = " + absolutePath);//absolutePath = D:\aaa\it
//String getPath()
/*
如果创建File类的对象时:指定的路径:D:\aaa\itcast 绝对路径
getAbsolutePath() 方法获取的结果: D:\aaa\it
getPath() 方法获取的结果: D:\aaa\it
如果创建File类的对象时:指定的路径:aaa\it 相对路径 相对当前项目
getAbsolutePath() 方法获取的结果:F:\ideawork\jiuyeban\aaa\it
getPath() 方法获取的结果: aaa\it
*/
// System.out.println(f.getPath());
}
}
getAbsolutePath()和getPath()区别:
如果创建File类的对象时:指定的路径是绝对路径那么getAbsolutePath()和getPath()方法获取的结果是一样的
如果创建File类的对象时:指定的路径是相对路径 相对当前项目
getAbsolutePath() 方法获取的结果:F:\ideawork\jiuyeban\aaa\it
getPath() 方法获取的结果: aaa\it
public class FileGetFunctionDemo {
public static void main(String[] args) {
// 创建File类的对象
File file=new File("D:\\test\\123.txt");
//getName()函数 获取的是封装在File类中的文件或者文件夹的最后一级名称 123.txt
System.out.println("getName()="+file.getName());
//getPath()表示获得File类中封装的所有内容 D:\test\123.txt
System.out.println("getPath()="+file.getPath());
//获取文件大小
long size = file.length();
System.out.println("size="+size);
}
}
判断功能的方法
-
public boolean exists()
:是否存在 如果File类对象中的文件或者文件夹在硬盘上存在 返回 true ,否则返回false; -
public boolean isDirectory()
:是否是文件夹 如果是文件夹 返回 true 否则返回false; -
public boolean isFile()
:是否是文件 如果是文件 返回 true , 否则返回false; -
boolean isHidden(): 是否是隐藏文件 如果是 返回true,否则返回false
代码演示:
public class FileIs {
public static void main(String[] args) {
File f = new File("D:\\aaa\\bbb.java");
File f2 = new File("D:\\aaa");
// 判断是否存在
System.out.println("D:\\aaa\\bbb.java 是否存在:"+f.exists());
System.out.println("D:\\aaa 是否存在:"+f2.exists());
// 判断是文件还是目录
System.out.println("D:\\aaa 文件?:"+f2.isFile());
System.out.println("D:\\aaa 目录?:"+f2.isDirectory());
}
}
输出结果:
d:\aaa\bbb.java 是否存在:true
d:\aaa 是否存在:true
d:\aaa 文件?:false
d:\aaa 目录?:true
创建删除功能的方法
-
public boolean createNewFile()
:当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。 A:true :表示创建文件成功; false :表示创建文件失败,失败原因基本是因为当前的目录有了相同的文件;
B:如果指定的路径不存在,这时就会抛异常 Java.io.IOException:系统找不到指定的路径。这时是不会去创建文件的;
-
public boolean delete()
:删除由此File表示的文件或目录。注意:此删除方法是粉碎文件,找不回来 -
public boolean mkdir()
:创建文件夹 创建单级文件夹 一个文件夹 说明:如果指定路径不存在,也不会抛异常,都返回false -
public boolean mkdirs()
:创创建文件夹 创建多级文件夹 多个文件夹 -
boolean createNewFile() :创建文件,如果指定路径不存在文件,则创建,返回true 如果指定的路径存在文件或者文件夹的名字一致,都不能创建文件返回false 补充:在计算机中文件可以没有后缀名 注意:如果创建文件指定的路径不存在,则会抛异常IOException:找不到指定的路径异常
代码演示:
public class FileCreateDelete {
public static void main(String[] args) throws IOException {
// 目录的创建
File f2= new File("D:\\aaa");
System.out.println("是否存在:"+f2.exists());// false
System.out.println("是否创建:"+f2.mkdir()); // true
System.out.println("是否存在:"+f2.exists());// true
// 创建多级目录
File f3= new File("D:\\aaa\\bbb\\ccc");
System.out.println(f3.mkdir());// false
File f4= new File("D:\\aaa\\bbb\\ccc");
System.out.println(f4.mkdirs());// true
// 目录的删除
System.out.println(f2.delete());// true
System.out.println(f4.delete());// false
}
}
public class FileDemo04 {
public static void main(String[] args) throws Exception {
//创建对象
/* File f = new File("D:\\aaa\\2.txt");
//创建文件1.txt
boolean boo = f.createNewFile();//创建文件
//输出
System.out.println("boo = " + boo);
}
}
delete方法,API中说明:
1)delete方法,如果此File表示目录,则目录必须为空才能删除。
2)函数的删除不走回收站。谨慎使用。
1.4 列举方法
-
public String[] list()
:返回一个String数组,表示该File目录中的所有子文件或目录。
-
public File[] listFiles()
:返回一个File数组,表示该File目录中的所有的子文件或目录。
代码演示:
/*
String[] list() 返回一个字符串数组,获取指定目录下的所有子文件和子文件夹 获取所有的儿子们
说明:list()方法何时返回null?
1.如果指定的路径不存在,返回null
2.如果指定的路径是文件,不是文件夹,则返回null
注意:如果指定路径存在并且是文件夹,但是没有子文件和子文件夹时会发生什么?
不会将任何内容放到数组中,数组长度是0
File[] listFiles() 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
注意:和list区别:返回值是File类型 其他注意事项一样
*/
public class FileDemo01 {
public static void main(String[] args) {
//创建对象
File f = new File("D:\\test");//这里可以将D:\test作为父目录
//调用方法获取父目录下的儿子们
/* String[] arr = f.list();
System.out.println(arr.length);*/
File[] arr = f.listFiles();
//遍历
/* for (String s : arr) {
System.out.println(s);//"范冰冰.jpg" ---- list()
}*/
for (File s : arr) {
System.out.println(s);//D:\test\范冰冰.jpg-----listFiles()
}
}
}
1.5 文件过滤器
文件过滤器介绍
过滤器:它就是把不需要的过滤出去,留下需要的内容。
文件或文件夹过滤器:过滤掉不需要的文件或文件夹,留下需要的文件或文件夹。
有种需求可以考虑使用过滤器:
假设在一个父目录文件夹下有成千上万个文件或者文件夹,而后缀名为.jpg的文件只有几个,我想把后缀名为.jpg的文件找出来,其实使用我们讲解的list()和listFiles()函数可以解决,但是比较麻烦,主要是麻烦在某个类中或者某个项目中写完之后想要在其他项目使用,还得书写,也就是可移植性不是太好,那么我们是否可以想出一个可移植性好的办法呢,写完一次,其他地方可以再用,提高效率简化代码开发。
答案是可以的,过滤器就可以实现。
FileFileter介绍
FileFilter:它是一个过滤器,专门用来过滤文件或文件夹的。
java.io.FileFilter是一个接口,是File的过滤器。 该接口的对象可以传递给File类的
File类中的函数:
File[] listFiles(FileFilter filter) 返回符合过滤器条件的所有儿子的File数组
FileFilter接口中的函数:
boolean accept(File pathname) 测试指定的抽象路径名是否应包含在路径名列表中。
FileFilter过滤器中的accept方法中的pathname是当前需要过滤的那个文件或文件夹对象。
或者可以这么理解pathname:就是某个儿子的File对象。
需求:判断E:\123 下是否有.jpg文件,如果有,则打印其绝对路径。
代码演示:
public static void main(String[] args) {
File file = new File("E:\\123");
File[] files = file.listFiles(new FileFilter() {
/**
* @param pathname 父目录下的子文件夹和文件
* @return
*/
@Override
public boolean accept(File pathname) {
//判断是否是文件
if (pathname.isFile()) {
//获取文件的名字
String name = pathname.getName();
//判断文件后缀名
if (name.endsWith(".jpg")) {
return true;
} else {
return false;
}
} else {
return false;
}
}
});
for (File file1 : files) {
System.out.println("file1 = " + file1.getAbsolutePath());
}
}
public static void main(String[] args) {
File file = new File("E:\\123");
File[] files = file.listFiles(new FileFilter() {
/**
* @param pathname 父目录下的子文件夹和文件
* @return 是否有.jpg文件
*/
@Override
public boolean accept(File pathname) {
//判断是否是文件
boolean boo1 = pathname.isFile();
//获取文件名字
String name = pathname.getName();
//判断文件后缀名
boolean boo2 = name.endsWith(".jpg");
//返回综合结果
return boo1 && boo2;
}
});
for (File file1 : files) {
System.out.println("file1 = " + file1.getAbsolutePath());
}
}
上诉代码底层解析:
上一篇: Filter高级开发(二)——实现敏感字符过滤功能
下一篇: 异常 exception