因为在操作系统中,需要永久保存的数据,都是以文件的形式存在,所以要想操作这些被永久保存的数据,就首先必须在java语言中如何描述,表示文件
绝对路径:
1.绝对路径名是 完整的路径名,不需要任何其他信息就可以定位它所表示的文件
windows:E:\demo\first\a.txt
相对路径
2.相反,相对路径名必须使用取自其他路径名的信息进行解释(不完整的路径名)
windows: (e:\demo)second\a.txt
java语言中,相对路径默认相对于谁?
默认情况下,java.io包中的类总是根据 当前用户目录 来解析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。
public static void main(String[] args) { // 获取默认的相对目录 String path = System.getProperty("user.dir"); System.out.println(path); }
路径表示:
1.对于类 UNIX 平台,绝对路径名的前缀始终是 “/”。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 “/” 且名称序列为空。
绝对路径: /home/st/6379.conf
相对路径: st/a.txt
根目录: /
2.对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 “:” 组成。如果路径名是绝对路径名,还可能后跟 "\“
绝对路径: e:\st\a.txt
相对路径:没有盘符前缀 st\a.txt
件和目录路径名的抽象表示形式。
可以表示文件,也可以表示目录
File(File parent, String child) 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。 |
---|
File(String pathname) 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。 |
File(String parent, String child) 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。 |
@Test public void myTest1(){ String path = System.getProperty("user.dir"); System.out.println("path = " + path); // File (String pathname) File file = new File("D:\\app2\\a.txt"); // 在这里绝对路径是什么 // D:\workspace2\37th\java37th\15-file\a.txt File file2 = new File("a.txt"); File file1 = new File("D:\\b"); //File (String parent, Sting child) File file3 = new File("D:\\app2", "a.txt"); //File (File parent, String child) File file4 = new File(new File("D:\\app2"), "a.txt"); }
//只负责创建文件,目录路径如果不存在,会报错而不是帮你创建 public boolean createNewFile() //只负责创建目录,但只能创建单层目录,如果有多级目录不存在的话,创建失败 public boolean mkdir() //只负责创建目录,但可以创建多级目录,如果多级目录不存在,则帮你全部创建 public boolean mkdirs()
mkdir 和 mkdirs创建目录的区别:
// 重新命名此抽象路径名表示的文件 public boolean renameTo(File dest)
// 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除 // delete不会因为文件不存在,路径名不正确而抛出异常,只会返回false, 并且不会进入回收站 public boolean delete()
/* * 删除功能 * 创建日期:2022/1/14 16:27 * @return void * @author 景天 */ @Test public void myTest3(){ // // 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除 delete不会因为文件不存在,路径名不正确而抛出异常,只会返回false, 并且不会进入回收站 //public boolean delete() File file = new File("a\\b\\c\\"); System.out.println("file.delete() = " + file.delete()); }
// 判断File对象是否表示的是一个文件 public boolean isFile() //判断File对象是否表示的是一个目录 public boolean isDirectory() //判断,File对象表示的文件,是否物理存在 public boolean exists()
/* * 判断功能 * 创建日期:2022/1/14 16:33 * @return void * @author 景天 */ @Test public void myTest4(){ // // 判断File对象是否表示的是一个文件 //public boolean isFile() File file = new File("a.txt"); System.out.println("file.isFile() = " + file.isFile()); File file2 = new File("a"); System.out.println("file2.isFile() = " + file2.isFile()); 判断File对象是否表示的是一个目录 // public boolean isDirectory() System.out.println("file.isDirectory() = " + file.isDirectory()); System.out.println("file2.isDirectory() = " + file2.isDirectory()); 判断,File对象表示的文件,是否物理存在 //public boolean exists() System.out.println("file.exists() = " + file.exists()); File file1 = new File("a\\b\\c\\a.jpg"); System.out.println("file1.exists() = " + file1.exists()); }
//获取File对象表示的抽象文件的绝对路径 public String getAbsolutePath() //获取File对象表示的抽象文件,路径名字符串 public String getPath() //获取文件或者目录的名字 public String getName() //返回由此抽象路径名表示的文件的长度。不能返回文件夹的长度 //此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在,则返回 0L public long length() //返回此抽象路径名表示的文件最后一次被修改的时间。 //表示文件最后一次被修改的时间的 long 值,用与时间点(1970 年1月1日,00:00:00 GMT)之间的毫秒数表示 public long lastModified()
//返回一个字符串数组,这些字符串包括,此抽象的路径名表示的目录中的所有文件和文件夹的名字 //如果File对象表示的是一个文件,则返回null //只能获取当前目录的下一层,并不是获取所有层级 //如果是一个空目录,返回一个长度为0的数组,而不是null public String[] list() //返回指定File目录下的文件和文件夹的绝对路径形式的File对象数组 //如果File对象表示的是一个文件,则返回null //只能获取当前目录的下一层,并不是获取所有层级 //如果是一个空目录,返回一个长度为0的数组,而不是null public File[] listFiles()
list
/* * 高级获取功能 list * 创建日期:2022/1/14 17:09 * @return void * @author 景天 */ @Test public void myTest6(){ // //返回一个字符串数组,这些字符串包括,此抽象的路径名表示的目录中的所有文件和文件夹的名字 如果File对象表示的是一个文件,则返回null 只能获取当前目录的下一层,并不是获取所有层级 如果是一个空目录,返回一个长度为0的数组,而不是null //public String[] list() //File file = new File("a.txt"); //String[] list = file.list(); //System.out.println(list); File dir = new File("D:\\app2"); String[] list = dir.list(); // 遍历 并打印 System.out.println("Arrays.toString(list) = " + Arrays.toString(list)); File dir2 = new File("a\\b"); String[] list1 = dir2.list(); System.out.println("Arrays.toString(list1) = " + Arrays.toString(list1)); }
listFiles
/* * 高级获取功能 listFiles * 创建日期:2022/1/14 17:15 * @return void * @author 景天 */ @Test public void myTest7() { 返回指定File目录下的文件和文件夹的绝对路径形式的File对象数组 如果File对象表示的是一个文件,则返回null 只能获取当前目录的下一层,并不是获取所有层级 如果是一个空目录,返回一个长度为0的数组,而不是null //public File[] listFiles() File file = new File("a.txt"); File[] files = file.listFiles(); System.out.println(files); File dir = new File("D:\\app2"); File[] files1 = dir.listFiles(); System.out.println("Arrays.toString(files1) = " + Arrays.toString(files1)); File dir2 = new File("a\\b"); File[] files2 = dir2.listFiles(); System.out.println("Arrays.toString(files2) = " + Arrays.toString(files2)); }
练习1
判断某个目录(单级)下有没有a.jpg文件,有的话输出
/* * 判断某个目录(单级)下有没有a.jpg文件,有的话输出 * 创建日期:2022/1/14 17:24 * @return void * @author 景天 */ @Test public void myTest8() { // 创建File对象 File dir = new File("D:\\app2"); // 遍历 listFiles 得到File[] 数组 File[] files = dir.listFiles(); System.out.println(Arrays.toString(files)); for (File f : files) { // 逐个判断 // 判断是否是文件 if (f.isFile()) { // 如果是文件,再次判断是否是a.jpg文件 if (f.getName().endsWith("a.jpg")) { // 如果是,输出文件名字 System.out.println("找到了"); System.out.println("f = " + f.getName()); } } } }
练习2
递归输出某个目录下的所有java文件
/* * 递归输出某个目录下的所有java文件 * 创建日期:2022/1/14 17:32 * @return void * @author 景天 */ @Test public void myTest9() { // 创建File对象 File dir = new File("D:\\app2"); findAllJavaFile(dir); } private void findAllJavaFile(File dir) { // 首先把文件 目录都列出来 listFiles File[] files = dir.listFiles(); // 遍历File[] 数组 for (File f : files) { // 判断是否为文件 if (f.isFile()) { // 如果是文件.再去判断是否是.java文件 if (f.getName().endsWith(".java")) { // 如果是 ,输出绝对路径 System.out.println(f.getAbsolutePath()); } }else { //如果不是文件 // 递归,再次调用findAllJavaFile() findAllJavaFile(f); } } }
自定义获取功能是在高级获取功能的基础上,加了一个过滤器,所以高级功能的特点它都有
FileFilter是一个接口,它只有下面一个方法
//测试指定抽象路径名是否应该包含在某个路径名列表中 boolean accept(File pathname)
这个方法相当于把高级功能中listFiles()获取的File数组中File对象遍历一遍,然后逐个判断
符合条件的留下,不符合条件的干掉(丢弃)-
常用匿名内部类来做实现
练习:
输出某个目录(单级)下的所有java文件,使用过滤器
手写自定义类的方式去做
class MyFilter implements FileFilter{ @Override public boolean accept(File pathname) { return pathname.getName().endsWith(".java"); } } @Test public void myTest10(){ // 输出某个单级目录下的java文件 File dir = new File("D:\\app2"); File[] files = dir.listFiles(new MyFilter()); System.out.println("Arrays.toString(files) = " + Arrays.toString(files)); }
匿名内部类方式
@Test public void myTest11(){ // 匿名内部类方式 // 输出某个单级目录下的java文件 File dir = new File("D:\\app2"); File[] files = dir.listFiles(new FileFilter() { @Override public boolean accept(File pathname) { return pathname.getName().endsWith(".java"); } }); System.out.println("Arrays.toString(files) = " + Arrays.toString(files)); }