目录
1、IO概述
- 要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上。
- 把内存中的数据存储到持久化设备上,这个动作称为输出(写)Output操作
- 把持久化设备中的数据读取到内存中,这个动作称为输入(读)Input操作
- 这种输入输出的动作称为IO操作
2、File类
- 概述:文件和目录路径名的抽象表现形式。
- 即,在Java中把文件或者目录(文件夹)都封装成File对象
3、File类的静态成员变量
-
pathSeparator: 与系统有关的路径分割符
是一个分号(;),目录的分割(window中环境变量配置各个路径用分号分割,表示一个完整的路径结束)Linux中是冒号(:)
-
separator:与系统有关的默认名称分隔符
向右的斜杠(\),目录名称分割;Linux中是向左的斜杠(/)
4、File类的构造方法
- File(String pathname)
- File(String parent, String child)
- File(File parent. String child)
public class FileDemo {
public static void main(String[] args) {
String pathName = "d:\\实训\\test.java";
File file1 = new File(pathName);
System.out.println(file1);
File file2 = new File("d:\\实训", "test.java");
System.out.println(file2);
File dir = new File("d:\\实训"); // 目录
File file3 = new File(dir, "test.java");
System.out.println(file3);
}
}
// 这里的文件 "d:\\实训\\test.java" 可以不存在
5、相对路径和绝对路径
- 相对路径:相对于某个位置
D:\A\Java\jdk1.8.0_92\bin
D:\A\Java\jdk1.8.0_92
- 绝对路径:一个固定的路径,从盘符开始。在系统中具有唯一性。
6、File类的常用方法
- String getAbsolutePath(); 返回此抽象路径名的绝对路径名字符串
- String getName(); 返回由此抽象路径名表示的文件或目录的名称
- String getPath(); 将此抽象路径名转换为一个路径名字
- long length(); 返回由此抽象路径名表示的文件的长度
public class FileMethodDemo {
public static void main(String[] args) {
File file = new File("src\\day0419\\IO\\FileDemo");
String absolutePath = file.getAbsolutePath();
System.out.println("绝对路径:"+absolutePath);
String name = file.getName();
System.out.println("文件名称:"+name);
// File中封装的路径是什么,获取到的就是什么
String path = file.getPath();
System.out.println("相对路径:"+path);
long length = file.length();
System.out.println("文件大小:"+length);
}
}
7、File类创建功能
- createNewFile() 创建文件
- mkdir() 创建文件夹
- mkdirs() 创建多层文件夹
public class FileMethodDemo {
public static void main(String[] args) {
File file = new File("demo\\src\\test.java");
try {
boolean create = file.createNewFile();
System.out.println(create ? "文件创建成功" : "文件创建失败");
} catch (IOException e) {
e.printStackTrace();
}
File file1 = new File("D:\\实训\\test\\0419");
boolean mkdir = file1.mkdir();
System.out.println(mkdir ? "文件创建成功" : "文件创建失败");
}
}
8、File类删除功能
- delete() 删除文件(注意:这里是直接从硬盘删除,不走回收站,慎用!)
new File("d:\\d\\test");
boolean delete = file.delete();
System.out.println(delete ? "文件删除成功" : "文件删除失败");
// 删除目录时,如果目录中有内容,则无法直接删除,只有将目录中的内容都删除后,保证该目录为空,这时才能删除该目录
9、File类判断功能
- boolean exists(); 判断File构造方法中封装路径是否存在。
- boolean isDirectory() 判断File构造方法中封装路径是否是文件夹。
- boolean isDirectory() 判断File构造方法中封装路径是否是文件。
File file1 = new File("d:\\A\\test");
System.out.println(file1.exists());
File file2 = new File("d:\\A");
System.out.println(file2.isDirectory() ? "是文件夹" : "不是文件夹");
System.out.println(file2.isFile() ? "是文件" : "不是文件");
10、File类的list获取功能
- String[] list(); 返回一个字符串数组,这些字符串指定,此抽象路径名表示的目录中的文件和目录
- File[] listFiles(); 返回一个抽象路径名数组,这些路径名表示,此抽象路径名表示的目录中的文件
- static File[] listRoots(); 获取系统中的所有根目录
// 返回的只有名字
public static void listMethod(){
File file = new File("D:\\实训\\Demo\\src");
String[] list = file.list();
for(String s :list){
System.out.println(s);
}
}
// 返回的是目录或者文件的全路径
public static void listFilesMethod(){
File file = new File("D:\\实训\\Demo\\src");
File[] list = file.listFiles();
for(File s :list){
System.out.println(s);
}
}
// 返回的是可用的文件系统根
public static void listRootsMethod(){
File[] list = File.listRoots();
for(File s :list){
System.out.println(s);
}
}
注意:在获取指定目录下的文件或者文件夹时,必须满足以下两个条件
- 指定的目录必须存在;
- 指定的必须是目录,否则容易引发返回数组为null,出现NullPointException
11、文件过滤器
作用:过滤一个目录下的指定扩展名的文件,或者包含某个关键字的文件夹
接口FilenameFilter
- accept(File dir,String name)
public class MyFilenameFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".java");
}
}
public static void listFilenameFilterMethod(){
File file = new File("D:\\实训\\Demo\\src");
File[] files = file.listFiles(new MyFilenameFilter());
for(File s :files){
System.out.println(s);
}
}
接口FileFilter
- accept(File pathname)
public class MyFileFilter implements FileFilter {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory();
}
}
public static void listFilterMethod(){
File file = new File("D:\\实训\\Demo\\src");
File[] files = file.listFiles(new MyFileFilter());
for(File s :files){
System.out.println(s);
}
}
两者区别:
- FilenameFilter过滤器中的accept()方法接受两个参数(当前文件夹或文件所在的路径;当前文件夹或文件对象的名称)
- FileFilter过滤器中的accept()方法接受一个参数(当前文件夹或文件对象)
12、递归遍历全目录
//打印 src 目录下的所有文件:
getAllFileMethod(new File("D:\\实训\\Demo\\src"));
public static void getAllFileMethod(File dir){
File[] files = dir.listFiles();
for(File f : files){
if(f.isDirectory()){
getAllFileMethod(f);
}
System.out.println(f);
}
}