【JavaEE】文件操作 —— IO

文件操作 —— IO

1. 文件的属性

  • 文件内容
  • 文件大小
  • 文件路径
  • 文件名称

2. 文件的管理

采用树形结构进行管理。

3. 文件路径

分为两种:相对、绝对路径。

  • 相对路径:相对于当前位置的路径,以“./xxx.xxx”为标志
  • 绝对路径:以从盘符开始到某一级的路径

4. 输入和输出——Input/Output

输入和输出是以CPU的角度进行观察。

输出:

  • 向屏幕上打印,就是打印内容从CPU流出,外设,所以是 输出
  • 向文件中写内容,就是将内容从CPU流出,到文件,所以是 输出

输入:

  • 从键盘上输入字符,就是字符从外设流入到CPU,所以是 输入
  • 从文件中读取内容,就是内容从文件流入到CPU,所以是 输入

5. 字节和字符

按照读取输入的方式不同可以分为按照字符流、字节流两种情况。

  • 字符流,按照字符编码规则,每次读取一个字符,根据指定的编码规则对读取到的字节进行解析,最终正确显示字符
  • 字节流,按照字节进行读取,每次读取一个字节(取决于给的byte[]是多长的,在read方法中传入的参数是多大)
方式问题
字符流只能操作文本文件
字节流操作任意类型的文件
  • 但是字符流如果编码格式与文件不同步,那么也可能造成乱码问题。

6. deleteOnExit

退出时删除文件,常用于临时文件的删除。

会在程序退出时将文件删除。

7. 文件内容的读写 —— 数据流

7.1 数据流的分类

数据流分为两大类,分为字符流(Reader和Writer)、字节流(InputStream和OutputStream)

其中字符流适合使用于纯文本文件(使用记事本打开不是乱码的文件),字节流适用于任何文件。

因为字符流每次读一个字符,**根据编码规则能够自动选取读几个字节,**图像等类文件不适合;

但是字节流不论是什么文件每次就是一个字节,原原本本的进行读出。

7.2 读写文件内容

读写文件存在一种固定套路:

  1. 打开文件、流
  2. 读取文件
  3. 关闭文件、流

代码示例:

