【JavaEE初阶】深入透析文件-IO关于文件内容的操作(四种文件流)

news2025/1/13 3:06:42

前言

🌟🌟本期讲解关于CAS的补充和JUC中有用的类,这里涉及到高频面试题哦~~~

🌈上期博客在这里:【JavaEE初阶】文件-IO之实现文件系统的操作如何进行实现-CSDN博客

🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客

                                         那么废话不多说直接开整吧~~~

目录

1. 文件流

1.1概念

1.2文件流分类

1.3文件流的操作

1.文件资源泄露

2.Inputstrea

read的方法

一个字节读取

多个字节读取

3.Outputstream

write的方法

 一个字节写入

一段字节写入

4.Reader

read的方法

一个字符读取

多个字符读取

 5.writer

write的方法

 字符的读取

2.总结

2.1内容概括

2.2例题

1.查找硬盘上文件的位置

2.文件的复制

3.按照内容的方式在目录中进行搜索

1. 文件流

1.1概念

所谓的文件流是操作系统提出来的概念,这里的C/Java都对流进行了封装,那么这个抽象的概念如何进行具体化呢??

例子:

当我们要接一100mL水时,我们可以将文件流具体化成为水流的意思,而杯子就是文件,那么我们大体上就有两种办法:

1.我们可以一次性直接将这杯水直接性的接满;

2.我可以一次性接10mL的水,然后分10次接满这杯水;

所以这里就是 我们可以应用到我们的文件流上:即一个文件我们可以一次读取十个字节,分十次读完(这里代表的是共有100个字节),或者直接一次性读100个字节;

1.2文件流分类

在Java中文件流的读取操作分为两种:

第一种:字节流,就是代表按照一个字节一个字节进行读取;

即代表类:

Inputstream:这里代表输入(读操作)

Outputstream:这里代表输出(写操作)

第二种:字符流,这里就是按照字符的方式进行读取文件的操作,注意utf8读取的汉字,一个汉字就是三个字符,所以得以三个字符为单位读取汉字;

即代表类:

Read:这里代表输入(读操作)

Write:这里代表输出(写操作)

1.3文件流的操作

这里的四种输入输出流操作基本是一致的,但是这里编着重讲解一下关于这四种文件流的具体实例演示,这里就直接步入正题咯~~~

1.文件资源泄露

这里就是代表按照字节的形式读取数据,在这之前我们需要在idea工作目录下创建一个test.txt的文件,便于我们接下来的文件设置操作,图示如下:

这里就是我们小编在idea工作目录下创建的一个普通文件;我们可以在这面

实例化对象如下:

InputStream input=new FileInputStream("./test.txt")

注意:这里在执行文件流后,这里就要抛出一个IO异常,并且在执行文件读取操作后,要进行文件资源的释放

文件资源的释放:

input.close();

为啥要进行文件资源的释放:

       这里会有一个进程控制块,其中的文件描述附表就会记录当前进程打开了哪些文件,而其中的顺序表就会有一个结构进行描述文件的一些属性;

       如果每次打开一个文件,就会在文件描述附表中占用一个的位置,如果不进行资源的释放,就会导致文件描述附表被消耗殆尽;

 补充:

这里还有一个重要的概念叫做:“内存泄漏”;在C/C++中每malloc一个内存,就要自己手动进行free掉,但是在Java中自带的GC机制(即垃圾回收机制)就自动帮我们实现了这个过程;

但是当我们实现这里close后,可能由于return,或者抛出异常就无法执行到我们需要的释放的文件资源,那么在Java中就提供了两种办法:

第一种:

InputStream inputStream=null;
        try {
            inputStream=new FileInputStream("");
        }finally {
            inputStream.close();
        }

注意:这里小编已经在函数入口的main方法上进行了抛出异常的操作,这里就是通过finally来实现这里的必须执行close方法第操作;但是这种办法还是写得很是复杂;

第二种:

 public static void main(String[] args) throws IOException {
        try (InputStream input=new FileInputStream("./test.txt")){

        }        
}

注意:这种写法就是try with resources的写法,这里就是try自动帮我们执行了这里的close方法

但是这里的try必须是实现了closeable接口的类才能够直接实现哈;

这里的inputstream的内部原码:

可以看到这里的inputstream就已经实现了Closeable这里的接口;

综上所述:这里的inputstream的例子合适其他的文件流的操作

2.Inputstrea

我们在上描述中实现了使用文件流操作中实现文件资源的释放的工作,那么这里我们就要直接学习关于文件流之一:inputstream的重要方法的使用;

read的方法

