Java File 类

打印 上一主题 下一主题

主题 841|帖子 841|积分 2523

File 类是 Java 中用于处理文件和目录的基本类之一,位于 java.io 包中。它提供了多种方法来创建、删除、检查、修改文件或目录的属性,以及列出文件夹中的内容。虽然 File 类本身不提供直接的读取或写入文件内容的方法(这些操作通常由 FileInputStream, FileOutputStream, BufferedReader, BufferedWriter 等类来完成),但它为文件和目录的操作提供了强大的功能。
1. File 类的构造方法

File 类的告急构造方法有:


  • File(String pathname): 根据文件或目录的路径创建 File 对象。
  1. File file = new File("example.txt");
复制代码


  • File(String parent, String child): 根据父路径和子路径创建 File 对象。
  1. File file = new File("C:/Documents", "example.txt");
复制代码


  • File(File parent, String child): 根据父 File 对象和子路径创建 File 对象。
  1. File parentDir = new File("C:/Documents");
  2. File file = new File(parentDir, "example.txt");
复制代码
2. 文件和目录的创建与删除



  • boolean createNewFile():
如果文件不存在,则创建该文件,若文件已经存在,则不会覆盖它。返回 true 表现文件创建乐成,返回 false 表现文件已经存在。
  1. File file = new File("example.txt");
  2. if (file.createNewFile()) {    System.out.println("文件创建乐成");} else {    System.out.println("文件已存在");}
复制代码


  • boolean mkdir():
创建单一目录。如果目录已经存在,则返回 false,如果创建乐成则返回 true。
  1. File dir = new File("newDirectory");
  2. if (dir.mkdir()) {
  3.     System.out.println("目录创建成功");
  4. } else {
  5.     System.out.println("目录已存在或创建失败");
  6. }
复制代码


  • boolean mkdirs():
创建多层目录,如果父目录不存在,也会一并创建。返回 true 表现乐成,false 表现失败。
  1. File dir = new File("parentDir/childDir");
  2. if (dir.mkdirs()) {
  3.     System.out.println("多层目录创建成功");
  4. } else {
  5.     System.out.println("创建失败");
  6. }
复制代码


  • boolean delete():
删除文件或目录。如果文件/目录存在并且可以删除,则返回 true,否则返回 false。必要留意,删除操作是不可恢复的。
  1. File file = new File("example.txt");
  2. if (file.delete()) {    System.out.println("文件删除乐成");} else {    System.out.println("文件删除失败");}
复制代码
3 文件和目录的属性检查



  • boolean exists():
检查文件或目录是否存在。
  1. if (file.exists()) {
  2.     System.out.println("文件或目录存在");
  3. } else {
  4.     System.out.println("文件或目录不存在");
  5. }
复制代码


  • boolean isDirectory():
检查 File 对象是否表现目录。如果是目录返回 true,否则返回 false。
  1. if (file.isDirectory()) {
  2.     System.out.println("这是一个目录");
  3. }
复制代码


  • boolean isFile():
检查 File 对象是否表现文件。如果是文件返回 true,否则返回 false。
  1. if (file.isFile()) {
  2.     System.out.println("这是一个文件");
  3. }
复制代码


  • String getName(): 获取文件或目录的名称。
  1. String name = file.getName();
  2. System.out.println("文件名: " + name);
复制代码


  • String getPath(): 获取文件或目录的路径。
  1. String path = file.getPath();
  2. System.out.println("路径: " + path);
复制代码


  • long length(): 获取文件的字节数。对于目录,该方法返回 0。
  1. long size = file.length();
  2. System.out.println("文件大小: " + size + " 字节");
复制代码
4. 文件重定名与移动

boolean renameTo(File dest): 将当前文件重定名或移动到目的路径。如果乐成返回 true,否则返回 false。
  1. File newFile = new File("newExample.txt");
  2. if (file.renameTo(newFile)) {
  3.     System.out.println("文件重命名成功");
  4. } else {
  5.     System.out.println("文件重命名失败");
  6. }
复制代码
5. 文件权限操作



  • boolean canRead(): 判断是否可以读取文件。
  1. if (file.canRead()) {
  2.     System.out.println("文件可读");
  3. }
