文件 与 IO操作

news2024/11/16 1:55:56

前言

本篇介绍文件的基本操作,认识文本文件与二进制文件的区别,什么是绝对路径与相对路径,java标志库中又是如何进行文件操作的;认识流对象进行简单的文件读取操作;如有错误,请在评论区指正,让我们一起交流,共同进步!


文章目录

  • 前言
    • 1. 文件的存储
    • 2.文件系统操作 - 通过标准库操作
      • 2.1 认识文件的路径
      • 2.2 认识 绝对路径 与 相对路径
      • 2.3 认识文本文件 与 二进制文件
      • 2.4 标准库中的文件 - File
    • 3.文件内容操作
      • 3.1 对于文本文件 - 字符流
      • 3.2 对于二进制文件 - 字节流
    • 4. 练习 - 遍历目录,查找文件内容
  • 总结

本文开始

1. 文件的存储

文件一般都存储在硬盘上;

硬盘存储 与 内存存储区别:
① 速度: 内存存储速度比硬盘快
② 空间大小:内存存储空间比硬盘小
③ 成本:内存成本比硬盘贵
④ 持久化:内存掉电后,数据会丢失;外存掉电后数据不会丢失

2.文件系统操作 - 通过标准库操作

2.1 认识文件的路径

文件系统是以 树形 结构来组织文件和目录;

文件路径:目录在系统上的具体位置 - (目录 <=> 文件夹),通过树根节点,延树杈一步一步到达目标文件所经过的路径;

表示路径的方式:字符串,每个目录之间用 \ 或者 / 来分隔;
【注】反斜杠 \ 在代码中需要使用转义字符 \ 代表一个 \ ;

示例:

在这里插入图片描述

2.2 认识 绝对路径 与 相对路径

绝对路径:从盘符开始,一层一层得到的路径;
相对路径:从某个目录出发(./ 或者 …/ 开始),一层一层找到的路径;- 需要有一个基准目录;

在这里插入图片描述

【注】./ 表示相对路径中的当前目录; …/ 表示当前目录的上一级目录;
相对路径中一定要明确基准目录是什么!!!;
文件系统中,任何一个文件,对应的路径是唯一的,没有两个路径相同的文件;

2.3 认识文本文件 与 二进制文件

文本文件:存储的是文本,内容由ASCII字符 或 其他字符编码得到;
二进制文件:存储的二进制的数据; - 存储不受限制;

怎么区分文本文件 与 二进制文件呢?
文本文件:内容人能够看懂
例如:.txt, .csa - excel等;
二进制文件:内容数据人看不懂;
例如:.exe, .mp3等;
二进制文件图示:

在这里插入图片描述

2.4 标准库中的文件 - File

File 类:Java标准库中,提供的,它是对硬盘上一个文件的抽象表示,用于间接操作硬盘中的文件;
【注】文件存储在硬盘中,不能之间操作硬盘中的文件;使用File对象,先在内存中创建一个File对象,操作这个对象,间接操作硬盘中的文件;

2.4.1 构造文件对象的构造方法
构造对象:可以使用绝对路径 / 相对路径 进行初始化构造;
【注】路径指向的文件可存在,也可不存在;

在这里插入图片描述

2.4.2 File对象的方法

File对象的基本操作:

public static void main(String[] args) throws IOException {
        //通过File对象操作
        File file = new File("d:/dog.jpg");
        //返回父目录文件路径
        file.getParent();
        //获取路径对象的文件名
        file.getName();
        //获取文件路径
        file.getPath();
        //获取文件绝对路径
        file.getAbsoluteFile();
        //对绝对路径进行化简得到的结果
        file.getCanonicalFile();
    }

判断文件是否存在,创建文件再次查看;

public static void main2(String[] args) throws IOException {
        File file = new File("./t.text");
        //文件是否存在
        System.out.println(file.exists());
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());//目录是否存在

        //创建文件
        System.out.println("----创建文件----");
        file.createNewFile();
        System.out.println(file.exists());
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
        
        System.out.println("----删除文件----");
        file.delete();
        System.out.println(file.exists());
    }

创建文件目录,再查看文件名 / 文件;

public static void main(String[] args) {
 		File file = new File("t-dir/a/b");
        //创建一级目录
        //file.mkdir();
        //创建多级目录
        file.mkdirs();
        
        File file = new File("t-dir");
        //list() - 返回字符串
        //返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。
        //File对象代表的目录下的所有 文件名
        String[] results = file.list();
        System.out.println(Arrays.toString(results));
        //listFiles() - 返回文件
        //返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。
        //File对象代表的目录下的所有 文件 - File对象表示
        File[] r2 = file.listFiles();
        System.out.println(Arrays.toString(r2));
    }

