Java-File

10 篇文章 0 订阅
9 篇文章 0 订阅

1 File概述

1.1 为什么要学习File类?

因为在操作系统中,(内存,RAM , SRAM DRAM) 需要永久保存的数据,都是以文件的形式存在,所以要想操作这些被永久保存的数据,就首先必须在java语言中如何描述,表示文件

1.2 相对路径与绝对路径

image-20221014163430331绝对路径:

  • 绝对路径名是 完整的路径名,不需要任何其他信息就可以定位它所表示的文件

  • windows:E:\demo\first\a.txt
    相对路径

  • 相反,相对路径名必须使用取自其他路径名的信息进行解释(不完整的路径名)

  • windows: (e:\demo)second\a.txt
    java语言中,相对路径默认相对于谁?

  • 默认情况下,java.io包中的类总是根据 当前用户目录 来解析相对路径名。此目录由系统属性 user.dir 指定,通常是 Java 虚拟机的调用目录。

System.out.println(System.getProperty("user.dir"));
public class Demo {
    public static void main(String[] args) {
        // 获取相对路径
        System.out.println(System.getProperty("user.dir"));
        // D:\wangdao_Java55\55th-homework

        String path = "D:\\wangdao_Java55\\55th-homework";
        //..是当前文件夹的上一级目录
        String path2 = "..\\a.txt";

        // 绝对路径
        String path3 = "D:\\wangdao_Java55\\55th-homework\\a.txt";
        
        //相对路径
        String path4 = "55th-homework\\a.txt";
    }
}

1.3 不同系统的路径表示

对于类 UNIX 平台,绝对路径名的前缀始终是 “/”。相对路径名没有前缀。表示根目录的绝对路径名的前缀为 “/” 且名称序列为空。

  • 绝对路径: /home/st/6379.conf
  • 相对路径: st/a.txt
  • 根目录: /

对于 Microsoft Windows 平台,包含盘符的路径名前缀由驱动器号和一个 “:” 组成。如果路径名是绝对路径名,还可能后跟 "\“

  • 绝对路径: e:\st\a.txt
  • 相对路径:没有盘符前缀 st\a.txt

2 File类

文件和目录路径名的抽象表示形式

2.1 构造方法

File (String pathname)
File (String parent, Sting child)
File (File parent, String child)
public class Demo {
    public static void main(String[] args) {
        // File (String pathname)
        File file1 = new File("D:\\test\\a.txt");
        // //判断,File对象表示的文件,是否物理存在
        //public boolean exists()
        System.out.println(file1.exists());

        File file2 = new File("D:\\test\\b.txt");
        System.out.println(file2.exists());

        File dir = new File("D:\\test");
        System.out.println(dir.exists());

        // File (String parent, Sting child)
        File file3 = new File("D:\\test", "JAVA.png");
        System.out.println(file3.exists());

        // File (File parent, String child)
        File file4 = new File(new File("D:\\test"), "a.txt");
        System.out.println(file4.exists());
    }
}

2.2 成员方法

2.2.1 创建功能

//只负责创建文件,目录路径如果不存在,会报错而不是帮你创建
public boolean createNewFile() 

//只负责创建目录,但只能创建单层目录,如果有多级目录不存在的话,创建失败
public boolean mkdir()
    
//只负责创建目录,但可以创建多级目录,如果多级目录不存在,则帮你全部创建
public boolean mkdirs()

mkdir 和 mkdirs创建目录的区别:

  • mkdir仅能在已经存在的目录下,创建新的目录
  • mkdirs 当要创建的目标目录,如果目标目录的父目录不存在的时候,它会将不存在的目标目录的父目录 连同目标目录一起,都创建好