复制代码


  • boolean canWrite(): 判断是否可以写入文件。
  1. if (file.canWrite()) {
  2.     System.out.println("文件可写");
  3. }
复制代码


  • boolean canExecute(): 判断是否可以执行文件。
  1. if (file.canExecute()) {
  2.     System.out.println("文件可执行");
  3. }
复制代码
6. 文件列表和目录遍历



  • String[] list(): 返回一个字符串数组,包罗当前目录中的所有文件和子目录的名称。
  1. File dir = new File("C:/Documents");
  2. String[] files = dir.list();
  3. if (files != null) {
  4.     for (String filename : files) {
  5.         System.out.println(filename);
  6.     }
  7. }
复制代码


  • File[] listFiles(): 返回一个 File 数组,包罗当前目录中的所有文件和子目录。
  1. File dir = new File("C:/Documents");
  2. File[] files = dir.listFiles();
  3. if (files != null) {
  4.     for (File f : files) {
  5.         System.out.println(f.getName());
  6.     }
  7. }
复制代码
7. 常见留意事项



  • 路径分隔符:在不同的操作系统中,路径分隔符可能不同。Windows 使用反斜杠(\),而 UNIX-like 系统(如 Linux 和 macOS)使用正斜杠(/)。Java 提供了 File.separator 来获取当前操作系统的路径分隔符,避免硬编码路径分隔符。
  1. String path = "folder" + File.separator + "example.txt";
复制代码


  • 相对路径与绝对路径:File 可以使用相对路径(相对于项目根目录或当前工作目录)或绝对路径(以文件系统的根目录为起点)来表现文件或目录。
8 案例

