当前位置: 首页 > news >正文

【JavaEE初阶】第四节.文件操作 和 IO (下篇)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录


前言

这篇博客是关于 文件操作和IO 的下半篇的内容,主要介绍的是 文件内容的各种操作 ;

三、文件内容的操作 

关于文件读写的操作,主要分为这几大块:打开文件、关闭文件、读文件、写文件 ;

其中,读写文件 是关键操作 ;

但是,在读写文件之前,必须要打开文件;在使用完毕之后,必须要关闭文件 ;

在 Java中,关于文件读写,提供了几组相关的类(是父类,还有许多其他子类继承):

  1. 第一组:InputStream类、OutputStream类 ——> 字节流(以字节为单位的流,用来操作二进制文件的)
  2. 第二组: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 (下篇)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言三、文件内容的操作 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 博客列表页 &#xff08;功能实现&#xff09;4.3.1 左侧框4.3.2 右侧框 (分页功能 页面显示)4.4 博客详情…...

C++基础了解-20-C++类 对象

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

多态与虚(函数)表

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

云舟案例︱视频孪生技术赋能城市安全综合管理场景,提升城市数智化水平

随着城市化发展进程的加快&#xff0c;人口不断膨胀&#xff0c;社会安全隐患等问题日益突出&#xff0c;成为困扰城市建设与管理的重要难题。针对各类社会治安突出问题&#xff0c;城市管理部门积极推进城市信息化建设&#xff0c;视频监控等各类信息化采集手段为城市数字化管…...

OpenFOAM 自定义gcc和openmpi安装

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

2023年3.8女神节买台灯怎么挑选?台灯用什么样的比较好

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

近亿美元:人工心脏龙头永仁心医疗完成超大额A轮融资

近日&#xff0c;永仁心医疗器械有限公司&#xff08;以下简称“永仁心医疗”&#xff09;完成近一亿美元A轮融资&#xff0c;由北京科兴中维生物技术有限公司&#xff08;SINOVAC科兴&#xff09;领投&#xff0c;太平&#xff08;深圳&#xff09;医疗健康产业私募股权投资基…...

群智能优化计算中的混沌映射

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

【LeetCode】剑指 Offer 25. 合并两个排序的链表 p145 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/he-bing-liang-ge-pai-xu-de-lian-biao-lcof/ 1. 题目介绍&#xff08;25. 合并两个排序的链表&#xff09; 输入两个递增排序的链表&#xff0c;合并这两个链表并使新链表中的节点仍然是递增排序的。 【测试用例】&#xf…...

如何应对危害机房安全的这几个常见要素?

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

【bug】antd全局的主题色样式被覆盖,被修改为`antd`默认的主题色

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

MySQL DDL表操作【入门到精通】

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

《MySQL系列-InnoDB引擎28》表-约束详细介绍

约束 1 数据完整性 关系型数据库系统和文件系统的一个不同点是&#xff0c;关系数据库本身能保证存储数据的完整性&#xff0c;不需要应用程序的控制&#xff0c;而文件系统一般需要在程序端进行控制。当前几乎所有的关系型数据库都提供约束(constraint)机制&#xff0c;该机制…...

使用docker部署宝塔环境

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

ORB_SLAM2+kinect稠密建图

下载代码&#xff1a;https://github.com/gaoxiang12/ORBSLAM2_with_pointcloud_map 运行代码&#xff1a; 解压代码后&#xff0c;删掉作者自己编译的build文件夹&#xff08;下面三个都删除&#xff09;&#xff1a; ~/ORB_SLAM2_modified/build, ~/ORB_SLAM2_modified/T…...

mujoco安装及urdf转xml方法记录

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

Visual Studio 2019 + Qt 项目版本信息新增到资源以及通过代码读取资源存储的版本信息

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

裸辞两个月还能不能找到工作?亲身经历告诉你结果·····

这是我在某论坛看到的一名网友的吐槽&#xff1a; 软件测试四年&#xff0c;主要是手动测试&#xff08;部分自动化测试和性能测试&#xff0c;但是用的是公司内部自动化工具&#xff0c;而且我自动化方面是弱项。&#xff09;现在裸辞两个月了&#xff0c;面试机会少而且面试…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

基于Flask实现的医疗保险欺诈识别监测模型

基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施&#xff0c;由雇主和个人按一定比例缴纳保险费&#xff0c;建立社会医疗保险基金&#xff0c;支付雇员医疗费用的一种医疗保险制度&#xff0c; 它是促进社会文明和进步的…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

代码随想录刷题day30

1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

mac 安装homebrew (nvm 及git)

mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用&#xff1a; 方法一&#xff1a;使用 Homebrew 安装 Git&#xff08;推荐&#xff09; 步骤如下&#xff1a;打开终端&#xff08;Terminal.app&#xff09; 1.安装 Homebrew…...

[ACTF2020 新生赛]Include 1(php://filter伪协议)

题目 做法 启动靶机&#xff0c;点进去 点进去 查看URL&#xff0c;有 ?fileflag.php说明存在文件包含&#xff0c;原理是php://filter 协议 当它与包含函数结合时&#xff0c;php://filter流会被当作php文件执行。 用php://filter加编码&#xff0c;能让PHP把文件内容…...

MySQL 索引底层结构揭秘:B-Tree 与 B+Tree 的区别与应用

文章目录 一、背景知识&#xff1a;什么是 B-Tree 和 BTree&#xff1f; B-Tree&#xff08;平衡多路查找树&#xff09; BTree&#xff08;B-Tree 的变种&#xff09; 二、结构对比&#xff1a;一张图看懂 三、为什么 MySQL InnoDB 选择 BTree&#xff1f; 1. 范围查询更快 2…...