【JavaEE初阶】深入透析文件-IO关于文件内容的操作(四种文件流)
前言
🌟🌟本期讲解关于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)
以上小编都在代码中进行了注解,小编这里就不再进行讲解了,下期将直接进入网络的编程了~~
🌅🌅🌅~~~~最后希望与诸君共勉,共同进步!!!
💪💪💪以上就是本期内容了, 感兴趣的话,就关注小编吧。
😊😊 期待你的关注~~~
相关文章:

【JavaEE初阶】深入透析文件-IO关于文件内容的操作(四种文件流)
前言 🌟🌟本期讲解关于CAS的补充和JUC中有用的类,这里涉及到高频面试题哦~~~ 🌈上期博客在这里:【JavaEE初阶】文件-IO之实现文件系统的操作如何进行实现-CSDN博客 🌈感兴趣的小伙伴看一看小编主页&…...

复习:react 中的 refs,怎么使用,有哪些使用场景
在 React 中,refs(引用)是一个重要的特性,它允许开发者直接访问 DOM 元素或者 React 组件的实例。以下是对 React 中 refs 的使用及其使用场景的详细解释: 一、refs 的使用方法 字符串引用 在早期的 React 版本中,可以通过字符串来设置 ref。然而,这种方法已经被废弃,…...

Python OpenCV精讲系列 - 目标检测与识别深入理解(二十)
💖💖⚡️⚡️专栏:Python OpenCV精讲⚡️⚡️💖💖 本专栏聚焦于Python结合OpenCV库进行计算机视觉开发的专业教程。通过系统化的课程设计,从基础概念入手,逐步深入到图像处理、特征检测、物体识…...

golang中的上下文
背景 在Go语言中,使用context包来管理跨API和进程间的请求生命周期是常见的做法。特别是在涉及到并发编程时,如启动协程(goroutine)来处理异步任务,正确地传递和监听context变得尤为重要。比如,在gin框架中…...

Navigation2 算法流程
转自 https://zhuanlan.zhihu.com/p/405670882 此文仅作学习笔记 启动流程 在仿真环境中启动导航包的示例程序,执行nav2_bringup/bringup/launch/tb3_simulation_launch.py文件。ROS2的launch文件支持采用python语言来编写以支持更加复杂的功能,本文件…...

OpenAI swarm+ Ollama快速构建本地多智能体服务 - 1. 服务构建教程
OpenAI开源了多智能体编排的工程swarm,今天介绍一下swarm与OLLAMA如何结合使用的教程,在本地构建自己的多智能体服务,并给大家实践演示几个案例。 安装步骤 安装ollama,在官网下载对应操作系统的版本即可,下载后用ol…...

HTB:Wifinetic[WriteUP]
目录 连接至HTB并启动靶机 1.What is the name of the OpenWRT backup file accessible over FTP? 使用nmap对靶机21、22端口进行脚本、服务信息扫描 2.Whats the WiFi password for SSID OpenWRT? 3.Which user reused the WiFi password on thier local account? 4.…...

专业学习|马尔可夫链(概念、变体以及例题)
一、马尔可夫链的概念及组成 (一)学习资料分享 来源:024-一张图,但讲懂马尔可夫决策过程_哔哩哔哩_bilibili 马尔可夫链提供了一种建模随机过程的方法,具有广泛的应用。在实际问题中,通过转移概率矩阵及初…...

RK3576 安卓SDK编译环境搭建
编译 Android14 对机器的配置要求较高: 建议预留500G存储 多分配CPU和内存 建议使用 Ubuntu 20.04 操作系统或更高版本 sudo apt-get updatesudo apt-get install make gcc sudo apt-get install g++ patchelf gawk texinfo chrpath diffstat binfmt-support sudo apt-get …...

Renesas R7FA8D1BH (Cortex®-M85) 上光电编码器测速功能
目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 硬件架构 2.1 硬件框架结构 2.2 测速功能原理介绍 2.2.1 理论描述 2.2.2 实现原理 2.2.3 系统硬件结构 3 软件实现 3.1 FSP配置项目 3.2 代码实现 3.2.1 初始化函数 3.2.2 功能函数 3.…...

软件测试学习笔记丨Linux三剑客-sed
本文转自测试人社区,原文链接:https://ceshiren.com/t/topic/32521 一、简介 sed(Stream editor)是一个功能强大的文本流编辑器,主要用于对文本进行处理和转换。它适用于自动化处理大量的文本数据,能够支持…...

Vue脚手架学习 vue脚手架配置代理、插槽、Vuex使用、路由、ElementUi插件库的使用
目录 1.vue脚手架配置代理 1.1 方法一 1.2 方法二 2.插槽 2.1 默认插槽 2.2 具名插槽 2.3 作用域插槽 3.Vuex 3.1 概念 3.2 何时使用? 3.3 搭建vuex环境 3.4 基本使用 3.5 getters的使用 3.6 四个map方法的使用 3.6.1 mapState方法 3.6.2 mapGetter…...

使用yml文件安装环境时,如何添加conda和pip的镜像源
博客参考 添加conda镜像源 name: NAME channels:- conda-forge- pytorch- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r- https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/msys2- defaults depende…...

c语言经典100例
1.字符串转为数字 #include <stdio.h>int strToInt(char *s) {int num0;int sign1;int step1;if (*s -){sign -1;s;}while (*s > 0&&*s < 9){num num*10(*s-0);step 10;s;}return num*sign; }int main() {char a[10] "-1234";char *s a ;pr…...

百易云资产管理运营系统 ufile.api.php SQL注入漏洞复现
0x01 产品描述: 百易云资产管理运营系统,是专门针对企业不动产资产管理和运营需求而设计的一套综合解决方案。该系统能够覆盖资产的全生命周期管理,包括资产的登记、盘点、评估、处置等多个环节,同时提供强大的运营分析功能&#…...

