Java开发从入门到精通(二十):Java的面向对象编程OOP:File文件操作的增删改查

本文详细介绍了Java中文件操作的基础,包括File类的使用、IO流的概念、创建、删除、遍历文件夹、递归方法的应用实例,如计算阶乘、猴子吃桃问题和目录搜索/删除等。
摘要由CSDN通过智能技术生成

(一)Java的文件操作

1.1 Java的File和IO流概念

目前我们所讲的存储数据的方案都是没有保存的数据
在这里插入图片描述

想要长久保存数据
在这里插入图片描述
java提供了File类来操作文件

  • File是java.io.包下的类, File类的对象,用于代表当前操作系统的文件(可以是文件、或文件夹)
  • 提供了多种操作文件的方法 创建 删除 修改等等…

在这里插入图片描述
注意:File类只能对文件本身进行操作,不能读写文件里面存储的数据

IO流
由于File类只能对文件本身进行操作,不能读写文件里面存储的数据,所以java提供了IO流用于读写数据的(可以读写文件,或网络中的数据…)

在这里插入图片描述

1.2 File类的使用

1.2.1 创建File类的对象

在这里插入图片描述

三种不同的系统路径分隔符写法

  • 1.正斜杠/写法(推荐)
  • 2.反斜杠写法 需要添加转义字符\,防止类似\n被转换成换行符
  • 3.函数File.separator 获取系统指定的分隔符
        File f1 = new File("D:/resource/ab.txt");
        File f2 = new File("D:\\resourcellab.txt");
        File f3 = new File( "D:"+ File.separator +"resource" + File.separator + "ab.txt");

绝对路径:是一个完整的、明确指定文件或目录位置的路径,从根目录开始,包含了所有所需的目录层次结构
示例:/C:/path/to/file.txt 中,/C:/表示根目录,path/to/是后续的目录层次,最后指定了具体的文件file.txt。
相对路径:相对于当前工作目录或其他特定基准目录的路径,不包含从根目录开始的完整路径信息
示例:在/project目录下,subdirectory/file.txt就是相对路径

// 绝对路径:带盘符的
        File f6 = new File("D:\\codelljavasepromax|lfile-io-appl\\src itheima.txt");
        // 相对路径(重点):不带盘符,默认是直接去工程下寻找文件的。
        File f7 = new File( "file-io-applsrcllitheima.txt");
        System.out.println(f4.length());

最后创建File类的示例代码如下:

import java.io.File;

public class FileTest {
    public static void main(String[] args) {
        // 1、创建一个File对象,指代某个具体的文件。
        // 路径分隔符
        File f1 = new File("D:/resource/ab.txt");
        File f2 = new File("D:\\resourcellab.txt");
        File f3 = new File( "D:"+ File.separator +"resource" + File.separator + "ab.txt");
        System.out.println(f1.length());//文件大小

        //File对象可以指代一个目录
        File f4 = new File("D:/resource"); //只是目录文件夹本身,不包含目录里的其他文件
        System.out.println(f2.length());

        // 注意:File对象可以指代一个不存在的文件路径
        File f5 =new File("D:/resource/aaaa.txt");
        System.out.println(f3.length());
        System.out.println(f3.exists());//false

        // 我现在要定位的文件是在模块中,应该怎么定位呢?
        // 绝对路径:带盘符的
        File f6 = new File("D:\\codelljavasepromax|lfile-io-appl\\src itheima.txt");
        // 相对路径(重点):不带盘符,默认是直接去工程下寻找文件的。
        File f7 = new File( "file-io-applsrcllitheima.txt");
        System.out.println(f4.length());
    }
}

1.2.2 常用方法1:判断文件类型、获取文件信息

  • File提供的判断文件类型、获取文件信息功能

在这里插入图片描述

import java.io.File;
import java.text.SimpleDateFormat;