//创建功能
public class Demo {
    public static void main(String[] args) throws IOException {
        // //只负责创建文件,目录路径如果不存在,会报错而不是帮你创建
        // public boolean createNewFile()
        File file = new File("a.txt");
        System.out.println(file.createNewFile());

        //
        // // java.io.IOException: 系统找不到指定的路径。
        // File file2 = new File("aa\\bb\\a.txt");
        // System.out.println(file2.createNewFile());
        //
        //
        // //只负责创建目录,但只能创建单层目录,如果有多级目录不存在的话,创建失败
        // // public boolean mkdir()
        File dir = new File("aa");
        System.out.println(dir.mkdir());
        //
        // File dir2 = new File("aa\\bb\\cc");
        // System.out.println(dir2.mkdir());


        // // //只负责创建目录,但可以创建多级目录,如果多级目录不存在,则帮你全部创建
        // // public boolean mkdirs()
        File dir2 = new File("aa\\bb\\cc");
        System.out.println(dir2.mkdirs());
    }
}

2.2.2 重命名功能

// 重新命名此抽象路径名表示的文件
public boolean renameTo(File dest)
  • 在源文件,和修改之后的目标文件在同一目录的时候:

    • 效果只是重命名
  • 当源文件和,修改之后的目标文件当不在同一目录的时候:

    • 移动文件
    • 重命名
public class Demo2 {
    public static void main(String[] args) {
        // 重新命名此抽象路径名表示的文件
        // public boolean renameTo(File dest)

        // File file = new File("aa\\bb\\cc\\a.txt");
        // System.out.println(file.exists());
        // System.out.println(file.renameTo(new File("aa\\bb\\cc\\b.txt")));

        File file = new File("aa\\bb\\cc\\b.txt");
        System.out.println(file.renameTo(new File("aa\\bb\\a.txt")));
    }

}

2.2.3 删除功能

// 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除
// delete不会因为文件不存在,路径名不正确而抛出异常,只会返回false, 并且不会进入回收站
public boolean delete()
/**
 * @package: _01code._02file._03api
 * @description:
 * @author: Yunyang
 * @date: 2023/10/31  21:37
 * @version:1.0
 **/
public class Demo3 {
    public static void main(String[] args) {
        // // 删除此抽象路径名表示的文件或目录。如果此路径名表示一个目录,则该目录必须为空才能删除
        // // delete不会因为文件不存在,路径名不正确而抛出异常,只会返回false, 并且不会进入回收站
        // public boolean delete()
        File file = new File("aa\\bb\\a.txt");
        System.out.println(file.delete());

        File dir = new File("aa\\bb\\cc");
        System.out.println(dir.delete());
    }
}

2.2.4 判断功能

// 判断File对象是否表示的是一个文件
public boolean isFile()

//判断File对象是否表示的是一个目录
 public boolean isDirectory() 

//判断,File对象表示的文件,是否物理存在
public boolean exists() 
public class Demo4 {
    public static void main(String[] args) {
        // // 判断File对象是否表示的是一个文件
        // public boolean isFile()
        File file = new File("aa\\bb");
        System.out.println(file.isFile());


        // //判断File对象是否表示的是一个目录
        // public boolean isDirectory()
        System.out.println(file.isDirectory());

        // //判断File对象表示的文件,是否物理存在
        // public boolean exists()
        File file1 = new File("aa\\bb\\cc");
        System.out.println(file1.exists());
    }
}

2.2.5 基本获取功能

//获取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()
/**
 * @package: _01code._02file._03api
 * @description:
 * @author: Yunyang
 * @date: 2023/10/31  21:49
 * @version:1.0
 **/