【分布式微服务云原生】《Redis RedLock 算法全解析:应对时钟漂移与网络分区挑战》
《Redis RedLock 算法全解析:应对时钟漂移与网络分区挑战》 摘要: 本文深入探讨 Redis 的 RedLock 算法,详细阐述其步骤及工作原理,同时重点分析该算法如何处理时钟漂移和网络分区这两个常见的分布式系统问题。读者将通过本文深入…...

OceanBase 的写盘与传统数据库有什么不同?
背景 在数据库开发过程中,“写盘”是一项核心操作,即将内存中暂存的数据安全地转储到磁盘上。在诸如MySQL这样的传统数据库管理系统中,写盘主要有以下几步:首先将数据写入缓存池;其次,为了确保数据的完整性…...

用Java爬虫API,轻松获取taobao商品SKU信息
在电子商务的世界里,SKU(Stock Keeping Unit,库存单位)是商品管理的基础。对于商家来说,SKU的详细信息对于库存管理、价格策略制定、市场分析等都有着重要作用。taobao作为中国最大的电子商务平台之一,提供…...

OpenHarmony 入门——ArkUI 自定义组件内同步的装饰器@State小结(二)
文章大纲 引言一、组件内状态装饰器State1、初始化2、使用规则3、变量的传递/访问规则说明4、支持的观察变化的场景5、State 变量的值初始化和更新机制6、State支持联合类型实例 引言 前一篇文章OpenHarmony 入门——ArkUI 自定义组件之间的状态装饰器小结(一&…...

【Linux驱动开发】嵌入式Linux驱动开发基本步骤,字符设备开发入门,点亮LED
【Linux驱动开发】嵌入式Linux驱动开发基本步骤,字符设备开发入门,点亮LED 文章目录 开发环境驱动文件编译驱动安装驱动自动创建设备节点文件 驱动开发驱动设备号地址映射,虚拟内存和硬件内存地址字符驱动旧字符驱动新字符驱动 应用程序开发…...

搬砖14、Python网络编程入门
网络编程入门 计算机网络基础 计算机网络是独立自主的计算机互联而成的系统的总称,组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享。今天计算机网络中的设备和计算机网络的用户已经多得不可计数,而计算机网络也可以称得上是一个“复…...

Transformer: Attention is All you need
Transformer Transformer是基于Encoder-Decoder结构的,将Seq2Seq中的RNN/GRU部分更换为Self-Attention部分 位置编码 Positional Encoding Self-attention丢失了位置信息 CNN 卷积神经网络可以保存相邻的位置信息 RNN 是顺序输入的,是包含了位置信息…...

C++:排序算法
目录 一、插入排序 1.直接插入排序 2.希尔排序 二、交换排序 1.冒泡排序 2.快速排序 三、选择排序 1.简单选择排序 2.堆排序 四、归并排序 1.二路归并排序的递归实现 2.二路归并排序的非递归实现 一、插入排序 1.直接插入排序 直接插入排序的基本思想是ÿ…...

期货日内稳赢策略:双15交易法详解
Eagle Trader的考试不仅涵盖了CFD交易,期货交易的考生人数也颇为可观。与外汇市场相比,期货在国内市场的普及程度更高,参与的群体也更为广泛。这得益于期货市场在国内相对成熟的监管体系,使得交易员对期货有了更深入的了解和信任。…...

2024年10月第2个交易周收盘总结:怎样卖出!
计划自己的交易,交易自己的计划。 跟随市场而情绪波动,最终一定会导向失败! 连续、平稳、冷静地惯彻交易计划,比什么都重要! 交易本身是极其简单和清楚的,让事情变复杂的原因不是行情走势和交易本身&…...

mysql 不支持utf8mb4_0900_ai_ci
Unknowncollation:‘utf8mb4_0900_ai_ci’ 解决方案: 1. 升级mysql为8.0以上(不包含8.0) 2. 修改编码类型: utf8mb4_0900_ai_ci/utf8mb4_0900_ci 修改为utf8_general_ci utf8mb4修改为utf8 utf8mb4_0900_ai_ci 是一种 MySQL 数…...

第10篇:防火墙与入侵检测系统
目录 引言 10.1 防火墙的基本概念 10.2 防火墙的分类 10.3 防火墙策略的配置与实现 10.4 入侵检测系统(IDS) 10.5 防火墙与IDS的结合 10.6 总结 第10篇:防火墙与入侵检测系统 引言 在当今的数字世界中,网络安全已经成为企…...

Jmeter监控服务器性能
目录 ServerAgent 安装 打开Jmeter ServerAgent 在Jmeter上监控服务器的性能比如CPU,内存等我们需要用到ServerAgent,这里可以下载我分享 ServerAgent-2.2.3.zip 链接: https://pan.baidu.com/s/1oZKsJGnrZx3iyt15DP1IYA?pwdedhs 提取码: edhs 安装…...

通过前端UI界面创建VUE项目
通过前端UI界面创建VUE项目,是比较方面的一种方式,下面我们详细分析一下流程: 1、找到合适目录 右键鼠标,点击在终端打开 2、开始创建 输入 vue ui 浏览器弹出页面 3、点击Create项目 显示已有文件列表,另外可以点击…...

Python网络爬虫:分析淘宝商品热度与销量[进阶深度优化]
要更全面和深入地介绍基于Python的网络爬虫系统,分析淘宝商品买卖热度、销量以及统计热点关键词,我们可以进一步扩展内容,涵盖更多技术细节、优化策略、数据分析、以及机器学习的结合,形成一个功能强大、可靠的爬虫系统。下面是进一步的补充。 1. 爬虫策略的深度优化 为了…...