public class FileTest {
    public static void main(String[] args) {
        // 1.创建文件对象,指代某个文件
        File f1 = new File( "D:/resource/ab.txt");

        // 2、public boolean exists():判断当前文件对象,对应的文件路径是否存在,存在返回true.
        System.out.println(f1.exists());

        // 3、public boolean isFile(): 判断当前文件对象指代的是否是文件,是文件返回true,反之。
        System.out.println(f1.isFile());

        // 4、public boolean isDirectory() : 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之。
        System.out.println(f1.isDirectory());

        // 5.public string getName():获取文件的名称(包含后缀)
        System.out.println(f1.getName());

        // 6.public long length():获取文件的大小,返回字节个数
        System.out.println(f1.length());

        // 7.public long lastModified():获取文件的最后修改时间。
        System.out.println(f1.lastModified());
        long time = f1.lastModified();

        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
        System.out.println(sdf.format(time));

        // 8.public String getPath():获取创建文件对象时,使用的路径
        File f2 = new File( "D:\\resource\\ab.txt");
        File f3 = new File( "file-io-app\\src\\itheima.txt");
        System.out.println(f2.getPath());
        System.out.println(f3.getPath());

        // 9.public String getAbsolutePath():获取绝对路径
        System.out.println(f1.getAbsolutePath());
        System.out.println(f2.getAbsolutePath());
        System.out.println(f3.getAbsolutePath());
    }
}

1.2.3 常用方法2:创建文件、删除文件

  • File类创建文件的功能

在这里插入图片描述

  • File类删除文件的功能

在这里插入图片描述

**注意:delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站**

  • 创建和删除文件方法代码示例
import java.io.File;
import java.io.IOException;

public class FileTest {
    public static void main(String[] args) throws Exception {  //alt+回车键抛出异常
        // 1、public boolean createNewFile():创建一个新文件(文件内容为空),创建成功返回true,反之。
        File f1 = new File( "D:/resource/itheima2.txt");
        System.out.println(f1.createNewFile());  //目录存在就会创建失败,不存在则创建成功  

        // 2、public boolean mkdir():用于创建文件夹,注意:只能创建一级文件夹
        File f2 = new File( "D:/resource/aaa");
        System.out.println(f2.mkdir());

        // 3、public boolean mkdirs():用于创建文件夹,注意:可以创建多级文件夹
        File f3 = new File( "D:/resource/bbb/ccc/ddd/eee/fff/ggg");
        System.out.println(f3.mkdirs());

        // 4、public boolean delete():删除文件,或者空文件,注意:不能删除非空文件夹。
        System.out.println(f1.delete());
        System.out.println(f2.delete());
        File f4= new File( "D:/resource");
        System.out.println(f4.delete()); //false 不能删除非空文件夹
    }
}

1.2.4 常用方法3:遍历文件夹

  • File类提供的遍历文件夹的功能

在这里插入图片描述

  • 遍历文件夹方法代码示例
import java.io.File;

public class FileTest {
    public static void main(String[] args)  {
        // 1、public string[] list():获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。
        File f1 = new File( "D:/python27");
        String[] names = f1.list();
        for(String name :names) {
            System.out.println(name);
        }

        // 2、public File[] listFiles():(重点)获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)
        File[] files = f1.listFiles();
        for (File file :files) {
            System.out.println(file.getAbsolutePath());
        }
    }
}

使用listFiles方法时的注意事项

  • 当主调是文件,或者路径不存在时,返回null
  • 当主调是空文件夹时,这回一个长度为0的数组
  • 当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹的路径放在File数组中返回
  • 当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
  • 当主调是一个文件夹,但是没有权限访问该文件夹时,返回null
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;

public class FileTest {
    public static void main(String[] args)  {
		// 当主调是文件返回null
        File f= new File( "D:/resource/ab.txt");
        File[] files = f.listFiles();
        System.out.println(files);
        
		//当主调是路径不存在时,返回null
        File f1 = new File( "D:/resource1");
        File[] files1 = f.listFiles();
        System.out.println(files1);
        
		// 当主调是空文件夹时,返回一个长度为0的数组
        File f2 = new File( "D:/resource/aaa");
        File[] files2 = f.listFiles();
        System.out.println(Arrays.toString(files2));     
    }
}
null
null
[]

1.3 java File的方法递归

1.3.1 什么是方法递归

  • 算法递归是一种在程序设计语言中广泛应用
  • 从形式上说:方法调用自身的形式称为方法递归(recursion)