read():这里传递的类是int,但是实际的类型就是byte类型,0-255,当文件读到末尾的时候就为-1;

read(byte[ ]):一个字节数组参数,是一个输出型参数,这里的字节数组是一个引用类型,在方法内部进行修改,在方法外也生效;

read(byte[ ],int off, len):这里的off是offest的意思,代表的是偏移量,len即代表的是偏移多少

一个字节读取
try (InputStream input=new FileInputStream("./test.txt")){
            //一个字节一个字节进行读取
            while (true){
                int n=input.read();
                //当n=-1就表示文件读取完毕了
                if(n==-1){
                    break;
                }
                System.out.printf("%x ",n);//ascll码值是10进制的但是16进制的就是61开始
            }

注意:即通过循环来进行文件的读取,当n=-1的时候,那么这里就表示文件已经读取完了,即跳出循环, 每次读取的字节进行打印(这里表示的是按照十六进行进行读取)

当我们在文件中输入abcd的时候,图示如下:

那么此时执行程序,最后实现的打印就是如下图所示:

这里按照16进制进行转化后就是如上所示,但是直接进行输出最后的结果即是:97 98 99 100

多个字节读取

代码如下:

           while (true){

                //进行一段字节进行读取
                byte[] buffer=new byte[1024];
                int n=input.read(buffer);
                if (n==-1){
                    break;
                }
                for (int i = 0; i < n; i++) {
                    System.out.printf("%x ", buffer[i]);
                }
                String s=new String(buffer,0,n);
                System.out.println(s);
            }

注意:这里就要通过buffer(缓冲区)进行一个文件读取的辅助,通过read进行字节传入到buffer字节数组中,然后通过n是否等于-1再次进行跳出循环的判断;

我们还可以通过string进行将字节转化为字符的形式进行输出,这里表示的是N个字节进行构造的字符串,而不是整个字节;

那么接下来的输出就是:

那么这里在输出abcd的16进制后,有多了abcd的字符串编码

3.Outputstream

这里和上面的inputstream是一致的都要进行文件资源的释放操作

write的方法

注意:这里的第一个表示的是一个字节进行写入,第二个表示按照一段字节进行写入操作,第三个是按照的规定进行一段字节的写入;

 一个字节写入

代码如下:

  try (OutputStream output=new FileOutputStream("./test.txt")){
         
            //一个字节进行写入造作
            int buffer1=97;
            output.write(buffer1);
        }catch (IOException e){
            throw new RuntimeException(e);
        }

 注意:这里的写入操作,会导致每次进行文件打开操作的时候,会清空文件的内容,所以不管执行多少程序那么这里的内容始终就是a;

所以我们可以在文件路径后面添加true,表示从文件内容进行添加,而不是删除内容后再添加;

一段字节写入
public static void main(String[] args) {
        try (OutputStream output=new FileOutputStream("./test.txt",true)){
          //输入要写入的数据
            byte[] buffer=new byte[]{97,98,99};
            output.write(buffer,0,3);
       
        }catch (IOException e){
            throw new RuntimeException(e);
        }
    }

注意,这里就涉及一个字节类的数组作为一个缓冲区域进行存字节,数字0表示从0下标开始,读取三个字节,这里严格来说不是实现字节转化为字符,而是读取端根据比配的字符编码进行显示的

这里由于存在true,那么就会在文件内容后面再次拼接字符串

那么这里执行两次后,输出结果就是如下:

可以看得到在实现字符的拼接后,就会打印两次abc;

4.Reader

read的方法

注意:这里的方法和上面的inputstream基本是一致的,但是这里是以char为单位进行的;但是第三个,就是一个类对字符数组进行封装,本质上还是一个字符数组 

一个字符读取
         while (true){

                int n= reader.read();
                if (n==-1){
                    break;
                }
                System.out.print((char)n+" ");

            }

注意:这里就不建议大家这样写,因为文件流是对硬盘进行操作,操作硬盘是一个低效的操作,所以在实现的时候,尽量减少这个操作 

多个字符读取

代码如下:

try (Reader reader = new FileReader("test.txt")) {
            while (true){
                //这里的类型是char类型
                char[] buffer=new char[1024];
                int n=reader.read(buffer);
                if (n==-1){
                    break;
                }
                for (int i = 0; i <n ; i++) {
                    System.out.print(buffer[i]);
                }
                String s = new String(buffer, 0, n);
                System.out.println(s);

            }

注意:这里还是和inputstream写法基本是一致的,只不过这里的string会将指定的字符数组转化为一个新的string对象,并且在打印的时候,会重新调用tostring对象,所以就可以进行字符串的读取了;

那么输出的结果就是:

很明显这里在执行字符串的打印过后,再次实现string的打印,所以这里就是四个abcd

 那么为什么这里的char(两个字节)为啥可以变为字符在utf8中表示的是三个字节???

因为在进行utf8文件按照字符提取的时候先转化为unicode,然后char存贮的是unicode的值,最后再由unicode转化为utf8(string类型)这里就是Java已经封装好了的

 5.writer

write的方法

注意:这里唯一的点就是,可一通过字符串来进行打印,其余的基本和上面的文件流操作一致~~~

 字符的读取
public static void main(String[] args) {
        try (Writer writer=new FileWriter("./test.txt")){
            String buffer="开心每一天";
            //char[] buffer=new char[]{'开','心','每','一','天'};
            writer.write(buffer,0,2);
           
        }catch (IOException e){
            throw new RuntimeException();
        }
    }

注意:这里可以直接通过string来进行写入文件,并且也可以通过实现char类型数组来进行文件的写入操作

2.总结

2.1内容概括

💬💬本期小编主要讲解了关于文件内容操作中,比较重的文件流的操作,包括:inputstream,outputstream,writer,reader,以及重要的小知识点穿插在其中~~

2.2例题

1.查找硬盘上文件的位置

要求:输入查找文件的名字,以及查找的路径;

代码位置:IODemo8.java · GGBondlctrl/IO - 码云 - 开源中国 (gitee.com)

2.文件的复制

要求:输入要复制的文件,以及复制到的目标文件

代码位置:IODemo9.java · GGBondlctrl/IO - 码云 - 开源中国 (gitee.com)

3.按照内容的方式在目录中进行搜索

要求:输入要查找的内容,以及要查找的文件路径

代码位置:IODemo11.java · GGBondlctrl/IO - 码云 - 开源中国 (gitee.com)

以上小编都在代码中进行了注解,小编这里就不再进行讲解了,下期将直接进入网络的编程了~~

🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!

 


💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。

                             😊😊  期待你的关注~~~

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

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

相关文章

初识算法 · 滑动窗口(3)

目录 前言&#xff1a; 水果成篮 题目解析 算法原理 算法编写 找到字符串中所有字符异位词 题目解析 算法原理 算法编写 前言&#xff1a; ​本文的主题是滑动窗口&#xff0c;通过两道题目讲解&#xff0c;一道是水果成篮&#xff0c;一道是找到字符串中的所有字母异…

(Linux驱动学习 - 11).Input 子系统

一.Input 子系统的定义 input 就是输入的意思&#xff0c;因此 input 子系统就是管理输入的子系统&#xff0c;和 pinctrl、 gpio 子系统 一样&#xff0c;都是 Linux 内核针对某一类设备而创建的框架。比如按键输入、键盘、鼠标、触摸屏等 等这些都属于输入设备&#xff0c;不…

聊聊 Facebook Audience Network 绑定收款账号的问题

大家好&#xff0c;我是牢鹅&#xff01;本篇是Facebook开发者系列的第五篇&#xff0c;最近看见好多群友在群里问这个&#xff0c;说Facebook的变现账户在绑定国内的银行账户时&#xff08;有些用户反馈就算不是国内的卡也会出现该问题&#xff09;&#xff0c;显示“无法绑定…

05 django管理系统 - 部门管理 - 修改部门

04我们已经实现了新增部门的功能&#xff0c;下面开始修改部门模块的实现。 按道理来说&#xff0c;应该是做成弹框样式的&#xff0c;通过ajax悄咪咪的发数据&#xff0c;然后更新前端数据&#xff0c;但是考虑到实际情况&#xff0c;先用页面跳转的方式实现&#xff0c;后面…

【含文档】基于Springboot+Vue的旅游信息管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 系统定…

QSettings 使用详解

QSettings 类是 Qt 框架中的一个重要类&#xff0c;用于存储和访问应用程序的设置和配置。它提供了一种简单的方法来读取和写入应用程序的配置数据&#xff0c;支持多种存储格式&#xff0c;包括 Windows 注册表、INI 文件和 XML 文件等。 主要功能 1. 存储设置&#xff1a;可…

PDF在线编辑器推荐!一站式解决PDF编辑难题!

当你要对PDF文件进行编辑时&#xff0c;一款PDF编辑器就十分重要。今天小编就为大家推荐几款PDF编辑器&#xff0c;有在线的&#xff0c;也有本地的&#xff0c;大家可以根据自己的需求体验选择&#xff01; Foxit PDF Edit 直达链接&#xff1a;editor.foxitsoftware.cn Fo…

大舍传媒-海外媒体发稿:为您打造全球品牌影响力

大舍传媒-海外媒体发稿&#xff1a;为您打造全球品牌影响力 在当今全球化的商业环境中&#xff0c;企业若想在激烈的市场竞争中脱颖而出&#xff0c;拓展全球市场&#xff0c;提升品牌影响力至关重要。大舍传媒的海外媒体发稿服务&#xff0c;正是您实现这一目标的得力助手。 …

某宝228滑块 请求头 bx_pp、bx_et、以及slide接口中参数n值。90%左右的成功率,轨迹不会爆,需要的联系

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关。 本文章未经许可禁止转载&#xff0c;禁止任何修改后二次传播&#xff0c;擅自使用本文讲解的技术而导致的任何意外&#xff…

PostgreSQL学习笔记:学习总结

一、架构 1. 常驻进程&#xff08;Postmaster&#xff09; 管理后端的常驻进程&#xff0c;默认监测UNIX Domain Socket和TCP/IP&#xff08;Windows等一部分平台只监测TCP/IP&#xff09;的5432端口&#xff0c;等待前端连接处理&#xff0c;监测的端口号可在设置文件postgre…

基于腾讯云的AI视频课程制作工具

1. 需求信息 1.1 需求背景 讲师们在制作视频的过程中&#xff0c;发现录制课程比较麻烦&#xff0c;要保证环境安静&#xff0c;保证录制过程不出错&#xff0c;很容易反复重复录制&#xff0c;为了解决重复录制的工作量&#xff0c;想通过 ai 课程制作工具&#xff0c;来解决…

注册安全分析报告:北外网校

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

【软考】设计模式之中介者模式

目录 1. 说明2. 应用场景3. 结构图4. 构成5. 适用性6. 优点 1. 说明 1.用一个中介对象来封装一系列的对象交互。2.中介者使各对象不需要显式地相互引用&#xff0c;从而使其耦合松散&#xff0c;而且可以独立地改变它们之间的交互。3.中介者模式&#xff08;Mediator Pattern&…

Qt-自定义控件鼠标事件键盘事件定时器绘图

1. 自定义控件 1.1 创建自定义控件 1.在项目目录上右键&#xff0c; 选择 "Add New" 2.选择 "Qt" --> "Qt 设计师界面类" 3.根据需求选择模板&#xff0c;此处选择空窗口 4.设置类名 和 相关文件名 使用设计师界面类会产生三个文件&…

媒界:插混VS增程:魏牌蓝山用天花板Hi4诠释都市家庭用车最优解

在新能源混动领域&#xff0c;关于插混、增程谁才是混动最优解&#xff0c;一直业内争论的焦点。正如路遥知马力、日久见人心。对于新能源动力系统的评判标准来说&#xff0c;最好的答案就是路上见。 近日&#xff0c;一位媒体博主驾驶着魏牌全新蓝山从阿拉善到武汉往返狂飙30…

Python面向对象编程:封装和私有属性④

文章目录 1. 引言2. 什么是封装&#xff1f;3. 公有属性和方法4. 私有属性和方法5. 属性访问器&#xff08;Getters 和 Setters&#xff09;6. 使用 property 函数7. 综合示例7.1 项目结构7.2 模块代码__init__.pystudent.pycourse.pymanager.py 7.3 主程序代码main.py 7.4 运行…

cmake模板-支持编译动态/静态文件

代码链接&#xff1a;代码仓库 git clone https://gitee.com/etsuyou/cmake-template.git模板 模板截图 如何使用 在src和inc中写代码 此处用我默认提供的代码 ./go.sh cmake 生成Makefile ./go.sh make 生成bin文件和.a以及.so ./go.sh run app 运行 ./go.sh clean 以…

Tomcat服务部署及优化

一、Tomcat的基本介绍 1. tomcat是什么&#xff1f; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;T…

QT QML 练习8-Simple Transformations

简单的转换&#xff08;Simple Transformations&#xff09; 转换操作改变了一个对象的几何状态。QML元素对象通常能够被平移&#xff0c;旋转&#xff0c;缩放。下面我们将讲解这些简单的操作和一些更高级的用法。 我们先从一个简单的转换开始。用下面的场景作为我们学习的开始…

Python学习100天第9天之面向对象进阶

1 前言 在前面的章节我们已经了解了面向对象的入门知识&#xff0c;知道了如何定义类&#xff0c;如何创建对象以及如何给对象发消息。为了能够更好的使用面向对象编程思想进行程序开发&#xff0c;我们还需要对Python中的面向对象编程进行更为深入的了解。 2 property装饰器…