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

【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);}}
}

相关文章:

【JavaEE】文件操作 —— IO

文件操作 —— IO 1. 文件的属性 文件内容文件大小文件路径文件名称 2. 文件的管理 采用树形结构进行管理。 3. 文件路径 分为两种:相对、绝对路径。 相对路径:相对于当前位置的路径,以“./xxx.xxx”为标志绝对路径:以从盘符…...

推荐新版AI智能聊天系统网站源码ChatGPT NineAi

Nine AI.ChatGPT是基于ChatGPT开发的一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,真正像人类一样来聊天交流,甚至能完成撰写邮件、视频脚本、文案、翻译、代…...

学生公寓智能控电系统的重要性

学生公寓智能控电系统石家庄光大远通电气有限公司学生宿舍内漏电,超负荷用电,违规用电等现象一直是困扰后勤管理的普遍问题。随着学生日常生活方式以及生活用品的改变,电脑以及各种电器逐渐的普及,导致用电量与日俱增,…...

使用Scrapy 爬取“http://tuijian.hao123.com/”网页中左上角“娱乐”、“体育”、“财经”、“科技”、历史等名称和URL

一、网页信息 二、检查网页,找出目标内容 三、根据网页格式写正常爬虫代码 from bs4 import BeautifulSoup import requestsheaders {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/53…...

2018年认证杯SPSSPRO杯数学建模D题(第二阶段)投篮的最佳出手点全过程文档及程序

2018年认证杯SPSSPRO杯数学建模 D题 投篮的最佳出手点 原题再现: 影响投篮命中率的因素不仅仅有出手角度、球感、出手速度,还有出手点的选择。规范的投篮动作包含两膝微屈、重心落在两脚掌上、下肢蹬地发力、身体随之向前上方伸展、同时抬肘向投篮方向…...

软件资源管理下载系统全新带勋章功能 + Uniapp前端

测试环境:php7.1。ng1.2,MySQL 5.6 常见问题: 配置好登录后转圈圈,检查环境及伪静态以及后台创建好应用 上传图片不了,检查php拓展fileinfo 以及public文件权限 App个人主页随机背景图,在前端uitl文件…...

高性能前端UI库 SolidJS | 超棒 NPM 库

SolidJS是一个声明式的、高效的、编译时优化的JavaScript库,用于构建用户界面。它的核心特点是让你能够编写的代码既接近原生JavaScript,又能够享受到现代响应式框架提供的便利。 SolidJS的设计哲学强调了性能与简洁性。它不使用虚拟DOM(Vir…...

聊聊PowerJob的AliOssService

序 本文主要研究一下PowerJob的AliOssService DFsService tech/powerjob/server/extension/dfs/DFsService.java public interface DFsService {/*** 存储文件* param storeRequest 存储请求* throws IOException 异常*/void store(StoreRequest storeRequest) throws IOEx…...

【VRTK】【Unity】【PICO】PICO项目打包后闪退的根本原因

【背景】 一开始打包运行好好的PICO项目,中途用Preview模式开发了一阵后,再次打包就闪退了。 【分析】 项目设置没有动过,那么可能是Preview开发过程中引入的包导致的问题。 【答案】 千万不要在PICO项目中导入Oculus包。我原本想用一些…...

《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(21)

接前一篇文章:《PCI Express体系结构导读》随记 —— 第I篇 第2章 PCI总线的桥与配置(20) 2.4 PCI总线的配置 PCI总线定义了两类配置请求,一个是Type 00h配置请求,另一个是Type 01h配置请求。PCI总线使用这些配置请求…...

大数据前馈神经网络解密:深入理解人工智能的基石

文章目录 大数据前馈神经网络解密:深入理解人工智能的基石一、前馈神经网络概述什么是前馈神经网络前馈神经网络的工作原理应用场景及优缺点 二、前馈神经网络的基本结构输入层、隐藏层和输出层激活函数的选择与作用网络权重和偏置 三、前馈神经网络的训练方法损失函…...

【新书推荐】Web3.0应用开发实战(从Web 2.0到Web 3.0)

第一部分 Flask简介 第1章 安装 1.1 创建应用目录 1.2 虚拟环境 1.2.1 创建虚拟环境 1.2.2 使用虚拟环境 1.3 使用pip安装Python包 1.4 使用pipregs输出包 1.5 使用requirements.txt 1.6 使用pipenv管理包 第2章 应用的基本结构 2.1 网页显示过程 2.2 初始化 2.3 路由和视图函数…...

vue3中状态管理库pinia的安装和使用方法介绍及和vuex的区别

文章目录 Pinia 的主要特点:如何使用:1.安装2.定义3.使用 pinia和vuex的对比 Pinia 与 Vuex 一样,是作为 Vue 的“状态存储库”,用来实现 跨页面/组件 形式的数据状态共享。它允许你跨组件或页面共享状态。如果你熟悉组合式 API 的…...

领略指针之妙

𝙉𝙞𝙘𝙚!!👏🏻‧✧̣̥̇‧✦👏🏻‧✧̣̥̇‧✦ 👏🏻‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - :来于“云”的“羽球人”。…...

迭代器模式介绍

目录 一、迭代器模式介绍 1.1 迭代器模式定义 1.2 迭代器模式原理 1.2.1 迭代器模式类图 1.2.2 模式角色说明 1.2.3 示例代码 二、迭代模式的应用 2.1 需求说明 2.2 需求实现 2.2.1 抽象迭代类 2.2.2 抽象集合类 2.2.3 主题类 2.2.4 具体迭代类 2.2.5 具体集合类 …...

算法每日一题: 最大字符串匹配数目 | 哈希 | 哈希表 | 题意分析

hello 大家好,我是星恒 今天给大家带来的是hash,思路有好几种,需要注意的是这中简单的题目需要仔细看条件,往往他们有对应题目的特殊的解法 题目:leetcode 2744给你一个下标从 0 开始的数组 words ,数组中包…...

自然语言处理(Natural Language Processing,NLP)解密

专栏集锦,大佬们可以收藏以备不时之需: Spring Cloud 专栏:http://t.csdnimg.cn/WDmJ9 Python 专栏:http://t.csdnimg.cn/hMwPR Redis 专栏:http://t.csdnimg.cn/Qq0Xc TensorFlow 专栏:http://t.csdni…...

【DevOps-08-5】目标服务器准备脚本,并基于Harbor的最终部署

一、简要描述 告知目标服务器拉取哪个镜像判断当前服务器是否正在运行容器,停止并删除如果目标服务器已经存在当前镜像,删除当前版本的镜像目标服务器拉取Harbor上的镜像将拉取下来的镜像运行成容器二、准备目标服务器脚本文件 1、在部署的目标服务器准备deploy.sh部署脚本 …...

用Java实现01背包问题 用贪心算法

贪心算法不是解决01背包问题的有效方法,因为贪心算法只能保证得到一个近似最优解,而无法保证得到最优解。因此,我们需要使用动态规划来解决01背包问题。以下是使用Java实现的动态规划解法: public class KnapsackProblem {public…...

JUC并发编程-8锁现象

5. 8锁现象 如何判断锁的是谁!锁到底锁的是谁? 锁会锁住:对象、Class 深刻理解我们的锁 问题1 两个同步方法,先执行发短信还是打电话 public class dome01 {public static void main(String[] args) {Phone phone new Phon…...

UDP(Echoserver)

网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...

Ascend NPU上适配Step-Audio模型

1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率(或其他自定义指标)来调整这些对象的规模,从而帮助应用程序在负…...

第八部分:阶段项目 6:构建 React 前端应用

现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

Tauri2学习笔记

教程地址:https://www.bilibili.com/video/BV1Ca411N7mF?spm_id_from333.788.player.switch&vd_source707ec8983cc32e6e065d5496a7f79ee6 官方指引:https://tauri.app/zh-cn/start/ 目前Tauri2的教程视频不多,我按照Tauri1的教程来学习&…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

标注工具核心架构分析——主窗口的图像显示

&#x1f3d7;️ 标注工具核心架构分析 &#x1f4cb; 系统概述 主要有两个核心类&#xff0c;采用经典的 Scene-View 架构模式&#xff1a; &#x1f3af; 核心类结构 1. AnnotationScene (QGraphicsScene子类) 主要负责标注场景的管理和交互 &#x1f527; 关键函数&…...

SQLSERVER-DB操作记录

在SQL Server中&#xff0c;将查询结果放入一张新表可以通过几种方法实现。 方法1&#xff1a;使用SELECT INTO语句 SELECT INTO 语句可以直接将查询结果作为一个新表创建出来。这个新表的结构&#xff08;包括列名和数据类型&#xff09;将与查询结果匹配。 SELECT * INTO 新…...

关于疲劳分析的各种方法

疲劳寿命预测方法很多。按疲劳裂纹形成寿命预测的基本假定和控制参数&#xff0c;可分为名义应力法、局部应力一应变法、能量法、场强法等。 1名义应力法 名义应力法是以结构的名义应力为试验和寿命估算的基础&#xff0c;采用雨流法取出一个个相互独立、互不相关的应力循环&…...

RabbitMQ work模型

Work 模型是 RabbitMQ 最基础的消息处理模式&#xff0c;核心思想是 ​​多个消费者竞争消费同一个队列中的消息​​&#xff0c;适用于任务分发和负载均衡场景。同一个消息只会被一个消费者处理。 当一个消息队列绑定了多个消费者&#xff0c;每个消息消费的个数都是平摊的&a…...