3.文件内容操作

3.1 对于文本文件 - 字符流

文本文件: 读写的基本单位是字符
输入:Reader - 读硬盘
输出: Writer - 写硬盘

3.2 对于二进制文件 - 字节流

二进制文件:读写的基本单位是字节;
输入:InputStream
输出:OutputStream

如何区分流对象输入输出方向?
以cpu为基准 - 输入输出是站在CPU的角度来看的;
输入:从硬盘读到内存中称为输入;
输出:从内存写入到硬盘是是输出;

在这里插入图片描述

a) 使用InputStream
由下图可知InputStream是抽象类,不能够new对象,这里就是new它的子类new FileInputStream();
【注】记得关闭文件,如果不及时关闭,会出现文件资源泄露问题;
读取字节的多个方法:

在这里插入图片描述
在这里插入图片描述
【注】read方法读取完毕会返回-1,所以用int接收字节;

读取字节代码实现:

 public static void main(String[] args) throws IOException {
        //java代码的语法,使用try() {}
        //带有资源的try操作,会在try代码块结束,自动执行close关闭操作
        //InputStream实现了一个特定的接口Closeable,实现了这个接口就可以使用这种语法,
        // 在代码块结束时自动调用Closeable去关闭资源;
        try(InputStream inputStream = new FileInputStream("d:/t.txt")) {
            while (true) {
                //使用Int接收读到的字节,为了表示-1,-1代表了读取字节结束的标志;
                int b = inputStream.read();
                if (b == -1) {
                    break;
                }
                //读取的字节,显示的是ascii码值
                System.out.println(b);
            }
        }

    }

为什么使用try()这种语法?
可以自动关闭文件资源;文件打开后需要及时关闭,如果没有及时关闭会出现文件资源泄露;不使用try()也没关系,但需要自己手动关闭文件,为了更好的优化代码,所以使用try()这种语法;

b) OutputStream
写入字节的方法:

在这里插入图片描述

