【JAVA】#详细介绍!!! 文件操作之文件内容操作(2)!

news2024/11/22 20:55:43

本文主要是针对文件内容的操作进行展开,文件内容操作无非就两种

1.针对文件进行“读” 2.针对文件进行“写”

目录

文件内容读写的形式

字符流

字节流

文件内容操作

InputStream:以字节流的形式进行读操作

创建方式:

FileInputStream的构造方法:

常用的构造方法:

读操作read:

这里的read有三个版本

 

OutputStream:以字节流的方式进行写操作

创建对象

写操作:write

字符流读写操作:Reader和Writer

Reader:以字符流的形式进行读文件操作

Writer:以字符流的形式进行写文件操作

关闭文件资源释放相关

不释放资源的后果

针对文件资源泄露的情况,我们有下面两种方法:

1. 手动调用close方法进行资源关闭

2. try with resources 写法:

为什么能自动释放:



文件内容读写的形式

字符流

在进行文件内容操作时,读写的基本单位是“字符”

每次读写至少都是一个字符

在文件内容操作,专门提供了一组针对字符流操作的类:Reader,Writer……

字节流

在进行文件内容操作时,读写的基本单位是“字节”

每次读写至少都是一个字节

在文件内容操作,专门提供了一组针对字节流操作的类:InputStream,OutputStream……

文件内容操作

InputStream:以字节流的形式进行操作

创建方式:

原码:

 我们看到InputStream类是一个abstract修饰的抽象类,不能直接实例化,只能通过它的非抽象子类来进行对象的创建

正确的创建方式:

InputStream inputStream = new FileInputStream();

由于我们需要进行的文件操作,所以此时创建的是针对文件的InputStream:FileInputStream

FileInputStream的构造方法:

常用的构造方法:

1. 以File对象作为参数,对该对象指定的文件内容进行操作

2. 以文件路径(绝对路径/相对路径)作为参数,对指定文件的内容进行操作

注意:需要抛出异常:FileNotFoundException:如果操作的文件不存在就会抛出该异常

例如:

InputStream inputStream = new FileInputStream("test1/test.txt");

此时就建立了InputStream对象inputStream,通过这个对象与当前项目路径下的test1文件夹下的test.txt文件进行了绑定,下面就可以通过inputStream这个对象来对test.txt进行操作了

读操作read:

由于这个test.txt文件中没有数据,所以我们手动写入一个hello world

通过调用read方法

        这里使用我们上面例子中创建的inputStream对象

inputStream.read();

注意:read一次返回的是一个字节,但是返回类型是一个int类型

因为:一个byte类型的数据范围是-128-127(有符号),或者0-255(无符号)这里使用的范围是0-255,

read说明文档:如果返回-1那么说明文件已经读完了,因为读完了并没有读取到需要返回的字节,所以也不能返回范围内的数据,此时就规定读完返回-1

原码解释说明:

这里的read有三个版本

1. 无参的read版本:read()

从文件开头开始读,每次读一个字节

try(InputStream inputStream = new FileInputStream("test1/test.txt")){
     //.....这里面进行inputStream这个文件对象的文件操作
     while(true){
           int b = inputStream.read();
           if(b == -1){
                //当read的返回值为-1时,说明文件数据已经被读完了
                break;
           }
           System.out.println(b);
     }
}

结果:

此时输出的结构并不是hello world ,而是一段数字,这里也是非常科学的

因为结果输出为read的返回值,也就是test.txt中每个字节内容的返回值

解析:

通过ASCll码解析一下我们就能得到,104对应的就是‘h’,101对应的是:‘e’,所以这些数字对应下来正好是我们test.txt中的内容"hello world"

注意:如果文件中的内容是中文,返回的也会是数字,但是此时数组就不一定是ascll码了,因为在计算机中的中文是由字符集编码表示,所以如果内容是中文的话,需要通过对应的字符集编码去反解析到对应的中文

