【IO】文件操作基础知识

news2024/11/16 5:39:11

目录

1.文件的操作:

2.文件内容的读写—数据流:

3.文件操作练习:


1.文件的操作:

  1. 文件分为狭义上的文件和广义的文件。
  2. 狭义上的文件:存储在硬盘上的数据,以“文件”为单位进行组织。文件夹也叫做目录。
  3. 通过“路径”的概念来描述一个文件在电脑上的具体位置。路径分为绝对路径(每个 / 间隔的部分都是目录)和相对路径(需要有基准)。
  4. 相对路径中 ./表示当前目录(./qq/Bin/QQ.exe);使用 ../ 表示返回到上级目录
  5. I(input)O(output),输入和输出的方向是以CPU/内存为中心。输入就是将外部设备(键盘)的数据放到内存里。
  6. File类;注意:有File对象不代表有真实存在该对象。File类的构造方法常用File(路径),这里的路径可以是绝对路径还可以是相对路径。一个file对象就是一个文件或目录。
    File file = new File("..//helloworld.txt");//并不要求该文件真实存在
    返回值类型方法签名说明
    StringgetName()返回File对象纯文件名称
    booleanisDirectory()判断是不是目录
    booleanisFile()判断是不是普通文件
    booleancreateNewFile()创建文件,成功后返回true
    booleandelete()删除该文件,成功后返回true
    voiddeleteOnExit()进程退出时才会删除文件
    booleanmkdir()创建目录
    booleanmkdirs()创建多级目录
    booleanrenameTo()重命名

