【文件IO的简单实现】

(点击跳转即可哦)

java学习专栏

LeetCode刷题专栏


文件IO实例

复习

  1. 关于文件管理信息——File对象:文件系统树的遍历、增、删、改、查
  2. 输入、输出的模型

InputStream 读取数据流的设备。将输入设备抽象成数据流的源头

  1. 数据被抽象成流式(Stream)的形式
  2. 需要右内存空间,存放读取到的数据:一个变量的空间 或者一个数组的空间
  3. EOS : 表示数据已经被读完。 VS 本次暂时没有读到数据
  4. 可以将InputStream 接上其他的数据处理对象

OutputStream 将内存中的数据,通过写入数据流的设备,最终将数据写到输出设备中。

  1. 写的时候,为了同步内存和输出设备之间的写入速度差,一般是存在缓冲区(buffer)的。减少写的频次,提高写的速度
  2. 所以冲刷缓冲区(flush) 的 操作非常重要
  1. 字符集(ASCII 和 Unicode) 和字符集编码(ASCII、GBK、UTF-8)

1 给定路径,查找文件名中 包含指定的字符的文件列表,并根据用户的选择,决定是否删除

思路:

  1. 从一个树的根开始,遍历整颗树
  2. 将每个结点的名字 匹配 查找条件
  3. 如果符合条件,就保存File对象
  4. 遍历完成后,得到一组符合条件的File对象
  5. 一次询问用户,这些对象的下一步处理对象
package com.djl.io;
/**
 * 扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要
 * 删除该文件
 */

import java.io.File;
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;

public class Test1 {
    public static void main(String[] args) throws Exception{
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入要扫描的目录:");
        String dir = sc.nextLine();
        File file = new File(dir);
        if(!file.isDirectory()){
            System.out.println("要扫描的路径不是目录或者不存在");
            return;
        }
        System.out.println("请输入文件名要包含的字符:");
        String fileName = sc.nextLine();
        Deque<File> list = new ArrayDeque<>();
        //这个方法会把符合条件的文件路径存储到list中
        findFile(file,fileName,list);
        while (!list.isEmpty()){
            File file1 = list.poll();
            System.out.println("是否删除" + file1.getAbsolutePath() + "  y/n");
            String pd = sc.nextLine();
            if(pd.toLowerCase().equals("y")){
                file1.delete();
                System.out.println("删除成功");
            }
        }
    }

    private static void findFile(File file, String fileName, Deque<File> list) throws Exception{
        File[] files = file.listFiles();
        if(files == null || files.length == 0){
            return;
        }
        for(File f : files){
            if(f.isDirectory()){
                findFile(f,fileName,list);
            }else {
                String name = f.getName();
                if(name.contains(fileName)){
                    list.offer(f);
                }
            }
        }
    }
}

2 一个文件的复制

给定两个路径:源文件路径(必须存在)、目标路径(必须不存在 && 目录存在)

源文件 必须是普通文件,不是目录文件

思路:

  1. 由于只是进行复制,所以根本不考虑文件的内容具体是什么
  2. 所以我们要做的是:遍历(从源文件中读取数据,写入目标文件)直到所有的数据全部写完
package com.djl.io;


import java.io.*;
//文件的复制
public class Test2 {
    public static void main(String[] args) throws Exception{
        File oldFile = new File("D:/简历/Java开发工程师简历.docx");
        File newFile = new File("D:/简历/2/简历.docx");
        //统计复制需要的时间
        long sta = System.currentTimeMillis();
        //准备好的桶
        byte[] bur = new byte[1024];
        int count = 0;
        try (InputStream is = new FileInputStream(oldFile)){
            try(OutputStream os = new FileOutputStream(newFile)){
                while (true){
                    int n = is.read(bur);
                    count += n;
                    if(n == -1){
                        break;
                    }
                    os.write(bur);
                }
                os.flush();
            }
        }
        long end = System.currentTimeMillis();
        long ms = end-sta;
        double s = ms/1000.0;
        System.out.println("复制时间是:"+s+"ms");

    }
}

3 一个目录的复制

给定两个路径: 源文件路径 (必须存在 && 是目录)、目标路径(必须不存在 && 父目录存在)

思路:

if(目录) :继续递归 + 目标的相对位置创建目录

if(文件): 目标的相对位置,进行文件的复制

package com.djl.io;

//目录的复制

import java.io.*;

public class Test2_copyDir {
    static File oldFile = new File("D:/简历");
    static File newFile = new File("D:/简历/2");
    public static void main(String[] args) throws Exception{
        traversal(oldFile);
    }

    private static void traversal(File oldFile) throws Exception{
        File[] oldFiles = oldFile.listFiles();
        if(oldFiles == null){
            System.out.println("目录为空");
            return;
        }
        for(File file : oldFiles){
            String oldFilePath = oldFile.getCanonicalPath();
            String filePath = file.getCanonicalPath();
            String newFilePath = newFile.getCanonicalPath();

            String rever = filePath.substring(oldFilePath.length());
            newFilePath = newFilePath + rever;
            File oneNewFile = new File(newFilePath);
            if(file.isDirectory()){
                oneNewFile.mkdir();
                traversal(file);
            }else if(file.isFile()){
                copyFile(file,oneNewFile);
            }

        }
    }

    private static void copyFile(File file, File oneNewFile) throws Exception{
        try(InputStream is = new FileInputStream(file)){
            try(OutputStream os = new FileOutputStream(oneNewFile)){
                while (true){
                    byte[] bur = new byte[1024];
                    int n = is.read(bur);
                    if(n == -1){
                        break;
                    }
                    os.write(bur);
                }
                os.flush();
            }
        }
    }
}

要是对大家有所帮助的话,请帮我点个赞吧。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值