递归的形式

  • 直接递归:方法自己调用自己。
  • 间接递归:方法调用其他方法,其他方法又回调方法自己

使用方法递归时需要注意的问题:

  • 递归如果没有控制好终止,会出现递归死循环,导致栈内存溢出错误
public class FileTest {
    public static void main(String[] args)  {
        // 目标:改变某个文件夹下视频的序号,要求从19开始。
       test1();  //出现栈溢出的StackOverflowError错误
    }
    // 直接方法递归
    public static void test1(){
        System.out.println("----test1---");
        test1();// 直接方法递归  
    }
    // 间接方法递归
    public static void test2(){
        System.out.println("---test2---");
        test3();
    }
    public static void test3(){
        test2();// 间接递归
    }
}

在这里插入图片描述

1.3.1 方法递归的案列

1.3.1.1 案例导学-计算n的阶乘

需求

  • 计算n的阶乘,5的阶乘=1*2*3*4*5;6的阶乘=1*2*3*4*5*6

分析

  • 假如我们认为存在一个公式是f(n)=1*2*3*4*5*6*7*…(n-1)*n;
  • 那么公式等价形式就是:f(n)=f(n-1)*n
  • 如果求的是 1-5的阶乘 的结果,我们手工应该应该如何应用上述公式计算。
    f(5)= f(4) *5
    f(4)= f(3) *4
    f(3)= f(2) *3
    f(2)= f(1) *2
    f(1)= 1
public class FileTest {
    public static void main(String[] args)  {
        // 目标:改变某个文件夹下视频的序号,要求从19开始。
        System.out.println(f(5));
    }
    public static int f(int n) {
        // 终结点
        if (n == 1) {
            return 1;
        } else {
            return f(n - 1) * n;
        }
    }
}
120

递归求阶乘的执行流程
在这里插入图片描述

1.3.1.2 递归算法三要素
  • 递归的公式:f(n)= f(n-1)*n;
  • 递归的终结点:f(1)
  • 递归的方向必须走向终结点:
    f(5)= f(4)*5
    f(4)= f(3)4
    f(3)= f(2)
    3
    f(2)= f(1)*2
    f(1)= 1
1.3.1.3 猴子吃桃问题
  • 猴子第一天摘下若干桃子,当即吃了一半,觉得好不过瘾,于是又多吃了一个
  • 第二天又吃了前天剩余桃子数量的一半,觉得好不过瘾,于是又多吃了一个
  • 以后每天都是吃前天剩余桃子数量的一半,觉得好不过瘾,又多吃了一个
  • 等到第10天的时候发现桃子只有1个了

需求:

  • 请问猴子第一天摘了多少个桃子?
public class FileTest {
    public static void main(String[] args)  {
        // 目标:猴子吃桃问题
        // f(10) = 1  终结点
        // 公式: f(x) - f(x)/2-1 = f(x + 1)
        // 变形:2f(x) - f(x) - 2 = 2f(x+1)
        // 变形2:f(x)= 2 * f(x +1) + 2
        // 求f(1)=?
        System.out.println(f(1));
        System.out.println(f(2));
        System.out.println(f(3));
    }
    public static int f(int x) {
        if (x == 10) {
            return 1;
        } else {
            return 2 * f(x + 1) + 2;
        }
    }
}
1534
766
382
1.3.1.4 递归查询目录下的指定文件
import java.io.File;

public class FileTest {
    public static void main(String[] args) throws Exception {
        System.out.println("开始搜索文件...");
        searchFile(new File("D:/"),"python2.exe");
        System.out.println("搜索结束...");
    }
    
    /**
     * 去目录下搜索某个文件
     * @param dir 目录
     * @param fileName 要搜索的文件名称
     */
     