2.文件内容的读写—数据流:

  1. 读操作:InputStream;从外部设备读取到内存上。
    //InputStream是一个抽象类,不具体,不能实例化,所以需要用到FileInputStream
    //下面这个过程就相当于打开文件!想要读写文件就需要打开文件~
    InputStream inputStream = new FileInputStream("hello.txt");
    返回值类型方法签名说明
    intread()读取一个字节的数据,返回-1代表读完了
    intread(byte[ ] b)读取b.length字节数据放到b中,返回读到的数量,-1代表已经读完了
    intread(byte[ ] b, int m, int n)读取n-m个字节到b中
    voidclose()关闭字节流
  2. //1.读操作:无
    public static void main(String[] args) throws IOException {
            InputStream inputStream = new FileInputStream("hello.txt");
            while(true){
                int ret = inputStream.read();
                if(ret == -1){
                    break;
                }
                System.out.println(ret);
            }
            inputStream.close();
    }
    //2.读操作:使用Scanner来读数据
    public static void main(String[] args) throws IOException {
            InputStream inputStream = new FileInputStream("./hello.txt");
            //scanner搭配inputStream使用,读操作
            Scanner scanner = new Scanner(inputStream);
    
            while(scanner.hasNext()){
                System.out.println(scanner.next());
            }
    
            inputStream.close();
    }
    //3.读操作:使用byte数组
    public static void main(String[] args) throws IOException {
            try(InputStream inputStream = new FileInputStream("hello.txt")){
                byte[] ret = new byte[1024];
                int len = 0;
                while(true){
                     len = inputStream.read(ret);
                    if(len == -1){
                        break;
                    }
                    for (int i = 0; i < len; i++) {
                        System.out.println(ret[i]);
                    }
                }
            }
    }
    //4.读操作:使用try和scanner
    public static void main(String[] args) throws IOException {
            try(InputStream inputStream = new FileInputStream("./hello.txt");
                  Scanner scanner = new Scanner(inputStream)){
                while(scanner.hasNext()){
                    String ret = scanner.next();
                    System.out.println(ret);
                }
            }
    }
  3. 写:OutputStream;
    //OutputStream是一个抽象类,不具体,不能实例化,所以需要用到FileOutputStream
    //使用OutputStream写文件的时候,只要文件打开成功,就会把文件原来的内容清空
    OutputStream outputStream = new FileOutrputStream("./hello.txt");
    返回值类型方法签名说明
    voidwrite(int b)写入一个字符将b这个字符数组中的数据全部写入
    voidwrite(byte[ ] b)将b这个字符数组中的数据全部写入
    intwrite(byte[ ] b, int m, int n)将b这个字符数组中的数据从m开始写入
    voidclose()关闭字节流
    voidflush()刷新缓冲区
  4. //1.写操作
    public static void main(String[] args) throws IOException {
            OutputStream outputStream = new FileOutputStream("./hello.txt");
            //打开文件后,会先把文件内容清空
            outputStream.write(97);
            outputStream.write(98);
            outputStream.write(99);
    
            outputStream.close();
    }
    //2.写操作:使用PrintWriter来写操作
    public static void main(String[] args) throws IOException {
            OutputStream outputStream = new FileOutputStream("./hello.txt");
    
            PrintWriter writer = new PrintWriter(outputStream);
    
            writer.print(45);
            writer.print('c');
            writer.println();
    
            //一定要刷新缓冲区
            outputStream.flush();
    
            //一定要关闭文件,writer.close()!!!
            writer.close();
    }
    //3.写操作:使用try和PrintWriter来写操作
    public static void main(String[] args) throws IOException {
            try(OutputStream outputStream = new FileOutputStream("./hello.txt");
                PrintWriter writer = new PrintWriter(outputStream)){
    
                writer.println();
                writer.print('s');
    
                writer.flush();
            }
    }
    //4.写操作:使用OutputStreamWriter和PrintWriter来写
    public static void main(String[] args) throws IOException {
            try(OutputStream outputStream = new FileOutputStream("./hello.txt");
                OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream);
                PrintWriter printWriter = new PrintWriter(outputStreamWriter)){
                
                printWriter.println();
                printWriter.print(1);
                printWriter.print(12);
                printWriter.print(13);
    
                printWriter.flush();
            }
    }
  5. 刷新缓冲区:OutputStream为了减少设备操作的次数,写数据时会将数据暂时写入缓冲区中,直到满足条件才写到内存上。因此为了保证数据不会遗留在缓冲区上,我们需要用到刷新缓存区flash()的操作来将数据刷到设备上。 

  6. 文件内容操作后一定要将文件close,否则会造成文件资源泄露,类比于图书馆借书(一伙人直只借不还,图书馆的书不就越来越少了嘛~)。

    为什么需要close文件???
    1.每个进程都对应着PCB,PCB里面有一个字段,文件描述符表
    2.同一个进程里面多个PCB可能同时使用一份文件描述符表
    3.文件描述符表相当于一个数组,每次打开一个文件,都会在表里创建一个项
    4.如果关闭则会把对应的项给释放掉
    5.如果不关闭,意味着这个项一直占着位置,
    6.如果持续打开文件且从来不关就会导致表项(数组里的元素)被耗尽
    7.导致后续文件在打开文件就会打开失败
    8.所以需要保证代码执行完关闭文件

3.文件操作练习:

1.扫描指定目录,并找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件 

思路:

1.先让用户输入要扫描的路径和要查找的字
2.遍历目录,找到名字包含的的文件
3.询问用户是否删除

代码:

//扫描目录,找到包含指定字符的所有普通文件,找到后询问是否要删除
public class Demo {
    public static void main(String[] args) throws IOException {
        //1.让用户输入必要的信息
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径:");
        File rootDir = new File(scanner.next());
        if(!rootDir.isFile()){
            System.out.println("输入的目录有错误!!!");
            return;
        }
        System.out.println("请输入要查找的关键字:");
        String toDelete = scanner.next();


        //2.遍历目录
        scanDir(rootDir,toDelete);

    }