场景
我们希望创建一个程序来处理用户上传的文件。程序会:


  • 检查文件是否存在。
  • 如果不存在,则创建一个新的文件。
  • 在文件中写入一些数据。
  • 读取文件中的数据。
  • 最后删除文件。
  1. import java.io.*;public class FileExample {    public static void main(String[] args) {        // 文件路径        File file = new File("example.txt");
  2.         // 1. 检查文件是否存在        if (file.exists()) {            System.out.println("文件已存在");        } else {            try {                // 2. 如果文件不存在,创建一个新的文件                if (file.createNewFile()) {                    System.out.println("文件创建乐成");                } else {                    System.out.println("文件创建失败");                }            } catch (IOException e) {                System.out.println("发生错误: " + e.getMessage());            }        }        // 3. 向文件写入内容        try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {            writer.write("Hello, this is a test file.");            writer.newLine();            writer.write("This file was created and written by the FileExample program.");            System.out.println("写入文件乐成");        } catch (IOException e) {            System.out.println("写入文件时发生错误: " + e.getMessage());        }        // 4. 读取文件内容        try (BufferedReader reader = new BufferedReader(new FileReader(file))) {            String line;            System.out.println("读取文件内容:");            while ((line = reader.readLine()) != null) {                System.out.println(line);            }        } catch (IOException e) {            System.out.println("读取文件时发生错误: " + e.getMessage());        }        // 5. 删除文件        if (file.delete()) {            System.out.println("文件删除乐成");        } else {            System.out.println("文件删除失败");        }    }}
复制代码
9 综合练习

练习1:创建文件夹

​ 在当前模块下的aaa文件夹中创建一个a.txt文件
代码实现:
  1. public class Test1 {
  2.     public static void main(String[] args) throws IOException {
  3.         //需求:在当前模块下的aaa文件夹中创建一个a.txt文件
  4.         //1.创建a.txt的父级路径
  5.         File file = new File("myfile\\aaa");
  6.         //2.创建父级路径
  7.         //如果aaa是存在的,那么此时创建失败的。
  8.         //如果aaa是不存在的,那么此时创建成功的。
  9.         file.mkdirs();
  10.         //3.拼接父级路径和子级路径
  11.         File src = new File(file,"a.txt");
  12.         boolean b = src.createNewFile();
  13.         if(b){
  14.             System.out.println("创建成功");
  15.         }else{
  16.             System.out.println("创建失败");
  17.         }
  18.     }
  19. }
复制代码
练习2:查找文件(不考虑子文件夹)

​ 定义一个方法找某一个文件夹中,是否有以avi末了的电影(临时不必要考虑子文件夹)
代码示例:
  1. public class Test2 {
  2.     public static void main(String[] args) {
  3.         /*需求:
  4.              定义一个方法找某一个文件夹中,是否有以avi结尾的电影。
  5.                 (暂时不需要考虑子文件夹)
  6.         */
  7.         File file = new File("D:\\aaa\\bbb");
  8.         boolean b = haveAVI(file);
  9.         System.out.println(b);
  10.     }
  11.     /*
  12.     * 作用:用来找某一个文件夹中,是否有以avi结尾的电影
  13.     * 形参:要查找的文件夹
  14.     * 返回值:查找的结果  存在true  不存在false
  15.     * */
  16.     public static boolean haveAVI(File file){// D:\\aaa
  17.         //1.进入aaa文件夹,而且要获取里面所有的内容
  18.         File[] files = file.listFiles();
  19.         //2.遍历数组获取里面的每一个元素
  20.         for (File f : files) {
  21.             //f:依次表示aaa文件夹里面每一个文件或者文件夹的路径
  22.             if(f.isFile() && f.getName().endsWith(".avi")){
  23.                 return true;
  24.             }
  25.         }
  26.         //3.如果循环结束之后还没有找到,直接返回false
  27.         return false;
  28.     }
  29. }
复制代码
练习3:(考虑子文件夹)

​ 找到电脑中所有以avi末了的电影。(必要考虑子文件夹)
代码示例:
  1. public class Test3 {
  2.     public static void main(String[] args) {
  3.         /* 需求:
  4.         找到电脑中所有以avi结尾的电影。(需要考虑子文件夹)
  5.         套路:
  6.             1,进入文件夹
  7.             2,遍历数组
  8.             3,判断
  9.             4,判断
  10.         */
  11.         findAVI();
  12.     }
  13.     public static void findAVI(){
  14.         //获取本地所有的盘符
  15.         File[] arr = File.listRoots();
  16.         for (File f : arr) {
  17.             findAVI(f);
  18.         }
  19.     }
  20.     public static void findAVI(File src){//"C:\\
  21.         //1.进入文件夹src
  22.         File[] files = src.listFiles();
  23.         //2.遍历数组,依次得到src里面每一个文件或者文件夹
  24.         if(files != null){
  25.             for (File file : files) {
  26.                 if(file.isFile()){
  27.                     //3,判断,如果是文件,就可以执行题目的业务逻辑
  28.                     String name = file.getName();
  29.                     if(name.endsWith(".avi")){
  30.                         System.out.println(file);
  31.                     }
  32.                 }else{
  33.                     //4,判断,如果是文件夹,就可以递归
  34.                     //细节:再次调用本方法的时候,参数一定要是src的次一级路径
  35.                     findAVI(file);
  36.                 }
  37.             }
  38.         }
  39.     }
  40. }
复制代码
练习4:删除多级文件夹

需求: 如果我们要删除一个有内容的文件夹
1.先删除文件夹里面所有的内容
2.再删除自己
代码示例:
  1. public class Test4 {
  2.     public static void main(String[] args) {
  3.         /*
  4.            删除一个多级文件夹
  5.            如果我们要删除一个有内容的文件夹
  6.            1.先删除文件夹里面所有的内容
  7.            2.再删除自己
  8.         */
  9.         File file = new File("D:\\aaa\\src");
  10.         delete(file);
  11.     }
  12.     /*
  13.     * 作用:删除src文件夹
  14.     * 参数:要删除的文件夹
  15.     * */
  16.     public static void delete(File src){
  17.         //1.先删除文件夹里面所有的内容
  18.         //进入src
  19.         File[] files = src.listFiles();
  20.         //遍历
  21.         for (File file : files) {
  22.             //判断,如果是文件,删除
  23.             if(file.isFile()){
  24.                 file.delete();
  25.             }else {
  26.                 //判断,如果是文件夹,就递归
  27.                 delete(file);
  28.             }
  29.         }
  30.         //2.再删除自己
  31.         src.delete();
  32.     }
  33. }
复制代码
练习5:统计巨细

​ 需求:统计一个文件夹的总巨细
代码示例:
  1. public class Test5 {
  2.     public static void main(String[] args) {
  3.        /*需求:
  4.             统计一个文件夹的总大小
  5.       */
  6.         File file = new File("D:\\aaa\\src");
  7.         long len = getLen(file);
  8.         System.out.println(len);//4919189
  9.     }
  10.     /*
  11.     * 作用:
  12.     *       统计一个文件夹的总大小
  13.     * 参数:
  14.     *       表示要统计的那个文件夹
  15.     * 返回值:
  16.     *       统计之后的结果
  17.     *
  18.     * 文件夹的总大小:
  19.     *       说白了,文件夹里面所有文件的大小
  20.     * */
  21.     public static long getLen(File src){
  22.         //1.定义变量进行累加
  23.         long len = 0;
  24.         //2.进入src文件夹
  25.         File[] files = src.listFiles();
  26.         //3.遍历数组
  27.         for (File file : files) {
  28.             //4.判断
  29.             if(file.isFile()){
  30.                 //我们就把当前文件的大小累加到len当中
  31.                 len = len + file.length();
  32.             }else{
  33.                 //判断,如果是文件夹就递归
  34.                 len = len + getLen(file);
  35.             }
  36.         }
  37.         return len;
  38.     }
  39. }
复制代码
练习6:统计文件个数

需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
打印格式如下:
txt:3个
doc:4个
jpg:6个
代码示例:
  1. public class Test6 {
  2.     public static void main(String[] args) throws IOException {
  3.         /*
  4.             需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)
  5.             打印格式如下:
  6.             txt:3个
  7.             doc:4个
  8.             jpg:6个
  9.         */
  10.         File file = new File("D:\\aaa\\src");
  11.         HashMap<String, Integer> hm = getCount(file);
  12.         System.out.println(hm);
  13.     }
  14.     /*
  15.     * 作用:
  16.     *       统计一个文件夹中每种文件的个数
  17.     * 参数:
  18.     *       要统计的那个文件夹
  19.     * 返回值:
  20.     *       用来统计map集合
  21.     *       键:后缀名 值:次数
  22.     *
  23.     *       a.txt
  24.     *       a.a.txt
  25.     *       aaa(不需要统计的)
  26.     *
  27.     *
  28.     * */
  29.     public static HashMap<String,Integer> getCount(File src){
  30.         //1.定义集合用来统计
  31.         HashMap<String,Integer> hm = new HashMap<>();
  32.         //2.进入src文件夹
  33.         File[] files = src.listFiles();
  34.         //3.遍历数组
  35.         for (File file : files) {
  36.             //4.判断,如果是文件,统计
  37.             if(file.isFile()){
  38.                 //a.txt
  39.                 String name = file.getName();
  40.                 String[] arr = name.split("\\.");
  41.                 if(arr.length >= 2){
  42.                     String endName = arr[arr.length - 1];
  43.                     if(hm.containsKey(endName)){
  44.                         //存在
  45.                         int count = hm.get(endName);
  46.                         count++;
  47.                         hm.put(endName,count);
  48.                     }else{
  49.                         //不存在
  50.                         hm.put(endName,1);
  51.                     }
  52.                 }
  53.             }else{
  54.                 //5.判断,如果是文件夹,递归
  55.                 //sonMap里面是子文件中每一种文件的个数
  56.                 HashMap<String, Integer> sonMap = getCount(file);
  57.                 //hm:  txt=1  jpg=2  doc=3
  58.                 //sonMap: txt=3 jpg=1
  59.                 //遍历sonMap把里面的值累加到hm当中
  60.                 Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
  61.                 for (Map.Entry<String, Integer> entry : entries) {
  62.                     String key = entry.getKey();
  63.                     int value = entry.getValue();
  64.                     if(hm.containsKey(key)){
  65.                         //存在
  66.                         int count = hm.get(key);
  67.                         count = count + value;
  68.                         hm.put(key,count);
  69.                     }else{
  70.                         //不存在
  71.                         hm.put(key,value);
  72.                     }
  73.                 }
  74.             }
  75.         }
  76.         return hm;
  77.     }
  78. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

冬雨财经

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表