public class Demo5 {
    public static void main(String[] args) {
        File file = new File("a.txt");
        // //获取File对象表示的抽象文件的绝对路径
        // public String getAbsolutePath()
        System.out.println(file.getAbsoluteFile());
        // D:\wangdao_Java55\55th-homework\a.txt


        // //获取File对象表示的抽象文件,路径名字符串
        // public String getPath()
        System.out.println(file.getPath());
        // a.txt


        // //获取文件或者目录的名字
        // public String getName()
        System.out.println(file.getName());
        // a.txt


        // //返回由此抽象路径名表示的文件的长度。不能返回文件夹的长度
        // //此抽象路径名表示的文件的长度,以字节为单位;如果文件不存在,则返回 0L
        // public long length()
        System.out.println(file.length());
        // 9

        // //返回此抽象路径名表示的文件最后一次被修改的时间。
        // //表示文件最后一次被修改的时间的 long 值,用与时间点(1970 年1月1日,00:00:00 GMT)之间的毫秒数表示
        // public long lastModified()
        System.out.println(file.lastModified());
        // 1698760501194
    }
}

2.2.6 高级获取功能

//返回一个字符串数组,这些字符串包括,此抽象的路径名表示的目录中的所有文件和文件夹的名字
//如果File对象表示的是一个文件,则返回null
//只能获取当前目录的下一层,并不是获取所有层级
//如果是一个空目录,返回一个长度为0的数组,而不是null  []
public String[] list() 
        
//返回指定File目录下的文件和文件夹的绝对路径形式的File对象数组
//如果File对象表示的是一个文件,则返回null
//只能获取当前目录的下一层,并不是获取所有层级
//如果是一个空目录,返回一个长度为0的数组,而不是null
public File[] listFiles()
/**
 * @package: _01code._02file._03api
 * @description:
 * @author: Yunyang
 * @date: 2023/10/31  21:58
 * @version:1.0
 **/
public class Demo6 {
    public static void main(String[] args) {
        File dir = new File("D:\\test");
        //返回一个字符串数组,这些字符串包括,此抽象的路径名表示的目录中的所有文件和文件夹的名字
        //如果File对象表示的是一个文件,则返回null
        //只能获取当前目录的下一层,并不是获取所有层级
        //如果是一个空目录,返回一个长度为0的数组,而不是null  []
        // public String[] list()
        String[] strs = dir.list();
        System.out.println(Arrays.toString(strs));
        // [a.md, a.txt, b.txt, JAVA.png]
        File file = new File("D:\\test\\a.txt");
        String[] strs2 = file.list();
        System.out.println(Arrays.toString(strs2));
        // null


        //返回指定File目录下的文件和文件夹的绝对路径形式的File对象数组
        //如果File对象表示的是一个文件,则返回null
        //只能获取当前目录的下一层,并不是获取所有层级
        //如果是一个空目录,返回一个长度为0的数组,而不是null
        // public File[] listFiles()
        File[] files = dir.listFiles();
        System.out.println(Arrays.toString(files));
        // [D:\test\a.md, D:\test\a.txt, D:\test\b.txt, D:\test\JAVA.png]
    }
}

2.2.7 练习

/**
 * @package: _01code._02file._03api
 * @description:
 * @author: Yunyang
 * @date: 2023/10/31  22:09
 * @version:1.0
 **/
/*
* 练习1
判断某个目录(单级)下有没有a.jpg文件,有的话输出
*/
public class Ex {
    public static void main(String[] args) {
        File dir = new File("D:\\test");
        //把该目录下所有东西都列出来
        // listFiles()--->File[];
        File[] files = dir.listFiles();
        // 遍历数组
        for (File file : files) {
            // 判断file对象是否为文件
            if(file.isFile()){
                //获取文件名字 判断名字是不是需要的
                String fileName = file.getName();
                //如果找到了 输出
                if(fileName.equals("a.jpg")){
                    System.out.println(file.getAbsoluteFile());
                }


            }
        }

    }
}
/*
练习2
递归输出某个目录下的所有java文件
 */
public class Ex2 {
    public static void main(String[] args) {
        //确定目标目录
        File dir = new File("D:\\test");
        getAllJavaFile(dir);
    }