    private static void scanDir(File rootDir, String toDelete) throws IOException {
        System.out.println("当前访问: "+rootDir.getCanonicalPath());
        File[] files = rootDir.listFiles();
        if(files == null){
            //说明目录是个空的目录
            return;
        }
        for (File f : files) {
            if(f.isDirectory()){
                scanDir(f,toDelete);
            }else{
                checkDelete(f,toDelete);
            }
        }
    }

    private static void checkDelete(File f, String toDelete) throws IOException {
        if(f.getName().contains(toDelete)){
            System.out.println("该单词"+toDelete+" 被 "+f.getCanonicalPath()+"包含了,是否要删除?(Y/N)" );
            Scanner scanner = new Scanner(System.in);
            String choice = scanner.next();
            if(choice.equals("Y") || choice.equals("y")){
                f.delete();
            }
        }
    }
}

2.将普通的文件复制一份

思路:

把第一个文件打开,将里面的内容逐个字节的读取出来,写入到第二个文件中

代码:

//普通文件的复制
public class Demo {
    public static void main(String[] args) throws IOException {
        //1.输入
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要复制的源文件:");
        File srcFile = new File(scanner.next());

        System.out.println("请输入目标文件:");
        File destFile = new File(scanner.next());

        if(!srcFile.isFile()){
            System.out.println("输入的源文件有错误!!!");
            return;
        }
        if(!destFile.getParentFile().isDirectory()){
            System.out.println("输入的目标文件有误!!!");
            return;
        }

        //2.打开目标文件,按照字节读取写入到目标文件中

        try(InputStream inputStream = new FileInputStream(srcFile);
            OutputStream outputStream = new FileOutputStream(destFile)){
            while(true){
                int ret = inputStream.read();
                if(ret == -1){
                    break;
                }
                outputStream.write(ret);
            }
        }

    }
}

3.扫描指定目录,并找到名称或者内容中包含指定字符的所有普通文件(不包含目录)

思路:

1.先让用户输入要扫描的路径和要查找的字
2.遍历目录,找到名字和内容都包含的文件
3.询问用户是否删除

代码:

//扫描文件,判断其中是否包含关键字
public class Demo {
    public static void main(String[] args) throws IOException {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入要扫描的路径:");
        File rootDir = new File(scanner.next());

        if(!rootDir.isFile()){
            System.out.println("输入的路径有问题!");
            return;
        }
        System.out.println("请输入要搜索的关键字:");
        String toFind = scanner.next();

        //2.遍历
        scanDir(rootDir,toFind);
    }

    private static void scanDir(File rootDir, String toFind) throws IOException {
        System.out.println("当前路径:"+rootDir.getCanonicalPath());
        File[] files = rootDir.listFiles();
        if(files == null){
            return;
        }
        for(File f : files){
            if(f.isDirectory()){
                scanDir(f,toFind);
            }else{
                checkDelete(f,toFind);
            }
        }

    }

    private static void checkDelete(File f, String toFind) throws IOException {
        //先检查文件名
        if(f.getName().contains(toFind)){
            System.out.println(f.getCanonicalPath() + "文件名中包含 " + toFind+" 是否删除(Y/N)");
        }
        try(InputStream inputStream = new FileInputStream(f)){
            StringBuilder sb = new StringBuilder();
            Scanner scanner = new Scanner(inputStream);

            while(scanner.hasNextLine()){
                sb.append(scanner.nextLine() + "\n");
            }
            if(sb.indexOf(toFind) > -1){
                System.out.println(f.getCanonicalPath() + "文件内容中包含 " + toFind+" 是否删除(Y/N)");

            }
        }
    }
}

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

如果对您有帮助的话,

不要忘记点赞+关注哦,蟹蟹

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图第三遍补充(各种算法与力扣)

一、一些补充的概念 如果具有n个结点的图中是一个环&#xff0c;则会有n个不同的生成树&#xff0c;每个生成树有n-1条边 连通、连通图、连通分量&#xff1a;路径&#xff0c;无向图 &#xff0c;极大连通子图为连通分量&#xff0c;边数小于n-1&#xff0c;则图必为非连通图…