System.out.print((char)b;//通过char强转成字符类型显示

结果:

2. 带一个byte数组的参数版本:read(byte[] b)

带有一个byte[] b的参数版本读取本质和上面其实是一样的,只不过给read读取到的结果指定了一个容器数组b,所以我们通过这个版本的read去读取数据,结果会放到b数组中

3.  带三个参数的版本:read(byte[] b , int off , int len)

这个又是在2的基础上增加了一个开始读取的位置(int off),增加了一个读取的字节长度(int len):意思就说从off的偏移量处开始读取,读取len个字节长度,把读取的结构放到b中


OutputStream:以字节流的方式进行写操作

操作和前面的InputStream基本一样

创建对象

和InputStream一样OutputStream也是一个abstract修饰的抽象类,所以也不能直接实例对象,而针对文件的写操作,需要使用子类FileOutputStream

OutputStream outputStream = new FileOutputStream("test1/test.txt")

FileOutputStream常见的构造方法

1. 以File对象作为参数,对该对象指定的文件内容进行操作

2. 以文件路径(绝对路径/相对路径)作为参数,对指定文件的内容进行操作

注意:需要抛出异常:FileNotFoundException:如果操作的文件不存在就会抛出该异常

写操作:write

使用上面创建的outputStream对象调用write方法

outputStream.write();

write方法也有几种版本

 1. 无参版本:write(int b)

调用一次write,一次写入一个字节

try(OutputStream outputStream = new FileOutputStream("test1/test.txt")){
    outputStream.write(98);
}

通过outputStream对象往绑定的test.txt中写入一个值为98的字节,那么98对应到的是b字符

此时我们的test.txt中的内容就是b了

注意

不是同一次项目执行的写入,会更新掉文件里面的内容,每次执行程序写入都是重新写入

解释:

如果第一次执行程序往test.txt中写入了一个a,此时test.txt文件中的内容就是a了

第二次执行程序往text.txt中写入一个b,此时test.txt文件中的内容就只有b了,a被清除了

2. 带有一个byte数组参数的版本:write(byte[] b)

这个版本的write是进行读字节数组,调用这个write则把b数组中的字节元素都读入到指定文件中

3. 带三个参数的版本:write(byte[] b , int off , int len)

这个版本与2差不多相同,只不过在那个基础上加上了数组偏移量(off)和写入的长度(len),

就是从b数组的off处元素开始写入进文件,写入的元素个数为len


注意由于InputStream和OutputStream都是是字节流形式的I/O操作类,所以不只是可以进行文件内容的读写操作,在网络编程是也可以通过InputStream和OutputStream对网卡进行读写操作


字符流读写操作:Reader和Writer

Reader:以字符流的形式进行读文件操作

Reader以字符流的形式对文件进行读操作,操作过程和方法和InputStream基本一样,

都是调用read方法,里面的参数和参数的含义也一样,同样也是读到末尾返回-1,使用时可对照前面的InputStream使用

代码:

try(Reader reader = new FileReader("test1/test.txt")){
      while(true){
           int b = reader.read();
           if(b == -1){
               break;
           }
           System.out.println((char)b);
     }
} catch (IOException e) {
     e.printStackTrace();
}

Writer:以字符流的形式进行写文件操作

Writer以字符流的形式对文件进行写操作,操作过程和方法和OutputStream基本一样,

都是调用write方法,里面的参数和参数的含义也一样,使用时可对照前面的OutputStream使用

代码:

try(Writer writer = new FileWriter("test1/test.txt")) {
      writer.write('a');
      writer.write('b');
      writer.write('c');
} catch (IOException e) {
      e.printStackTrace();
}

结果:


关闭文件资源释放相关

不释放资源的后果

注意:我们可以理解为InputStream和OutputStream是在与硬盘中的文件进行绑定,相当于遥控器,通过创建的对象就能对硬盘中的绑定文件进行读写操作,

此时也相当于c语言中的打开文件操作,有打开文件操作,那么为了防止文件资源泄露则必然需要关闭文件,在操作完文件对象之后,我们需要关闭(解除)绑定:调用close方法

这里泄露的文件资源:主要是文件描述符

注意

我们都知道操作系统在对进程进行管理时(PCB),会记录当前进程访问的硬盘资源,从而生成一条条文件描述符,组成当前进程的文件描述符表,但是PCB的文件描述符表数组长度是有限的,如果我们不进行手动关闭文件去 释放资源的话,当文件描述符表数组被占满后,进程就不能打开新的文件了,会导致进程无法正常工作甚至是崩溃,从而造成非常严重的Bug

针对文件资源泄露的情况,我们有下面两种方法:

1. 手动调用close方法进行资源关闭

inputStream.close();

2. try with resources 写法:

带有资源的try操作,会在try代码块结束,会自动对资源执行close操作

写法:

把创建InputStream等这些的I/O组类对象时,放入try中创建,再在try代码块中进行对象的文件文件操作,在退出代码块时会自动释放try中创建的I/O资源(推荐写法:自动释放不会遗忘更稳妥

try(InputStream inputStream = new FileInputStream("test1/test.txt")){
    //.....这里面进行inputStream这个文件对象的文件操作
}

此时当执行完try里面的文件操作后,退出try时会自动释放inputStream对象的资源

为什么能自动释放:

因为InputStream和OutPutStream都实现了Closeable接口

实现了Closeable接口的类,就可以使用try with resources语法,然后try在代码块结束后就会自动调用close


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

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

相关文章

2023年深圳CPDA数据分析师认证到这里就对了哦

CPDA数据分析师认证是大数据方面的认证,助力数据分析人员打下扎实的数据分析基础知识功底,为入门数据分析保驾护航。 帮助数据分析人员掌握系统化的数据分析思维和方法论,提升工作效率和决策能力,遇到问题能够举一反三&#xff0c…

MySQL索引的底层实现原理

索引的底层实现原理 数据库索引是存储在磁盘上的,当数据量大时,就不能把整个索引全部加载到内存了,只能逐一加载每一个磁盘块(对应索引树的节点),索引树越低,越“矮胖”,磁盘IO次数…

主动式和被动式电容笔的区别在哪?苹果平替笔性价比高的

被动式电容笔与主动式电容笔最大的不同之处在于主动式电容笔具有更加广泛的应用领域,可以与各种种类的电容式屏幕相匹配。随着对电容笔的了解,电容笔的使用也日益广泛。而且平替电容笔的制造工艺已经日趋成熟,正在走向实用,并且已…

易观千帆 | Q1运营报告:手机银行MAU超5.3亿,行业“内卷”超出想象

易观:由中国电子银行网、易观分析联合发布的“2023中国手机银行综合运营报告”显示:在经济企稳回升的大背景下,中国手机银行第一季度综合运营指数季度内呈平稳上升态势,手机银行活跃人数环比增幅逐月递增,促使活跃用户…

Redis主从复制和哨兵模式

Redis主从复制 概念 主从复制,是指将一台Redis服务器的数据,复制到其他的Reds服务器。前者称为主节点(master / leader),后者称为从节点(slave / follower)。 数据的复制是单向的,只能由主节点到从节点。 Master以写为主,Slave…

无公网IP,SSH远程连接Linux CentOS服务器【内网穿透】

目录 视频教程 1. Linux CentOS安装cpolar 2. 创建TCP隧道 3. 随机地址公网远程连接 4. 固定TCP地址 5. 使用固定公网TCP地址SSH远程 本次教程我们来实现如何在外公网环境下,SSH远程连接家里/公司的Linux CentOS服务器,无需公网IP,也不…

Go语言的基础语法以及变量和常量

目录 基础语法 行分隔符 注释 标识符 变量 声明 赋值 作用域 常量 声明 iota 基础语法 行分隔符 在Go程序中,一般一行就是一个语句,不像Java等可以在一行写多个语句一样,而且最后也不需要用";"来结尾。 例如&#xf…

【华为OD机试 2023最新 】箱子之字形摆放(C语言题解 100%)

文章目录 题目描述输入描述输出描述备注用例题目解析C语言题目描述 有一批箱子(形式为字符串,设为str), 要求将这批箱子按从上到下以之字形的顺序摆放在宽度为 n 的空地,请输出箱子的摆放位置。 例如:箱子ABCDEFG,空地宽度为3,摆放结果如图: 则输出结果为: AFG BE C…

Linux Shell编程入门到实战(六)

🍓 简介:java系列技术分享(👉持续更新中…🔥) 🍓 初衷:一起学习、一起进步、坚持不懈 🍓 如果文章内容有误与您的想法不一致,欢迎大家在评论区指正🙏 🍓 希望这篇文章对你有所帮助,欢…

国考省考结构化面试:整体介绍,考试题型,考试流程,仪表着装,如何备考?

国考省考结构化面试:整体介绍,考试题型,考试流程,仪表着装,如何备考? 2022找工作是学历、能力和运气的超强结合体! 公务员特招重点就是专业技能,附带行测和申论,而常规国考省考最重…

基于ChatGPT的文档知识库客服系统-支持上传网址/文本/docx等数据

现在,很多公司都有自己的内容知识库,会产生大量的碎片话的内部知识,但是这样内部知识难以整合搜索。 我开发的文档知识库客服系统 gofly.v1kf.com ,可以应用于企业内部知识库管理,用户可以使用自然语言提问&#xff0c…

杂谈:铜钱儿

我个人是比较喜欢铜钱儿的。 收藏其实谈不上,因为我不买什么名品,都是玩儿一些屌丝钱,穷嘛,这个也没啥好掩饰的~ 瞎聊点儿钱币的话题吧。 小时候是家里偶尔能发现铜钱儿,一般都是清朝的,乾隆居多。有时候地…

【苹果IM群发家庭推日历推群发】筛选“兼容性”,默认为高效,挑选“兼容性”视频和图象不操纵HEVC的新格式,承袭使用旧的MPEG格式

推荐内容IMESSGAE相关 作者✈️IMEAE推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容3.日历推 *** …

Vue学习笔记(0504)

此页面对应着创建的Vue项目的显示页面 默认可以从下面的地址进行访问:http://localhost:8080 这里由于创建项目时我们选择了语法规范,所以我们在保存时哪些不符合代码规范的地方就会报错,只有修正代码规范后错误才会消失。 这里可以看出我们…

PyQt5桌面应用开发(7):文本编辑+语法高亮与行号

本文目录 PyQt5桌面应用系列代码编辑和语法高亮的亿点点细节作为用户报表的文本控件作为编辑器的文本控件代码编辑器的需求 代码编辑[^1]语法高亮[^2]小结 PyQt5桌面应用系列 PyQt5桌面应用开发(1):需求分析 PyQt5桌面应用开发(2&…

三、Spring Cloud Alibaba组件nacos

一、什么是Nacos 官方地址: https://nacos.io/zh-cn/docs/v2/what-is-nacos.html 概念: 服务(Service)是 Nacos 世界的一等公民。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理。即集注册中心配置中心服务管理的一个平…

【苹果推IM,苹果iMessage相册推】当Apple APNS推送服务器从您的应用程序接吸取注册消息时,它将为您回到一串devicetoken(很是重要)

推荐内容IMESSGAE相关 作者✈️IMEAE推荐内容iMessage苹果推软件 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容1.家庭推内容 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容2.相册推 *** 点击即可查看作者要求内容信息作者✈️IMEAE推荐内容3.日历推 *** …

养鱼-新手快乐缸阶段的一点总结

这是学习笔记的第 2456篇文章 养鱼这件事情上,除了满足了孩子的希望,也算是满足了自己的一点爱好。 从3月份开始的鱼缸进化到现在,对于养鱼这件事情的态度已经发生了很大的变化,我也趁此机会总结和梳理一下,先来定性我…

第三章:JavaScript 脚本语言(二)

最近发生了好多事情。 一、String对象 String对象是动态对象&#xff0c;需要创建实例后才可以引用其方法与属性。在js中也可以直接使用单引号或者双引号来直接创建实例化的对象。 anchor(name) 为字符串对象内容两边加上html<a name name></a>标记对bi…

【网络】网络基础入门

文章目录 局域网和广域网协议协议概念协议分层数据传输条件 OSI七层模型&#xff08;了解&#xff09;TCP/IP五层&#xff08;四层&#xff09;模型网络传输基本流程报头局域网通信原理以太网(了解)网络传输流程图数据包封装和分用 六、IP与MAC地址 局域网和广域网 独立模式: …