洋桥网站建设/谷歌广告推广怎么做
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
这篇博客是关于 文件操作和IO 的下半篇的内容,主要介绍的是 文件内容的各种操作 ;
三、文件内容的操作
关于文件读写的操作,主要分为这几大块:打开文件、关闭文件、读文件、写文件 ;
其中,读写文件 是关键操作 ;
但是,在读写文件之前,必须要打开文件;在使用完毕之后,必须要关闭文件 ;
在 Java中,关于文件读写,提供了几组相关的类(是父类,还有许多其他子类继承):
- 第一组:InputStream类、OutputStream类 ——> 字节流(以字节为单位的流,用来操作二进制文件的)
- 第二组:Reader类、Writer类 ——> 字符流(以字符为单位的流,用来操作文本文件的)
关于 "流",是计算机中一种常见的概念 ;
比如说,如果想接住 100ml的水 ;
可以一次接 100ml,一次就搞定;可以一次接 50ml,两次就搞定;可以一次接 10ml,十次就搞定 ......
类似于水流,可以随心所欲的控制 读写的数据量
如:想 读/写 100字节的数据 ~
可以一次 读/写100字节,一次就搞定;可以一次 读/写50字节,两次就搞定;可以一次 读/写10字节,十次就搞定 ......
于是,我们就把这种 读/写 方式,称为 面向流的读/写方式 ;
3.1 读文件
3.1.1 使用字节流读文件
我们可以在 Idea 上输入 InputStream类,点击 Ctrl + 左键,便可以发现,InputStream 是一个抽象类,不可以直接 new,需要使用 new InputStream 子类的方式来进行实例化:
方法:
关于 InputStream类 的常用方法有下面几个:
需要注意的是,要在打开之后 一定记得要关闭文件!!!
—— 需要释放资源(内存、文件描述符表)
—— 如果打开文件之后,忘记关闭,造成的结果非常大的(文件资源泄露,就像是定时炸弹一样,并不是马上就泄露完,这就非常的麻烦了)
一个进程,会使用PCB来描述(此时 只考虑单线程)
PCB 里面有很多属性,文件描述符表 就是其中的一个属性,它可以看作是一个数组(顺序表),其中的每个元素 都对应着当前打开的文件,这个数组的下标 就称为 "文件描述符" ~
每次打开文件,都会在文件描述符表中 占据一个位置,每次关闭文件,都会释放一个位置;由于文件描述符表的长度是存在上限的,所以如果一个线进程一直在打开文件,没有释放文件,此时就会导致 后续进程在打开的时候失败!!!
代码示例:
package file;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream;public class Demo6 {//使用一下 InputStream类public static void main(String[] args) throws IOException {// 1.打开文件//打开文件成功,就得到了 InputStream对象,//后续针对文件的操作,都是通过 InputStream 来展开的// (就相当于是 空调遥控器 可以操控空调,内存中的 InputStream对象 可以操控硬盘里面的 test2.txt文件)//像 inputStream 这一类的 “遥控器”,在计算机中 我们通常称为:句柄(Handler)InputStream inputStream = new FileInputStream("./test2.txt");// 2.读取文件while (true) {int b = inputStream.read();if(b == -1) {//此时,文件读完了break;}System.out.println(b);}// 3.关闭文件//关闭文件,以释放 内存资源 和 文件描述符表inputStream.close();} }
同时,我在 test2.txt 文件下输入了:hello
运行结果:
-- 当然,我们也可以采用其他的 read方法 来读取数据
-- 这里可以把 2.读取文件 的代码改成:byte[] b = new byte[1024];int len = inputStream.read(b);System.out.println(len);for (int i = 0; i < len; i++) {System.out.println(b[i]);}
此时,运行的结果是:
3.1.2 使用字符流读文件
需要注意的是,在上面的 test2.txt 文件中 存储的是英文状态的 "hello",但是但我们把它改成中文状态的 "你好" 时,那结果可就不一样了 ;
运行结果:
说明:
当前格式 是 utf-8 的格式编码,它的汉字一般是 三个字节一个汉字
如果想要直观的获取 中文,那就需要去手动的转换(如下所示):
-- 这里可以把 2.读取文件 的代码改成:byte[] b = new byte[1024];int len = inputStream.read(b);//把 0到len 这一段数据构成一个字符串,并且指定构造字符集的格式编码 —— utf-8String s = new String(b,0,len,"utf-8");System.out.println(s);
运行结果:
通过字节流,读取文本数据的时候,虽然可以读取到,但是要想真正还原成原始的版本,还是比较麻烦的,需要手动处理;
因此就可以使用 字符流 来解决上述问题(字符流 就相当于已经在底层 已经完成了里面的转换了);
代码示例:
package file;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;public class Demo7 {//使用字符流读文件public static void main(String[] args) throws IOException {Reader reader = new FileReader("test2.txt");char[] buffer = new char[1024];int len = reader.read(buffer);for (int i = 0; i < len; i++) {System.out.print(buffer[i]);}//关闭资源reader.close();}
}
运行结果:
3.1.3 使用Scanner读取文件(推荐)
字符流来处理文本是比较方便的,但是 这里还有一种更为简单的方法,可以使用 Scanner 来读取文本文件 ;
Scanner scanner = new Scanner(System.in);
//以前我们使用的是这个样子的,可以从键盘上来输入数据
//其中,System.in 中的 in 就是 inputStream
//如果直接把 System.in 换成 inputStream
//需要 InputStream inputStream = new FileInputStream("文本");
//就可以去读自己写的文件
代码示例:
package file;import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.Scanner;public class Demo8 {//使用 Scanner 来读取文本文件public static void main(String[] args) throws IOException {InputStream inputStream = new FileInputStream("test2.txt");Scanner scanner = new Scanner(inputStream);String s = scanner.next();System.out.println(s);inputStream.close();} }
运行结果:
需要注意的是,其实在上述代码中,涉及到了 read操作,这就会引出 IOException异常,此时代码就会无法进行,后面的 关闭文件(close ) 的操作就不会被运行 ;
所以可以使用 try ... catch ... finally ... 的操作来避免的 ;
这里就不做过多演示了 ;
但是,最后就会发现,这个看起来就很啰嗦 ;
所以,就可以改成这个样子了 :
这样的操作叫做 try with resource(有资源的 try);
同时,这类写法 会在 try 实现结束之后,自动调用 inputStream 的 close方法(当然,并不是所有的类都可以这样放在try括号里面,要求这个类实现 Closeable接口,才可以这么做);
这种写法是比较推荐的写法;
3.2 写文件
字节流:OutputStream / FileOutputStream
字符流:Writer / FileWriter
以及,和 Scanner 相对的 PrintWriter 操作
OutoutStream类 的方法和上面的 InputStream类 的方法差不多,这里就不做过多介绍了,感兴趣的铁铁们可以自己去看看官方文档 ;
3.2.1 使用字节流写文件
package file;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;public class Demo10 {public static void main(String[] args) {try(OutputStream outputStream = new FileOutputStream("test2.txt")) {//写文件outputStream.write('h');outputStream.write('e');outputStream.write('l');outputStream.write('l');outputStream.write('o');}catch (IOException e) {e.printStackTrace();}}
}
当我们运行这段代码时,再去查看 text2.txt 文档时,就会发现:
如果想写一个字符串,那么就可以这样做:
package file;import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.charset.StandardCharsets;public class Demo10 {public static void main(String[] args) {try(OutputStream outputStream = new FileOutputStream("test2.txt")) {//写文件String s = "hello java";outputStream.write(s.getBytes());}catch (IOException e) {e.printStackTrace();}}
}
此时,运行程序后,再去看看 test2.txt 文件,就会发现:
注意的是,每一次 写文件 的操作都会清空原有的文件,然后再去重新写 ;
3.2.2 使用字符流写文件
package file;import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;public class Demo11 {public static void main(String[] args) {try(Writer writer = new FileWriter("test2.txt")) {writer.write("hello world");}catch (IOException e) {e.printStackTrace();}}
}
此时,运行程序之后,再次看看 test2.txt 文件,就会发现:
3.2.3 使用PrintWriter写文件
package file;import java.io.*;public class Demo12 {public static void main(String[] args) {try (OutputStream outputStream = new FileOutputStream("test2.txt")) {//此处的 PrintWriter 的用法 和 System.out 有相似之处PrintWriter printWriter = new PrintWriter(outputStream);printWriter.println("正在看博客的人好帅啊");printWriter.flush();}catch (IOException e) {e.printStackTrace();}}
}
此时,程序运行结束之后,再来看看 test2.txt 文件:
四、代码案例
总结
现在,关于文件操作的有关 内容就结束了,一定要熟练掌握有关文件操作的各个方法和理解其含义;
相关文章:

【JavaEE初阶】第四节.文件操作 和 IO (下篇)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言三、文件内容的操作 3.1 读文件 3.1.1 使用字节流读文件 3.2 写文件 3.2.1 使用字节流写文件 …...

华为OD机试用Python实现 -【分解质因数】 2023Q1A
华为OD机试题 本篇题目:分解质因数题目示例 1输入输出示例 2输入输出Code代码编写思路最近更新的博客 华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南...

博客项目
文章目录1. 创建项目2. 数据库设计3. 前置任务3.1 拦截器3.2 统一数据格式3.3 创建一个 Constant3.4 统一异常处理3.5 密码加密4. 功能实现4.1 登录功能4.2 注册功能4.3 博客列表页 (功能实现)4.3.1 左侧框4.3.2 右侧框 (分页功能 页面显示)4.4 博客详情…...

C++基础了解-20-C++类 对象
C 类 & 对象 一、C 类 & 对象 C 在 C 语言的基础上增加了面向对象编程,C 支持面向对象程序设计。类是 C 的核心特性,通常被称为用户定义的类型。 类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法…...

多态与虚(函数)表
前言续接上回(继承),我们了解了继承是如何通过虚基表,来解决派生类和父类有相同的成员变量的情况,但是类和对象中可不只有成员变量,如果成员函数也有同名,更或者如果我们想在访问不同情况&#…...

云舟案例︱视频孪生技术赋能城市安全综合管理场景,提升城市数智化水平
随着城市化发展进程的加快,人口不断膨胀,社会安全隐患等问题日益突出,成为困扰城市建设与管理的重要难题。针对各类社会治安突出问题,城市管理部门积极推进城市信息化建设,视频监控等各类信息化采集手段为城市数字化管…...

OpenFOAM 自定义gcc和openmpi安装
Compile Logs 编译很多次了但是好久不编还是会容易遗漏细节步骤,谨以为记。 使用自己编译的编译器和openmpi而不是系统自带的 库来完成对OF 的编译 依赖包安装 编译 GCC 编译 openmpi 编译OF 1依赖包安装 先 sudo apt-get install update当然,然后安…...

2023年3.8女神节买台灯怎么挑选?台灯用什么样的比较好
最近女神节,祝广大女性朋友们节日快乐啊。娱乐之余,一些实用的东西也是非常适合作为礼物送给女性朋友哦,台灯就是其中一个不错的选择。 台灯作为一种智能家居产品,不仅可见点缀卧室房间装饰,晚上的时候开启小范围照明&…...

近亿美元:人工心脏龙头永仁心医疗完成超大额A轮融资
近日,永仁心医疗器械有限公司(以下简称“永仁心医疗”)完成近一亿美元A轮融资,由北京科兴中维生物技术有限公司(SINOVAC科兴)领投,太平(深圳)医疗健康产业私募股权投资基…...

群智能优化计算中的混沌映射
经实验证明,采用混沌映射产生随机数的适应度函数值有明显提高,用混沌映射取代常规的均匀分布的随机数发生器可以得到更好的结果,特别是搜索空间中有许多局部解时,更容易搜索到全局最优解,利用混沌序列进行种群初始化、…...

【LeetCode】剑指 Offer 25. 合并两个排序的链表 p145 -- Java Version
题目链接:https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/ 1. 题目介绍(25. 合并两个排序的链表) 输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。 【测试用例】…...

如何应对危害机房安全的这几个常见要素?
随着现代化进程的推进,各行业对计算机的依赖性日益增高,计算机系统已经成为业务系统的重要组成部分。 在这种情况下,一旦机房设备出现故障,就会影响机房的正常运行,造成严重后果。尤其是银行、证券、海关等需要实时数据…...

【bug】antd全局的主题色样式被覆盖,被修改为`antd`默认的主题色
背景: 项目本身修改了主题色,配置如下: // umi配置文件 export default {theme: {primary-color: #2F54EB, // 全局主色}, };需要对图片上传组件做封装,并在项目中统一引用,如下 import { TdsUpload } from tdsComponents;环境信息 node tiandstiandsdeMacBook…...

MySQL DDL表操作【入门到精通】
目录 一、查询创建 1、查询当前数据库所有表 2、查看指定表结构 3、查询指定表的建表语句 4、创建表结构 二、数据类型 1、数值类型 2、字符串类型 3、日期时间类型 三、表操作-案例 设计一张员工信息表,要求如下: 对应的建表语句如下&#…...

《MySQL系列-InnoDB引擎28》表-约束详细介绍
约束 1 数据完整性 关系型数据库系统和文件系统的一个不同点是,关系数据库本身能保证存储数据的完整性,不需要应用程序的控制,而文件系统一般需要在程序端进行控制。当前几乎所有的关系型数据库都提供约束(constraint)机制,该机制…...

使用docker部署宝塔环境
经常需要部署lnmp环境,宝塔是一个不错的选择,包括安装各种插件,添加网站,设置定时任务等都非常方便。这次使用docker来部署。 拉取centos镜像 docker pull centos启动容器 1.-p端口映射,-d后台运行 2. 文件夹做一下映…...

ORB_SLAM2+kinect稠密建图
下载代码:https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map 运行代码: 解压代码后,删掉作者自己编译的build文件夹(下面三个都删除): ~/ORB_SLAM2_modified/build, ~/ORB_SLAM2_modified/T…...

mujoco安装及urdf转xml方法记录
参考 mujoco210及mujoco-py安装 下载适用于Linux或 OSX的 MuJoCo 2.1 版二进制文件 。 将mujoco210的下载的目录解压到~/.mujoco/mujoco210路径下. 注意:如果要为包指定非标准位置,请使用环境变量MUJOCO_PY_MUJOCO_PATH。 验证是否安装成功(…...

Visual Studio 2019 + Qt 项目版本信息新增到资源以及通过代码读取资源存储的版本信息
文章目录前言一、如何在VisualStudio2019中新增项目版本信息二、在程序中调用项目版本信息1.引入库version.lib1.1.通过vs自带的属性页引入库1.2.手动引入库2.新增版本信息读取类3.调用类获取信息总结前言 本文主要讲述如何在Visual Studio 2019 以及Qt结合的开发项目中&#…...

裸辞两个月还能不能找到工作?亲身经历告诉你结果·····
这是我在某论坛看到的一名网友的吐槽: 软件测试四年,主要是手动测试(部分自动化测试和性能测试,但是用的是公司内部自动化工具,而且我自动化方面是弱项。)现在裸辞两个月了,面试机会少而且面试…...

2023华为面试真题
【华为】面试真题: 面试前需要准备: 1. Java 八股文:了解常考的题型和回答思路; 2. 算法:刷 100-200 道题,记住刷题最重要的是要理解其思想,不要死记硬背,碰上原题很难࿰…...

【C++】C++11新特性——基础特性
文章目录一、列表初始化1.1 {}初始化1.2 initializer_list类型二、类型推导2.1 auto2.2 auto注意事项2.3 decltype三、新增与改进3.1 nullptr3.2 范围for3.3 array3.4 forward_list3.5 unordered系列3.6 final与override一、列表初始化 1.1 {}初始化 C11 引入了一个新的初始化…...

Mac 遇到pip: command not found问题的解决
Mac 遇到pip: command not found问题的解决在学习Playwright时候,需要下载相关依赖Playwright 是专门为满足端到端测试的需要而创建的。Playwright 支持所有现代渲染引擎,包括 Chromium、WebKit 和 Firefox。在 Windows、Linux 和 macOS 上进行本地测试或…...

[ 云计算 | Azure ] Episode 03 | 描述云计算运营中的 CapEx 与 OpEx,如何区分 CapEx 与 OpEx
正常情况如果你不是会计,或者对钱相关的数字比较敏感的财务,本文的一些东西你不会接触的,但是最为云架构或者云运营,你可能会遇到如何采购亦或者估算的我成本和运营成本等等,所以本文的一些知识点就需要进行一定的了解…...

STM32F103R8T6 SPWM实现正弦波输出
前言 PWM合成正弦波,原理什么的不详细说了,概括一下就是 PWM有效面积的积分 正弦波的有效面积。PWM的频率越快,细分的越多,锯齿也就越不明显。 做法是:首先利用正弦波取点软件,取点1000个,生…...

Oracle 11g创建和删除数据库实例
一、创建数据库实例 1.点击“开始” -> “Oracle -OraDb11g_home1” -> “Database Configuration Assistant” 2.点击“下一步” 3.选择“创建数据库”,点击“下一步” 4.默认设置,不用更改,直接点击“下一步” 5.填写要创建的“实例…...

MySQL(四)视图、存储过程、触发器
视图、存储过程、触发器视图检查选项视图的更新存储过程存储过程基本语法变量系统变量用户自定义变量局部变量if判断参数casewhile循环repeat循环loop循环cursor游标handler条件处理程序存储函数触发器视图 视图(View)是一种虚拟存在的表。视图中的数据…...

在 Ubuntu 下编写 C++
在 Ubuntu 下编写 C 在 Ubuntu 上面编写 C,本章节内容主要介绍在 Ubuntu 在终端窗口下使用 vi/vim 编辑一 个 C源文件。通过编写最简单的示例“Hello,World!”。带领大家学习如何在 Ubuntu 终端下编 辑和编译 C。这里要求大家会在 Ubuntu 上使用 vi/vim…...

Linux主要目录的意思
Linux目录的意思 文章目录Linux目录的意思bin目录(命令目录):二进制目录,二进制是可以直接执行的机器码,里面存放着可以执行的命令;bin目录右下角有个箭头类似于Windows的快捷方式 sbin目录:系…...

启动golang项目编译的exe可执行文件获取windows管理员权限(UAC)
背景: go代码启动以后里面涉及到修改ip地址等操作,需要管理员权限。打包好的exe文件双击执行默认是没有管理员权限的,那么修改ip就会提示需要管理员权限。 解决方法1:右键以管理员权限运行exe文件 解决方法2:编译exe…...