1、IO概述
(1)要把数据持久化存储,就需要把内存中的数据存储到内存以外的其他持久化设备(硬盘、光盘、U盘等)上;
(2)当需要把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作;
(3)当把持久设备上的数据读取到内存中的这个动作称为输入(读)Input操作;
(4)我们把这种输入和输出动作称为IO操作。
2、File类的概述
(1)打开API,搜索File类。阅读其描述:File文件和目录路径名的抽象表示形式;
(2)即,Java中把文件或者目录(文件夹)都封装成File对象。也就是说如果我们要去操作硬盘上的文件,或者文件夹只要找到File这个类即可。
3、File类静态的成员变量
(1)pathSeparator
与系统有关的路径分隔符,为了方便,它被表示为一个字符串;
(2)separator
与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
(3)案例代码
1 /* 2 * java.io.File 3 * 将操作系统中的,文件,目录(文件夹),路径,封装成File对象 4 * 提供方法,操作系统中的内容 5 * File与系统无关的类 6 * 文件 file 7 * 目录 directory 8 * 路径 path 9 */ 10 public class FileDemo { 11 public static void main(String[] args) { 12 //File类静态成员变量 13 //与系统有关的路径分隔符 14 String separator = File.pathSeparator; 15 System.out.println(separator);// 是一个分号,目录的分割(window中环境变量配置各个路径用分号分割,表示一个完整的路径结束) Linux中是冒号 : 16 17 //与系统有关的默认名称分隔符 18 separator = File.separator; 19 System.out.println(separator);// 向右 目录名称分割 Linux / 20 } 21 }
3、File类的构造方法
通过构造方法创建File对象,代码演示:
1 import java.io.File; 2 3 public class FileDemo { 4 public static void main(String[] args) { 5 // File构造函数演示 6 String pathName = "d:\Java\HelloWorld.java"; 7 File f1 = new File(pathName); 8 System.out.println(f1); 9 10 File f2 = new File("d:\Java", "HelloWorld.java"); 11 System.out.println(f2); 12 13 // 将parent封装成file对象。 14 File dir = new File("d:\Java"); 15 File f3 = new File(dir, "HelloWorld.java"); 16 System.out.println(f3); 17 } 18 19 }
4、File类的获取
(1)D:Java文件夹下有一个HelloWorld.java文件;
(2)获取HelloWorld.java文件名称、文件路径(目录)等信息
1 import java.io.File; 2 3 public class FileMethodDemo { 4 public static void main(String[] args) { 5 // 创建文件对象 6 File file = new File("d:\Java\HelloWorld.java"); 7 // 获取文件的绝对路径,即全路径 8 String absPath = file.getAbsolutePath(); 9 // File中封装的路径是什么获取到的就是什么。 10 String path = file.getPath(); 11 // 获取文件名称 12 String filename = file.getName(); 13 // 获取文件大小 14 long size = file.length(); 15 16 System.out.println("absPath=" + absPath); 17 System.out.println("path=" + path); 18 System.out.println("filename=" + filename); 19 System.out.println("size=" + size); 20 } 21 }
运行结果:
5、文件和文件夹的创建删除等
(1)创建
1 public static void main(String[] args) throws IOException { 2 // 对文件或者文件加进行操作。 3 File file = new File("d:\Java\file.txt"); 4 // 创建文件,如果文件不存在,创建 true 如果文件存在,则不创建 false。 如果路径错误,IOException。 5 boolean b1 = file.createNewFile(); 6 System.out.println("b1=" + b1); 7 }
(2)删除
1 // 对文件或者文件加进行操作。 2 File file = new File("d:\Java\file.txt"); 3 // 删除文件操作,注意:不去回收站,慎用。 4 boolean b2 = file.delete(); 5 //如果file.txt存在,则输出true,不存在输出false。 6 System.out.println("b2=" + b2);
(3)判断文件是否存在
1 // 对文件或者文件加进行操作。 2 File file = new File("d:\Java\file.txt"); 3 // 需要判断文件是否存在,存在输出true,不存在输出false 4 boolean b3 = file.exists(); 5 System.out.println("b3=" + b3);
(4)对目录操作:创建
1 File dir = new File("d:\abc"); 2 // mkdir()创建单个目录。//dir.mkdirs();创建多级目录 3 boolean b4 = dir.mkdir(); 4 System.out.println("b4=" + b4);
(5)对目录操作:删除
1 //删除目录时,如果目录中有内容,无法直接删除。 2 boolean b5 = dir.delete(); 3 //只有将目录中的内容都删除后,保证该目录为空。这时这个目录才可以删除。 4 System.out.println("b5=" + b5);
(6)判断是文件还是目录
1 File f = new File("d:\Java\HelloWorld.java");// 要判断是否是文件还是目录,必须先判断存在。 2 f.mkdir();//f.createNewFile(); 3 System.out.println(f.isFile()); 4 System.out.println(f.isDirectory());
6、listFiles()方法
获取一个目录中的所有文件和文件夹。
在获取指定目录下的文件或者文件夹时必须满足下面两个条件:
(1)指定的目录必须是存在的;
(2)指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException。
1 public class FileMethodDemo3 { 2 public static void main(String[] args) { 3 File dir = new File("D:\Java"); 4 // 获取的是目录下的当前的文件以及文件夹的名称。 5 String[] names = dir.list(); 6 for (String name : names) { 7 System.out.println(name); 8 } 9 // 获取目录下当前文件以及文件对象,只要拿到了文件对象,那么就可以获取其中想要的信息 10 File[] files = dir.listFiles(); 11 for (File file : files) { 12 System.out.println(file); 13 } 14 } 15 }
7、文件过滤器
(1)通过listFiles()方法,我们可以获取到一个目录下的所有文件和文件夹,但能不能对其进行过滤呢?比如我们只想要一个目录下的指定扩展名的文件,或者包含某些关键字的文件夹呢?
(2)我们是可以先把一个目录下的所有文件和文件夹获取到,并遍历当前获取到所有内容,遍历过程中在进行筛选,但是这个动作有点麻烦,Java给我们提供相应的功能来解决这个问题;
(3)FilenameFilter
查阅File类的API,在查阅时发现File类中重载的listFiles方法,并且接受指定的过滤器。
自定类继承FilenameFilter过滤器接口:
1 import java.io.File; 2 import java.io.FilenameFilter; 3 4 //定义类实现文件名称FilenameFilter过滤器 5 class MyFileFilter implements FilenameFilter { 6 public boolean accept(File dir, String name) { 7 return name.endsWith(".java"); 8 } 9 }
测试类:
1 import java.io.File; 2 3 public class FileDemo2 { 4 public static void main(String[] args) { 5 // 获取扩展名为.java所有文件 6 // 创建File对象 7 File file = new File("D:\Java"); 8 // 获取指定扩展名的文件,由于要对所有文件进行扩展名筛选,因此调用方法需要传递过滤器 9 File[] files = file.listFiles(new MyFileFilter()); 10 // 遍历获取到的所有符合条件的文件 11 for (File f : files) { 12 System.out.println(f); 13 } 14 } 15 }
(4)FileFilter过滤器和FilenameFilter的区别
FilenameFilter过滤器中的accept方法接受两个参数,一个当前文件或文件夹所在的路径,一个是当前文件或文件夹对象的名称;
FileFilter 过滤器中的accept方法接受一个参数,这个参数就当前文件或文件夹对象;
当我们需要过滤文件名称时就可以使用FilenameFilter这个过滤器,当我们想对当前文件或文件夹进行过滤,就可以使用FileFilter ,比如需要当前目录下的所有文件夹,就可以使用FileFilter 过滤器。
自定义类继承FileFilter过滤器接口:
1 import java.io.File; 2 import java.io.FileFilter; 3 4 //文件过滤器 5 class FileFileterByDir implements FileFilter { 6 public boolean accept(File pathname) { 7 return pathname.isDirectory(); 8 } 9 }
测试类:
1 import java.io.File; 2 3 public class FileDemo3 { 4 public static void main(String[] args) { 5 // 获取扩展名为.java所有文件 6 // 创建File对象 7 File file = new File("D:\Java"); 8 // 获取指定目录下的文件夹 9 File[] files = file.listFiles(new FileFileterByDir()); 10 // 遍历获取到的所有符合条件的文件 11 for (File f : files) { 12 System.out.println(f); 13 } 14 } 15 }