import java.io.*;public class test3 {public static void main(String[] args) throws FileNotFoundException {File file = new File(".\\test.txt");// try with resourcestry(FileInputStream fis = new FileInputStream(file);FileOutputStream fos = new FileOutputStream(file)){// 写入String s = "qyy is the best.";fos.write(s.getBytes());// 读出int len = -1;byte[] bytes = new byte[1024];System.out.println(file.getAbsoluteFile() + "的内容为:");while((len = fis.read(bytes, 0, bytes.length)) != -1) {System.out.println(new String(bytes, 0, len));}} catch (IOException e) {throw new RuntimeException(e);}// 退出时删除——测试文件file.deleteOnExit();}
}

上述代码并没有使用close去关闭流,因为在这里使用了一种try with rescoures的语法,简单来说就是之前只是简单地使用try…catch进行捕获异常,这里的try语法在try后面加上了一堆括号,在里面写上需要释放资源的代码。

释放资源也可以将.close()写在finally{}中,但是上述语法更加简洁。

值得一提的是,只有实现了Closeable接口的类,才能放到try()中。比如上述的InputStream:

在这里插入图片描述

7.3 read方法——输出型参数

输出型参数本来是一个c/c++中常用的概念。输出型参数在c/c++中是将参数的引用写在参数位置,能够在函数运行完毕后不依赖于返回值的方式得到这个变量的值。好处:

  1. 能够携带多个返回值
  2. 避免在调用函数的过程中,函数未能正常返回退栈而导致的资源泄露(资源总是能够在上一级进行释放)

这里的read()方法也需要传入一个输出型参数byte[],用来存放读取到的文件内容。

其有三个参数:

在这里插入图片描述

参数说明
byte[] b存放文件内容的输出型参数
int off从byte[]中第几个位置开始存放,是一个偏移量(offset)
int len读取字节的实际长度,便于构建String变量将文件内容进行输出

7.4 Scanner读取文件

Scanner在之前的使用中,均是以Scanner scanner = new Scanner(System.in)的方式进行,这种方式表示是从键盘读入,数据从键盘流入系统,利用这个原理我们同样可以使得数据从文件流向文件/外设。

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Scanner;public class test4 {public static void main(String[] args) throws FileNotFoundException {Scanner scanner = new Scanner(new FileInputStream("test.txt"));while (scanner.hasNext()) {System.out.println(scanner.next());}}
}

运行结果:

在这里插入图片描述

7.4 几点说明

  1. write是首先会将文件内容全部都清空,即使你并没有往文件中输入任何内容,除非添加追加参数true在这里插入图片描述

  2. Reader与Writer方法的使用与InputStream和OutputStream相同,不再列出

8. 文件读写基本操作

8.1 文件的查找

因为文件是以“树形”结构构建,所以文件的查找本质上是一种多叉树的遍历。

所以就少不了使用**“递归”**。

代码示例:

import java.io.File;
import java.util.regex.Pattern;public class test5 {public static void main(String[] args) {// 文件的查找// 使用正则表达式进行匹配文件String regex = "qyy.*";Pattern pattern = Pattern.compile(regex);File path = new File("D:\\code\\0java\\J2024_01_19");// 从D:\code\0java\J2024_01_19开始找searchFile(pattern, path);}private static void searchFile(Pattern targetFile, File path) {File[] files = path.listFiles();assert files != null;// 路径不能为空for (File file : files) {if (file.isFile()) {// 是文件——看是否匹配要查找的文件if (targetFile.matcher(file.getName()).matches()) {System.out.println("Found: " + file.getAbsolutePath());}} else if (file.isDirectory()) {// 是目录——递归searchFile(targetFile, file);}else {// null}}}
}

值得一提的是,这段代码中使用了Pattern类,利用这个类可以进行正则表达式的匹配。

compile(String regex): 静态方法,用于将给定的正则表达式编译为 Pattern 对象。

matcher(CharSequence input): 用于创建一个 Matcher 对象,该对象用于在输入字符序列上执行匹配操作。

8.2 文件的复制

import java.io.*;public class test6 {public static void main(String[] args) {// 实现文件复制// 从test.txt复制到同级目录下的test2.txtFile src = new File("./test.txt");File dest = new File("./test2.txt");try(FileInputStream fis = new FileInputStream(src);FileOutputStream fos = new FileOutputStream(dest)) {int len = -1;byte[] bytes = new byte[1024];while ((len = fis.read(bytes, 0 ,bytes.length)) != -1) {String s = new String(bytes, 0, len);System.out.println(s);// 一边读,一边写fos.write(s.getBytes());}} catch (IOException e) {throw new RuntimeException(e);}}
}

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

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

相关文章

手动导入jar包到Maven的解决方案(简单有效!)

想要导入一个jar包到项目中,这个jar包在Maven中没有可以尝试以下方式。 第一步 先找到你maven的本地仓库,我的仓库就在这里,你可以根据你安装的maven找到你的目录 第二步 根据坐标创建文件夹。 这个依赖modbus4j.jar,Maven远…

PyQt ------ QTextEditor

PyQt ------ QTextEditor 引言正文示例1------进阶示例 引言 这里给大家介绍一下 PyQt6 中的 QTextEditor 组件用法。 正文 QTextEditor 可以进行多行字符串输出的组件。 想要获取 QTextEditor 组件中当前存放的字符串,需要使用: QTextEditor.toPla…

《GreenPlum系列》GreenPlum初级教程-GreenPlum详细入门教程

文章目录 GreenPlum详细入门教程第一章 GreenPlum介绍1.MPP架构介绍2.GreenPlum介绍3.GreenPlum数据库架构4.GreenPlum数据库优缺点 第二章 GreenPlum单节点安装1.Docker创建centos容器1.1 拉取centos7镜像1.2 创建容器1.3 进入容器1.4 容器和服务器免密操作1.4.1 生成密钥1.4.…

idea创建公用依赖包项目

创建parent项目 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/…

服务器管理平台(6)- Utils

Utils 本篇为服务器管理平台的结篇&#xff0c;讲述一些必要的Util&#xff0c;如钉钉告警、安全加密、远程登录等功能的实现 1、钉钉告警 1.1、SQL配置告警规则 逻辑磁盘容量已使用比例超过90% 超过30天未登录 字段名称字段类型解释Idint自增IDTablestring监测表名Metri…

matlab appdesigner系列-常用18-表格

表格&#xff0c;常用来导入外部表格数据 示例&#xff1a; 导入外界excel数据&#xff1a;data.xlsx 姓名年龄城市王一18长沙王二21上海王三56武汉王四47北京王五88成都王六23长春 操作步骤如下&#xff1a; 1&#xff09;将表格拖拽到画布上 2&#xff09;对app1右键进行…

GPSR路由算法的MATLAB实现

GPSR基于节点地理位置路由信息&#xff0c;采用贪婪策略和右手准则的结合在邻居节点中选择下一跳节点进行数据转发。节点在进行路由选择时&#xff0c;只需知道自己、邻居和目标节点的地理位置信息&#xff0c;无需维护全局网络的链路状态&#xff0c;这在很大程度上降低了网络…

高质量简历模板网站,免费、免费、免费

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…

基于 Docker 部署 Pingvin Share 文件共享平台

一、Pingvin Share 介绍 Pingvin Share 简介 Pingvin Share 是自托管文件共享平台&#xff0c;是 WeTransfer 的替代方案。 Pingvin Share 特点 在 2 分钟内启动您的实例使用可通过链接访问的文件创建共享没有文件大小限制&#xff0c;只有你的磁盘是你的限制设置共享到期时间…

C++11新特性:final/override控制

override关键字 用于显式标识一个成员函数&#xff08;通常是虚函数&#xff09;是在派生类中重写&#xff08;覆盖&#xff09;了基类中的虚函数。这有助于提高代码的可读性&#xff0c;同时在编译时提供了检查&#xff0c;确保派生类中的函数确实是在基类中有对应的虚函数。…

GZ036 区块链技术应用赛项赛题第3套

2023年全国职业院校技能大赛 高职组 “区块链技术应用” 赛项赛卷&#xff08;3卷&#xff09; 任 务 书 参赛队编号&#xff1a; 背景描述 新能源作为新兴领域&#xff0c;产业呈现碎片化与复杂化的特性&#xff0c;逐渐出现管理困难、供应链金融、可信监管与数…

论文阅读_训练大模型用于角色扮演

英文名称: Character-LLM: A Trainable Agent for Role-Playing 中文名称: 角色-LLM&#xff1a;训练Agent用于角色扮演 文章: [https://arxiv.org/abs/2310.10158](https://arxiv.org/abs/2310.10158) 作者: Yunfan Shao, Linyang Li, Junqi Dai, Xipeng Qiu 机构: 复旦大学…

军事智能中的深度强化学习不同于传统的深度强化学习

在军事智能中&#xff0c;“诡”和“诈”是两个最重要的概念。 “诡”变指的是智能体通过采取一些不可预测或复杂的变化策略来获得优势。诡变可能包括逃避对手的观察或引诱对手采取不利的行动。智能体可以使用诡变来欺骗对手&#xff0c;使其做出错误的决策或暴露其策略。 “诈…

【第七在线】智能商品计划:重塑服装行业的供应链管理

在当今快速变化的市场环境中&#xff0c;供应链管理已成为企业成功的关键因素之一。尤其在服装行业&#xff0c;供应链的效率、灵活性和透明度直接影响着企业的竞争力和盈利能力。随着技术的发展&#xff0c;智能商品计划正逐渐成为重塑供应链管理的强大工具。 一、智能商品计划…

什么是JMeter?我们为什么要用JMeter做性能测试

什么是JMeter&#xff1f;我们为什么要用JMeter做性能测试 什么是JMeter&#xff1f;为什么选择JMeterJMeter的优点JMeter是如何工作的 什么是JMeter&#xff1f; Apache JMeter TM是纯Java开源软件&#xff0c;最初由Apache软件基金会的Stefano Mazzocchi开发&#xff0c;旨在…

如何在Linux上部署Docker容器

一、什么是docker&#xff1f; Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux或Windows 机器上&#xff0c;也可以实现虚拟化。容器是完全使用沙箱机制&#xff0c;相互之间不…

方法调用(java)

方法调用的基本内存原理&#xff1a;先进后出 基本数据类型&#xff1a;整数类型、浮点数类型、布尔类型、字符类型&#xff1b;数据类型存储在自己的空间 引用数据类型&#xff1a;除了以上数据类型都是&#xff1b;数据值是存储在其他空间中&#xff0c;变量中存储的是地址…

sprignboot电商书城源码

运行环境: jdk1.8,maven,mysql 项目技术: 后台主要是springbootmybatisshirojsp&#xff0c;前端界面主要使用bootstrap框架搭建&#xff0c;并使用了ueditor富文本编辑器、highcharts图表库。 有需要的可以联系我。 功能介绍&#xff1a; 该系统分为前台展示和后台管理两…

[docker] Docker 网络

一、Docker 网络 1.1 Docker 网络实现原理 Docker使用Linux桥接&#xff0c;在宿主机虚拟一个Docker容器网桥(docker0)&#xff0c;Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址&#xff0c;称为Container-IP&#xff0c;同时Docker网桥是每个容器的默认…

【量化交易】股市舞者:小明的撮合交易之旅

马西森AES撮合交易系统 在繁华的都市中&#xff0c;小明&#xff0c;一个普通的青年&#xff0c;刚刚赚到了人生的第一桶金——20万。这笔意外的财富&#xff0c;点燃了他对股市的强烈兴趣。他开始如饥似渴地学习金融知识&#xff0c;钻研各种交易策略。 一天&#xff0c;小…