    private static void getAllJavaFile(File dir) {

        // 把该目录下的东西都列出来
        // listFile()--->File[]
        File[] files = dir.listFiles();
        // 遍历File数组
        for (File file : files) {
            // 判断是不是文件
            if(file.isFile()){

                // 如果是,再判断是不是以.java结尾
                String fileName = file.getName();
                if(fileName.endsWith(".java")){
                    System.out.println(file.getAbsoluteFile());
                }

            }else {
                // 如果不是 是文件夹
                // 递归调用
                getAllJavaFile(file);


            }

        }
    }
}

3 文件过滤器

  • 自定义获取功能是在高级获取功能的基础上,加了一个过滤器,所以高级功能的特点它都有

  • FileFilter是一个接口,它只有下面一个方法

//测试指定抽象路径名是否应该包含在某个路径名列表中
boolean accept(File pathname)
  • 这个方法相当于把高级功能中listFiles()获取的File数组中File对象遍历一遍,然后逐个判断

  • 符合条件的留下,不符合条件的干掉(丢弃)

  • 常用匿名内部类来做实现

/*
练习:
输出某个目录(单级)下的所有java文件,使用过滤器.

3种方式实现
匿名对象
匿名内部类
lambda表达式
 */
public class Ex3 {
    public static void main(String[] args) {
        // 确定目的目录
        File dir = new File("D:\\test");
        // 使用带文件过滤器的listFiles方法
        // listFiles(FileFilter fileDilter)


        // 使用接口实现类
        // File[] files = dir.listFiles(new MyFileFilter());
        // System.out.println(Arrays.toString(files));

        // 使用匿名内部类
        // File[] files = dir.listFiles(new FileFilter() {
        //     @Override
        //     public boolean accept(File pathname) {
        //         return pathname.getName().endsWith(".java");
        //     }
        // });
        // System.out.println(Arrays.toString(files));

        // 使用lambda表达式
        File[] files = dir.listFiles(pathname -> pathname.getName().endsWith(".java"));
        System.out.println(Arrays.toString(files));

    }
}
// 自定义文件过滤器类,实现FileFilter接口
class MyFileFilter implements FileFilter{

    @Override
    public boolean accept(File pathname) {
        return pathname.getName().endsWith(".java");
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
java-diff-utils是一个用于计算和应用文本文件之间差异的Java库。它提供了一组算法和工具,可以比较两个文本文件并生成差异结果。这些差异结果可以用于生成补丁文件,也可以直接应用于原始文件以生成目标文件。 以下是java-diff-utils的一些主要功能和用法示例: 1. 比较两个文本文件的差异: ```java import difflib.DiffUtils; import difflib.Patch; import java.io.File; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.List; public class DiffExample { public static void main(String[] args) throws IOException { File originalFile = new File("path/to/original/file.txt"); File modifiedFile = new File("path/to/modified/file.txt"); List<String> originalLines = Files.readAllLines(originalFile.toPath(), StandardCharsets.UTF_8); List<String> modifiedLines = Files.readAllLines(modifiedFile.toPath(), StandardCharsets.UTF_8); Patch<String> patch = DiffUtils.diff(originalLines, modifiedLines); for (String line : patch.getDeltas()) { System.out.println(line); } } } ``` 2. 生成补丁文件: ```java import difflib.DiffUtils; import difflib.Patch; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.util.List; public class PatchExample { public static void main(String[] args) throws IOException { File originalFile = new File("path/to/original/file.txt"); File modifiedFile = new File("path/to/modified/file.txt"); File patchFile = new File("path/to/patch/file.patch"); List<String> originalLines = Files.readAllLines(originalFile.toPath(), StandardCharsets.UTF_8); List<String> modifiedLines = Files.readAllLines(modifiedFile.toPath(), StandardCharsets.UTF_8); Patch<String> patch = DiffUtils.diff(originalLines, modifiedLines); FileWriter writer = new FileWriter(patchFile); patch.toUnifiedDiff().forEach(line -> { try { writer.write(line + "\n"); } catch (IOException e) { e.printStackTrace(); } }); writer.close(); } } ``` 请注意,上述示例中的文件路径需要根据实际情况进行替换。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值