Xilinx XC7Z020双核ARM+FPGA开发板试用合集——自定义硬件工程

本期测试板卡是一款基于Xilinx Zynq-7000系列XC7Z010/XC7Z020高性能低功耗处理器设计的异构多核SoC工业级核心板,处理器集成PS端双核ARM Cortex-A9 + PL端Artix-7架构28nm可编程逻辑资源。 下面是测试内容,欢迎查阅。 SD卡启动设置 根据《TLZ7x-EasyEVM-S评估板硬件说明书》…

开心消消乐游戏网页设计作品 学生dreamweaver作业静态HTML网页设计模板 游戏主题网页作业制作

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

有营养的算法笔记(八)

有营养的算法笔记八摆砖块问题数字转换K递增子序列魔法子数组摆砖块问题 1.题目描述 给定一个正数数组arr&#xff0c;其中每个值代表砖块长度。所有砖块等高等宽&#xff0c;只有长度有区别&#xff0c;每一层可以用1块或者2块砖来摆。要求每一层的长度一样 要求必须使用所有…

【阅读笔记】低照度图像增强-《An Integrated Neighborhood Dependent...

本文介绍的是一种比较实用的低照度图像增强算法&#xff0c;选自2004年Tao的一篇论文&#xff0c;名称是《An Integrated Neighborhood Dependent Approach for Nonlinear Enhancement of Color Images 》 概述 图像中暗区图像增强的基本机制是对图像的亮度进行动态范围压缩&…

玩转rancher 2.6之 monitor监控

目录 前言 1. 安装monitor 2. 安装prometheus-webhook-dingtalk 2.1 配置钉钉告警配置文件 2.2 创建钉钉告警模板 2.3 创建dingtalk configmap配置文件 2.4 安装dingtalk 2.5 dingtalk调用方法 3. 配置告警 3.1 配置告警接收者 3.2 配置路由默认告警接收者 4. 测试 前…

初识C++ (三)

初识C 三引用一. 引用的概念代码演示二. 引用特性1. 引用在定义时必须要初始化2. 一个引用可以有多个实体3. 引用一旦引用一个实体&#xff0c;再不能引用其他实体三. 使用场景1. 做参数2. 做返回值内存销毁后空间还在吗&#xff1f;内存销毁后我们还能访问嘛&#xff1f;结论优…

论文写作——ICASSP论文写作及投稿

记录 ICASSP2023 写作投稿过程。小白如何写好并投稿自己的第一篇英文论文&#xff1f;投稿会议时&#xff08;以 ICASSP2023 为例&#xff09;有哪些需要关注的信息以及注意事项&#xff1f;论文写作必备软件有哪些&#xff1f;论文书写关注点有哪些&#xff1f;论文格式与排版…

【Node.JS 】http的概念及作用

往期文章 【Node.JS 练习】时钟案例 【Node.JS 】path路径模块 【Node.JS 练习】考试成绩整理 【Node.JS】buffer类缓冲区 【Node.JS】事件的绑定与触发 【Node.JS】写入文件内容 【Node.JS】读取文件内容 什么是http模块 在网络节点中&#xff0c;负责消费资源的电脑&…

【C语言】C语言文件操作详解(一)

前言 本章主要讨论的是数据文件&#xff0c;如何使用C语言对数据文件进行输入输出数据的操作&#xff0c;以及文件顺序读写涉及的库函数详解 目录前言1.为什么使用文件2.什么是文件2.1程序文件2.2数据文件2.3文件名3.文件的打开和关闭3.1文件指针3.2文件的打开3.3文件的关闭3.…

初识JAVA

文章目录初识 java 的 main 方法main 方法示例运行Java程序注释基本规则注释规范标识符关键字初识 java 的 main 方法 main 方法示例 public class test {public static void main(String[] args) {System.out.println("hello world!");} }如果我们学的C语言&#…