写入字节代码实现:

 public static void main(String[] args) {
        try(OutputStream outputStream = new FileOutputStream("d:/t.txt")) {
            outputStream.write(97);
            outputStream.write(98);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

c) Read
读取字符方法:

在这里插入图片描述

读取字符代码实现:

public static void main(String[] args) {
        try(Reader reader = new FileReader("d:/t.txt")) {
            while (true) {
                int n = reader.read();
                if(n == -1) {
                    break;
                }
                char ch = (char) n;
                System.out.println(ch);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

d) Write
写的方法

在这里插入图片描述

写的代码实现:

public static void main(String[] args) {
        try (Writer writer = new FileWriter("d:/t.txt")){
            writer.write(99);
            writer.write(99);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

4. 练习 - 遍历目录,查找文件内容

前提:
电脑中有许多文件,用户需要查找含有word关键词的文件;

如何操作呢?
使用递归操作,把一个盘中的文件挨个判断是否含有关键词,含有关键词就打印文件路径,不含有继续递归;

4.1 简单的模式:
首先输入某个盘符c:/ 或者某个具体位置;
再输入需要查找的关键词word;
根据盘符 / 某个具体路径 和 关键词查找文件,进行递归操作;

 public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        //1.用户指定要搜索的根目录
        System.out.println("请输入根目录:");
        File rootDir = new File(scanner.next());
        if(!rootDir.isDirectory()) {
            System.out.println("输入有错误,请重新输入!");
            return;
        }
        //2.用户输入一个要查询的词
        System.out.println("请输入要查询的词: ");
        String word = scanner.next();
        //3.递归的进行目录 / 文件的遍历
        scanDir(rootDir,word);

    }

4.2
递归操作:
① 根据根目录把所有文件放到 File[ ] 数组中
② 遍历File[ ] 数组,判断 是目录 还是普通文件 或者其它;
③ 如果是目录 根据当前文件为根目录进行递归;如果是其它文件之间下一个;如果是文件判断该文件内容中是否含有要查找的关键词;

 private static void scanDir(File rootDir, String word) {
        //列出根文件中的内容
        File[] files = rootDir.listFiles();
        if (files == null) {
            //空目录,直接返回,不用递归
            return;
        }
        //遍历目录中的内容
        for (File f : files) {
            System.out.println("当前搜索到:" + f.getAbsoluteFile());
            if(f.isFile()) {
                //打开文件,读取内容,比较是否包含关键词
                String content = readFile(f);
                if(content.contains(word)) {
                    System.out.println(f.getAbsolutePath() + "包含关键词!");
                }
            }else if(f.isDirectory()) {
                //目录,进行递归操作
                //这里以f为新的根目录
                scanDir(f,word);
            }else {
                //不是文件,也不是目录
                continue;
            }
        }
    }

4.3
读文件操作:判断文件内容是否含有关键词:
① 先读取文件内容,使用Read一个一个读取字符 - 这里指定使用字符串;
② 读取的结果使用 StringBuilder 进行字符串拼接
③ 最后返回 StringBuilder 字符串;

private static String readFile(File f) {
        //这里匹配的是字符串,所以使用字符流
        StringBuilder stringBuilder = new StringBuilder();
        try(Reader reader = new FileReader(f)) {
            //读取一个个字符到stringBuilder中拼接成 字符串
            while (true) {
                int c = reader.read();
                if(c == -1) {
                    break;
                }
                //拼接字符成一个字符串
                stringBuilder.append((char)c);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return stringBuilder.toString();
    }

总结

✨✨✨各位读友,本篇分享到内容如果对你有帮助给个👍赞鼓励一下吧!!
感谢每一位一起走到这的伙伴,我们可以一起交流进步!!!一起加油吧!!!

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

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

相关文章

全网最详细,Pytest自动化测试框架关联/参数化实战,及拿即用...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Pytest自动化测试框…

从C出发 27 --- 深入理解指针与地址

指针是什么? 指针是变量&#xff0c;这种变量有一点特殊&#xff0c;它特殊在保存的值是内存地址&#xff0c;并且我们还可以通过指针所保存的内存地址来直接访问相应内存中的数据。 每一种指针类型的变量只保存对应类型变量的地址 比如这个类型的指针变量&#xff0c;只保…

计及源荷不确定性的综合能源生产单元运行调度与容量配置随机优化模型(matlab代码)

目录 1 主要内容 1.1 风光场景聚类 1.2 主模型程序结果 1.3 随机模型和确定性模型对比 1.4 有无储气对比 1.5 煤价灵敏性分析 1.6 甲烷价格灵敏性分析 2 部分程序 3 程序链接 1 主要内容 本程序复现《计及源荷不确定性的综合能源生产单元运行调度与容量配置两阶段随机…

Cloud Kernel SIG月度动态:发布 Anolis 8.8 镜像、kABI 社区共建流程

Cloud Kernel SIG&#xff08;Special Interest Group&#xff09;&#xff1a;支撑龙蜥内核版本的研发、发布和服务&#xff0c;提供生产可用的高性价比内核产品。 01 SIG 整体进展 Anolis 8.8 镜像发布&#xff0c;默认搭载 ANCK 5.10-013 版本。 Anolis 23 滚动内核更新至…

4月更新!EasyOps®全平台27项新功能一口气来袭~

又到了每月产品盘点时刻&#xff0c;27大新功能上线和升级优化&#xff0c;设计Hyperlnsight超融合持续观测平台、DevOps持续交付平台、AutoOps自动化运维平台、ITSM服务平台、公共服务&#xff0c;在不断的技术创新过程中&#xff0c;进一步加速IT运维效率升级。 下面和小编一…

Vue监视数据的学习笔记

Vue监测数据变化的更新 <div id"monitor"><h2>人员列表</h2><button click"updateMei">更新马冬梅信息</button><ul><li v-for"(p,index) of persons" :key"index">{{p.name}}--{{p.age}}…

Python数据结构-----递归实现快速排序

目录 前言&#xff1a; 快速排序 1.概念 2.示例 Python代码实现 递归实现快速排序 前言&#xff1a; 今天我们就来一起学习快速排序的思想方法&#xff0c;然后通过Python语言来实现快速排序的功能&#xff0c;下面我们就开始今天的学习吧&#xff01; 快速排序 1.概念 快…

银行数字化转型导师坚鹏:金融科技在银行数字化转型中的创新案例

金融科技在银行数字化转型中的创新与应用案例&#xff08;偏重对公业务&#xff09; 课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚5G如何赋能银行数字化转型&#xff1f; 不清楚最新金融科技创新与应用案例&#xff1f; 不了…

【部署YUM仓库】

目录 一、YUM概述1.1、YUM&#xff08; Yellow dog Upadater Modified) 二、准备安装源2.1、YUM软件仓库类型2.2、RPM软件包的来源2.3、第三方yum源的网址查看:2.4、构建CentOS 7 软件仓库2.4.1、配置yum源仓库时要先挂载2.4.2、配置yum源仓库2.4.3、配置完后更新缓存 2.5、ftp…

AutoSAR内存映射

总目录链接>> AutoSAR入门和实战系列总目录 总目录链接>> AutoSAR BSW高阶配置系列总目录 文章目录 为了防止不必要的内存缺口&#xff08;RAM 中未使用的空间&#xff09;&#xff0c;不同大小&#xff08;8、16 和 32 位&#xff09;的变量根据其大小映射到特…

论文笔记:基于并行注意力 UNet的裂缝检测方法

0 简介 论文&#xff1a;基于并行注意力 UNet的裂缝检测方法&#xff08;Parallel Attention Based UNet for Crack Detection&#xff09;&#xff1b; 发表&#xff1a;2021年发表在《计算机研究与发展》上。 1 问题分析 问题&#xff1a;裂缝图像中存在噪声、光线、阴影等…

中睿天下亮相2022电力行业信息化年会

4月14日-15日&#xff0c;以“低碳数字新动力&#xff0c;电力转型新发展”为主题的2022电力行业信息化年会在长沙成功召开。中睿天下作为网络安全企业受邀出席参展&#xff0c;展示多样性网络安全产品、电力行业解决方案及相关应用成果。 作为能源电力领域的行业盛会和学术交流…

垃圾回收器(一)

垃圾回收器概述 垃圾收集器没有在规范中进行过多的规定&#xff0c;可以由不同的厂商、不同版本的JVM来实现。 由于JDK的版本处于高速迭代过程中&#xff0c;因此Java发展至今已经衍生了众多的GC版本。 从不同角度分析垃圾收集器&#xff0c;可以将GC分为不同的类型。 GC分…

设计模式简谈

设计模式是我们软件架构开发中不可缺失的一部分&#xff0c;通过学习设计模式&#xff0c;我们可以更好理解的代码的结构和层次。 设计原则 设计原则是早于设计方法出现的&#xff0c;所以的设计原则都要依赖于设计方法。这里主要有八个设计原则。 推荐一个零声学院免费教程&…

阳光万里,祝你上岸——免统考在职研究生

什么是在职研究生 在职研究生&#xff0c;是国家计划内&#xff0c;以在职人员身份&#xff0c;部分时间在职工作&#xff0c;部分时间在校学习的研究生教育的一种类型。在职攻读硕士方式有三种&#xff1a; 1.双证非全日制研究生&#xff1a;为普通高等教育研究生学历&#x…

QGIS--开发OpenSCENARIO动态场景(三)--制作动态场景

一、添加scenario&#xff0c;carla的环境变量 export CARLA_ROOT/path/to/your/carla/installation export SCENARIO_RUNNER_ROOT/path/to/your/scenario/runner/installation export PYTHONPATH$PYTHONPATH:${CARLA_ROOT}/PythonAPI/carla/dist/carla-<VERSION>.egg ex…

如何利用工时表来帮助项目管理做得更完善?

项目管理是一项复杂的任务&#xff0c;需要协调各种资源以确保项目按时交付。其中一个关键方面是管理各个员工工时。工时表软件是一种可以帮助企业记录各个员工工作时效的工具&#xff0c;而且还可以帮助项目管理者记录和跟踪项目成员的时间。那么如何利用工时表来帮助项目管理…

如何配置静态路由?这个实例详解交换机的静态路由配置

一、什么是静态路由 静态路由是一种路由的方式&#xff0c;它需要通过手动配置。静态路由与动态路由不同&#xff0c;静态路由是固定的&#xff0c;不会改变。一般来说&#xff0c;静态路由是由网络管理员逐项加入路由表&#xff0c;简单来说&#xff0c;就是需要手动添加的。…

相空间相关概念以及轨迹生成

在时间序列分析中&#xff0c;相位轨迹也被广泛应用于提取隐藏在数据中的结构信息。例如&#xff0c;在人类活动识别任务中&#xff0c;通过构建不同活动对应的相位轨迹&#xff0c;可以揭示活动间的相似性和差异性&#xff0c;从而有助于设计有效的分类方法。 相空间&#xff…

Java每日一练(20230420)

目录 1. 罗马数字转整数 &#x1f31f; 2. 电话号码的字母组合 &#x1f31f;&#x1f31f; 3. 排列序列 &#x1f31f;&#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每…