    public static void searchFile(File dir, String fileName) throws Exception {
        System.out.println("正在搜索目录:" + dir.getAbsolutePath());

        // 1、把非法的情况都拦截住
        if(dir == null || !dir.exists() || dir.isFile()){
            System.out.println("无法搜索,目录无效");
            return;// 代表无法搜索
        }

        // 2、dir 不是 null, 存在,一定是目录对象。
        // 获取当前目录下的全部一级文件对象。
        File[] files = dir.listFiles();
        System.out.println("找到 " + files.length + " 个一级文件");

        // 3、判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象。
        if(files != null && files.length >0) {
            // 4、遍历全部一级文件对象。
            for (File f : files) {
                //5、判断文件是否是文件,还是文件夹
                if (f.isFile()) {
                    // 是文件,判断这个文件名是否是我们要找的
                    if (f.getName().contains(fileName)) {
                        System.out.println("找到了:" + f.getAbsolutePath());
                        Runtime runtime =Runtime.getRuntime();
                        runtime.exec(f.getAbsolutePath());
                    } else {
                        // 是文件夹,继续重复这个过程(递归)
                        System.out.println("正在搜索子目录:" + f.getAbsolutePath());
                        searchFile(f, fileName);
                    }
                }
            }
        }
    }
}


1.3.1.5 递归删除目录下的非空文件
import java.io.File;

public class FileTest1 {
    public static void main(String[] args) {
        // 目标:删除非空文件夹。独立功能独立成方法。
        File dir = new File("D:\\resource");
        deleteDir(dir);
    }

    public static void deleteDir(File dir){
        if (dir == null || !dir.exists()){
            return;
        }

        if (dir.isFile()){
            dir.delete();
        }

        // 1、dir存在且是文件夹。拿里面的一级文件对象
        File[] files = dir.listFiles();
        if (files ==null){
            return;
        }

        if(files.length ==0){
            dir.delete();
            return;
        }
        // 2、这是一个有内容的文件夹 ,干掉里面的内容,再干掉自己。
        for (File file : files) {
            if(file.isFile()){
                dir.delete();
            }else {
                deleteDir(file);
            }
        }
        dir.delete();
    }
}
1.3.1.6 啤酒问题
  • 啤酒2元一瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元可以喝多少瓶?
public class FileTest2 {

    private static int totalNumber;
    private static int lastCoverNumber;
    private static int lastBottleNumber;
    
    public static void main(String[] args) {
        // 啤酒问题:啤酒2元一瓶,4个盖子可以换一瓶,2个空瓶可以换一瓶,请问10元可以喝多少瓶?
        buy(10);
    }
    private static void buy(int money){
        // 1、先买了再说
        int buyNumber =money/2;
        totalNumber += buyNumber;
        
        // 2、把盖子和瓶子换算成钱继续买// 计算本轮总的盖子和瓶子数
        int allBottleNumber =buyNumber +lastBottleNumber;
        int allCoverNumber =buyNumber+lastCoverNumber;
        int allMoney =0;
        
        if(allBottleNumber >= 2) {
            allMoney += (allBottleNumber / 2) * 2;
        }
        
        lastBottleNumber = allBottleNumber % 2;
        
        if(allCoverNumber>=4) {
            allMoney += (allCoverNumber / 4) * 2;
        }
        
        lastCoverNumber = allCoverNumber%4;
        
        if(allMoney >=2){
            buy(allMoney);
        }
    }
}
总数:15
剩余盖子数:3
剩余瓶子数:1

1.4 简单文件操作的案例

目标:
改变某个文件夹下视频的序号,要求从19开始。

在这里插入图片描述

import java.io.File;

public class FileTest {
    public static void main(String[] args)  {
        // 目标:改变某个文件夹下视频的序号,要求从19开始。
        File dir = new File( "E:\\磊哥面授-黄埔一期\\Java从入门至大牛课程\\day02-面向对象高级部分\\视频");
        //1、拿到下面全部的视频,一级文件对象
        File[] videos = dir.listFiles();
        // 2、一个一个的找
        for(File video: videos) {
            //3、拿到它的名字,改成新名字
            String name = video.getName();// name =“10、多态、继承....10
            String index = name.substring(0, name.indexOf("、"));
            String lastName = name.substring(name.indexOf("、"));
            String newName = (Integer.valueOf(index) + 18) + lastName;
            // 4、正式改名
            video.renameTo(new File(dir, newName));
        }
    }
}
  • 52
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HACKNOE

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值