DASCTF X GFCTF 2022十月挑战赛 Writeup

文章目录WEBEasyPOPMISC滴滴图ez_xxdpoi&#xff1f;qoi&#xff01;easy_dotsdockermiscWEB EasyPOP Fast Destruct优先一步__wakeup()执行析构函数 从一道题看fast_destruct fine::__invoke() <- sorry::__get() <- secret_code::show() <- secret_code::__call…

使用 MySQL 日志 - Part 1

在软件应用程序中&#xff0c;日志文件会记录系统中执行的操作以及执行操作的人员。如果出现意外情况&#xff0c;无论是安全漏洞、系统崩溃还是性能迟缓&#xff0c;日志文件都可以成为管理员的得力助手。MySQL 就有几个不同的日志文件&#xff0c;可以帮助你找出 MySQL 服务器…

Excel多条件计数——COUNTIFS【获奖情况统计】

问题描述 当前&#xff0c;我们需要对表格中的获奖情况进行统计 奖励级别&#xff1a;院级、校级、国家级、国际级奖励内容&#xff1a;特等奖、一等奖、二等奖、三等奖、优胜奖 功能要求 对所有奖励级别进行统计根据级别&#xff0c;计算内容数量 当有人的选项内容如下时 …

MySQL之SQL的执行流程

MySQL之SQL的执行流程MySQL架构连接层服务层存储引擎连接查看连接连接与线程连接超时最大连接会话与全局查询缓存语法解析和预处理词法解析语法解析预处理查询优化器优化器查询执行计划存储引擎存储引擎概述常用存储引擎MyISAMInnoDBMEMORY存储引擎的选择执行引擎MySQL架构 从…

DBMS 中的 2 层架构与 3 层架构

有多种方法可以获取存储在数据库管理系统中的数据。根据其结构对 DBMS 的体系结构进行了分类。 DBMS 架构概述 理解 2-tier 和 3-tier 架构是一个相当重要的话题&#xff0c;不仅对于学术或寻找好工作&#xff0c;而且对于与技术相关的一般意识也是如此。 2-tier simple表示两…

【每日渗透笔记】覆盖漏洞+修改隐藏数据实战尝试

目录 一、特点&#xff1a; 1.1、特征&#xff1a; 1.2、知识&#xff1a; 1.3、注册的功能点&#xff1a; 目前&#xff1a; 问题&#xff1a; 二、分析数据包 2.1、修改数据处 三、换思路 一、特点&#xff1a; 1.1、特征&#xff1a; 存在注册的功能点 1.2、知识&a…

资本狂欢过后 Aptos如何顶住旧日光环?

10月27日&#xff0c;Aptos Autumn主网上线一周后&#xff0c;其浏览器数据显示&#xff0c;该Layer1网络的交易总量为1432万笔&#xff0c;TPS为10.65&#xff0c;原生Token APT总供应量约为10.02亿&#xff0c;质押数量约为8.23亿枚&#xff0c;活跃节点数量102个。 低TPS、高…

AIR780E使用AT连接TCP收发数据

最近各种技术群都被合宙9.9的开发板刷屏了&#xff0c;笔者成功的第一时间拼团成功&#xff0c;已经作为前两百人收到开发板了&#xff0c;因为官方的二次开发固件还没出&#xff0c;就先玩一下传统的AT开发。 文中各种文档和资料均可以在air780e.cn网站找到。 本文将介绍如何…

99208-90-9_炔基-棕榈酸_Alkynyl Palmitic Acid 可进行定制

一、产品简介----Product introduction&#xff1a; 货号&#xff1a;Y-CL-0063 CAS&#xff1a;99208-90-9 中文名&#xff1a; 15-十六碳炔酸&#xff0c;炔基-棕榈酸 英文名&#xff1a;Alkynyl Palmitic Acid/hexadec-15-ynoic acid 结构式&#xff08;Structural&#xff…