文件IO——01
1. 认识文件
1)文件概念
“文件”是一个广义的概念,可以代表很多东西
操作系统里,会把很多的硬件设备和软件资源抽象成“文件”,统一管理
但是大部分情况下的文件,都是指硬盘的文件(文件相当于是对“硬盘”数据的一种抽象)
机械硬盘(HDD)适合顺序读取(磁头移动需要时间)
固态硬盘(SSD)内部是集成程度很高的芯片
2)目录
一台计算机上有很多文件,这些文件是通过“文件系统”(操作系统提供的模块)来进行组织的
操作系统,使用“目录”(文件夹)这样的结构来组织文件
目录内部可能还包含其他的文件/目录
3)文件路径
可以通过文件路径,来确定当前文件具体所在的位置
1. 绝对路径:以 C: D: 盘开头
2. 相对路径:先指定一个目录作为基准目录,从基准目录出发,看沿着怎样的路径能找到指定的文件。一般以 . 或者 .. 开头( . 的情况可省略)
. 当前目录
.. 当前目录的上一级目录
如果是命令行进行操作,基准目录,就是当前所处的目录
如果是图形化界面的程序,基准目录就不好判断了
对于IDEA来说,基准目录,就是项目目录
4)文件类型
从编程的角度看:
1. 文本——文件中保存的数据,都是字符串,保存的内容,都是合法字符
2. 二进制——文件中保存的数据,仅仅是二进制数据,包要求保存的内容是合法字符
合法字符涉及字符集/字符编码
如 utf8:
有一个大的表格(码表),列出什么字符,对应到什么编码
如果文件是 utf8 编写的,此时文件的每个数据都是合法的 utf8 编码的字符 ——文本文件
如果存在一些不是 utf8 合法字符的情况——二进制
判断文件的类型——>
直接使用记事本打开这个文件,如果是乱码,文件就是二进制,否则就是文本
记事本就是尝试按照字符的方式来展示内容,这个过程会自动查码表
写代码时,文本文件和二进制文件的编码方式不同
2. Java 中操作文件
1. 文件系统的操作: File
创建文件,删除文件,判断文件是否存在,判断文件类型,重命名
2. 文件内容的操作: 流对象
读文件/写文件
1)File 概述(文件系统操作)
属性
| 修饰符积累性 | 属性 | 说明 |
| static String | pathSeparator | 依赖于系统的路径分隔符, String 类型的表示 |
| static char | pathSeparator | 依赖于系统的路径分隔符, char 类型的表示 |
pathSeparator 是一个路径中用来分割目录的符号
Windows => \ 和 /
Linux => /
一般还是使用 / ,使用 \ 在代码中要搭配转义字符使用
构造方法
| 签名 | 说明 |
| File(File parent,String child) | 根据父目录+孩子文件, 创建一个新的对象 |
| File(String pathname) | 根据文件路径创建一个新的实例, 路径可以是绝对路径或相对路径 |
| File(String parent,Strinf child) | 根据父目录+孩子文件路径创建实例, 父目录用路径表达式 |
1)一个File对象,就表示一个硬盘上的文件
在构造对象的时候,就需要把这个文件的路径指定进来(绝对路径/相对路径都可以)
2)文件名 = 前缀 + 扩展名
使用路径构造对象,一定要把前缀和扩展名都带上
方法
| 修饰符及返回值类型 | 方法签名 | 说明 |
| String | getParent() | 返回File对象的父目录 文件路径 |
| String | getName() | 返回File对象的纯文件名称 |
| String | getPath() | 返回File对象的文件路径 |
| String | getAbsolutePath() | 返回File对象绝对路径的 |
| String | getCanonicalPath() | 返回File对象的修饰过的 绝对路径 |
| boolean | exist() | 返回File对象描述的文件是否 真实存在 |
| boolean | isDirectory() | 返回File对象代表的文件是否是 一个目录 |
| boolean | isFile() | 返回File对象代表的文件是否是 一个普通文件 |
| boolean | createNewFile() | 根据File对象,自动创建一个 空文件,创建成功后返回true |
| boolean | delete() | 根据File对象,删除该文件, 成功删除后返回true |
| void | deleteOnExit() | 根据 File 对象,标注文件将被删除,删除动作会到 JVM 运行结束时才会进行 |
| String[] | list() | 返回File对象代表的目录下的 所有文件名 |
| File[] | listFile() | 返回File对象代表的目录下的所有文件,以File对象表示 |
| boolean | mkdir() | 创建File对象代表的目录 |
| boolean | mkdirs() | 创建File对象代表的目录,如果必要,会创建中间目录 |
| boolean | renameTo(File dest) | 进行文件(剪切,粘贴操作) |
| boolean | canRead() | 判断用户是否对文件有可读的权限 |
| boolean | canWrite() | 判断用户是否对文件有可写的权限 |

Windows上的盘符不分大小写
getCanonicalPath() 针对绝对路径进行简化后得到的路径
对IDEA来说,基准目录就是项目所在的目录
绝对路径就是把当前的相对路径拼接到基准目录上





System.out.println(files);打不出数组内容,是数组的哈希值
在JVM上层,Java代码中,没有任何办法获取到“内存地址”
要想拿到内存地址,只能靠native方法进入到JVM内部,通过C++代码获取到
System.out.println(Arrays.toString(files));会打印出系统自带的特殊目录,不让用户感知到,防止被随意修改
2)文件内容的读写 —— 数据流
流对象(文件内容操作)
在标准库中,提供的读写文件的流对象(stream)有很多类,可以归结到两个大的类别中:
1. 字节流(对应二进制文件)
每次读/写的最小单位,是“字节”(8bit)
InputStream OutputStream
2. 字符流 (对应文本文件)
每次读/写的最小单位,是“字符”(一个字符可能对应多个字节)
本质上是对字节流的又一层封装,把文件中几个相邻的字节,转换成一个字符(自动查字符集表)
Reader Writer
GBK,一个中文字符集 => 两个字节
utf8,一个中文字符集 => 三个字节
输入/输出是站在CPU的角度上: 输出——>读 输入——>写
1. Reader 类
Reader 是抽象类,不能new实例,只能new子类 标准库已经提供了现成的类
创建Reader对象的过程,就是”打开文件“的过程 文件不存在就就会打开失败


1. 无参数 read:一次读取一个字符
2. 一个参数 read:一次读取若干个字符,会把参数指定的 cbuf 数组给填充满
4. 三个参数 read :一次读取若干个字符,会把参数中的 cbuf 数组,从off位置开始,到len的范围尽量填满
1)把这个 cbuf 空数组(不是null,没有实际意义的数组)尽量填满
2)使用 close 方法,是为了释放文件描述符(PCB)——>
顺序表(数组)
进程每次打开文件,都需要在这个表里分配一个元素,这个数组的长度是存在上限的
当数组占满后再尝试打开文件,会触发文件资源泄露(类似内存泄漏)
3)read 返回值是 int 表示读取的字符数,若文件读完了,返回 -1
reader.close();该方法可能会执行不到,如果程序出现逻辑错误,会报异常终止程序,调用不到 close
可以使用
try{}finally{reader.close(); } //但过于繁琐,不够优美try{
} // try with resources
() 中定义的变量,会在 try 代码结束的时候(正常结束,还是抛出异常),自动调用其中的 close 方法
要求写到 () 里的对象必须实现 Closeable 借口 ——流对象都可以这么写
在Java标准库内部,对于字符编码做了很多的处理:
1)只使用char,此时使用的字符集固定是 unicode
若使用String,此时会自动把每个字符的 Unicode 转换成 utf8
2)char[] c 包含的每个字符都是 unicode 编码的
String s = new String(c); 一旦使用这个字符数组构成String,就会在内部把每个字符都转换成 utf8 ,可配置
s.charAt(i) 也会把对应的 utf8 的数据,转换成 unicode
3)把多个 unicode 联系放到一起,难以区分从哪到哪是一个完整的字符
utf8 可以做到区分
可以认为 utf8 是针对连续多个字符进行传输时的一种改进方案
2. Write 类



1. 一次写一个字符
2. 一次写一个字符串
3. 一次写多个字符(字符数组)
4,5. offset 是从数组/字符串中的第几个字符开始写
Write 写入文件,默认情况下会把原文件的内容清空掉
若不想清空,需要在构造方法中添加一个参数
此时回见内容写到原有文件的末尾


3. OutputStream类
和 Write 类似, OutputStream 打开一个文件,默认会清空文件的原有内容
写入的数据,会成为文件中的新数据
若不想清空,可以使用追加写的方式(在构造方法中,第二个参数传入 true )

此处已经写入了字符串,但在文件中却未写入
缓冲区
PrintWriter 这样的类,在进行写入的时候,不一定是直接写硬盘,而是先把数据写入到一个内存构成的“缓冲区”中(buffer) ——引入缓冲区是为了提高效率,减少读硬盘的次数
当写入缓冲区后,如果还没来及将缓冲区的数据写入硬盘,进程就结束了,此时数据就丢了
有时候需要手动使用 flush 方法将数据写入硬盘 ——刷新缓冲区

4. InputStream类


以上是将文件中的数据全部读完的两种方式,前者的IO次数更少,性能更好
Scanner 进行字符读取Scanner(InputStream is, String charset) 使用 charset 字符集进行 is 的扫描读取

文件练习
扫描指定目录,找到名称中包含指定字符的所有普通文件(不包含目录),并且后续询问用户是否要删除该文件
1)list 列出目录内容
2)判断文件类型
3)删除文件
找到目录中的所有文件,以及子目录中的所有文件,只要遇到子目录就往里找
可以使用“递归”的方式,把所有的子目录都扫描一遍


相关文章:
文件IO——01
1. 认识文件 1)文件概念 “文件”是一个广义的概念,可以代表很多东西 操作系统里,会把很多的硬件设备和软件资源抽象成“文件”,统一管理 但是大部分情况下的文件,都是指硬盘的文件(文件相当于是对“硬…...
【opencv入门教程】5. Mat 类用法
文章选自: 一、BackGround Mat对象是一种图像数据结构,它是一个容器,存储任何通道任何数的图片数据以及对应的矩阵,使用完成后,内存自动释放。二、Code void Samples::MatFunc() {1. 图像处理// 方法1:…...
SSM虾米音乐项目2--分页查询
1.分页查询的底层逻辑 首先根据用户输入的流派,进行模糊查询根据查询的数据进行分页需要前端用户提供pageNo(当前页数)和pageSize(每页的数据量)并且要从后端计算count(总数据量)和totalPage(总页数),以及startNum(每页开始的记录)从而将对应的页面数据…...
nodejs 获取本地局域网 ip 扫描本地端口
因为傻逼老板的垃圾需求,不得不成长 示例代码: 获取本地局域网 ip 地址: 需要注意的是:如果存在虚拟机网络,则返回的是虚拟机网络的 ipv4 地址 import os from os; export const getLocalIp () > {const in…...
区块链签名种类
1. eth_sign 简介:最早实现的签名方法,用于对任意数据进行签名。签名内容:直接对原始消息的哈希值进行签名。特点: 安全性较低,因为签名的消息没有明确的上下文或结构。很容易被滥用,攻击者可以伪造签名内…...
【062B】基于51单片机无线病房呼叫系统(+时间)【Keil程序+报告+原理图】
☆、设计硬件组成:51单片机最小系统NRF24L01无线模块DS1302时钟芯片LCD1602液晶显示按键设置蜂鸣器LED灯。 1、本设计采用STC89C51/52、AT89C51/52、AT89S51/52作为主控芯片,采用LCD1602液晶显示呼叫信息,系统共有两个板子(一个接…...
突破空间限制!从2D到3D:北大等开源Lift3D,助力精准具身智能操作!
文章链接:https://arxiv.org/pdf/2411.18623 项目链接:https://lift3d-web.github.io/ 亮点直击 提出了Lift3D,通过系统地提升隐式和显式的3D机器人表示,提升2D基础模型,构建一个3D操作策略。 对于隐式3D机器人表示&a…...
【pyspark学习从入门到精通24】机器学习库_7
目录 聚类 在出生数据集中寻找簇 主题挖掘 回归 聚类 聚类是机器学习中另一个重要的部分:在现实世界中,我们并不总是有目标特征的奢侈条件,因此我们需要回归到无监督学习的范式,在那里我们尝试在数据中发现模式。 在出生数据…...
Echart折线图属性设置 vue2
Echart折线图 官方配置项手册 Documentation - Apache ECharts 下面代码包含:设置标题、线条样式、图例圆圈的样式、显示名称格式、图片保存、增加Y轴目标值 updateChart(data) {const sortedData data.slice().sort((a, b) > new Date(a.deviceTime) - ne…...
LabVIEW-简单串口助手
LabVIEW-简单串口助手 串口函数VISA配置串口VISA写入函数VISA读取函数VISA资源名称按名称解除捆绑 函数存放位置思维导图主体界面为以下 串口函数 VISA配置串口 VISA写入函数 VISA读取函数 VISA资源名称 按名称解除捆绑 函数存放位置 思维导图 主体界面为以下 从创建好的“枚举…...
Linux下,用ufw实现端口关闭、流量控制(二)
本文是 网安小白的端口关闭实践 的续篇。 海量报文,一手掌握,你值得拥有,让我们开始吧~ ufw 与 iptables的关系 理论介绍: ufw(Uncomplicated Firewall)是一个基于iptables的前端工具…...
C#开发-集合使用和技巧(九)Join的用法
在C#中,IEnumerable 的 Join 方法用于根据键将两个序列中的元素进行关联。Join 方法通常用于执行类似于 SQL 中的内连接操作。以下是 Join 方法的基本用法: 基本语法 public static IEnumerable<TResult> Join<TOuter, TInner, TKey, TResult…...
Dockerfile容器镜像构建技术
文章目录 1、容器回顾1_容器与容器镜像之间的关系2_容器镜像分类3_容器镜像获取的方法 2、其他容器镜像获取方法演示1_在DockerHub直接下载2_把操作系统的文件系统打包为容器镜像3_把正在运行的容器打包为容器镜像 3、Dockerfile介绍4、Dockerfile指令1_FROM2_RUN3_CMD4_EXPOSE…...
Github 2024-12-01 开源项目月报 Top20
根据Github Trendings的统计,本月(2024-12-01统计)共有20个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Python项目10TypeScript项目9Go项目2HTML项目1Shell项目1Jupyter Notebook项目1屏幕截图转代码应用 创建周期:114 天开发语言:TypeScript, Py…...
Spring Boot 3项目集成Swagger3教程
Spring Boot 3项目集成Swagger3教程 ?? 前言 欢迎来到我的小天地,这里是我记录技术点滴、分享学习心得的地方。?? ?? 技能清单 编程语言:Java、C、C、Python、Go、前端技术:Jquery、Vue.js、React、uni-app、EchartsUI设计: Element-u…...
NISP信息安全一级考试200道;免费题库;大风车题库
下载链接:大风车题库-文件 大风车题库网站:大风车题库 大风车excel(试题转excel):大风车excel...
Android ConstraintLayout 约束布局的使用手册
目录 前言 一、ConstraintLayout基本介绍 二、ConstraintLayout使用步骤 1、引入库 2、基本使用,实现按钮居中。相对于父布局的约束。 3、A Button 居中展示,B Button展示在A Button正下方(距离A 46dp)。相对于兄弟控件的约束…...
在网安中什么是白帽子
在网络安全领域,白帽子是指那些专门从事网络安全研究,帮助企业或个人发现并修复安全漏洞的专家。以下是对白帽子的详细解释: 一、定义与角色 白帽子是网络安全领域的术语,通常指那些具备专业技能和知识的网络安全专家。他们的工作…...
软件专业科目难度分级 你输在了哪里?
感想: 我把我们现在软件专业学的东西分了个难度级别 级别描述视角服务对象例子0 基本软件的使用用户-Photoshop wps ssms等1 软件的原理开发者用户各种编程语言2软件的原理的原理开发者开发者各种函数的深层定义,数据结构等 0级就是咱们平时用的那些软…...
微信小程序实现图片拖拽调换位置效果 -- 开箱即用
在编写类似发布朋友圈功能的功能时,需要实现图片的拖拽排序,删除图片等功能。 博主的小程序首页也采用了该示例代码,可以在威信中搜索: 我的百宝工具箱 或者复制后面的🔗在手机打开: #小程序://百宝工具箱/…...
椭圆曲线密码学(ECC)
一、ECC算法概述 椭圆曲线密码学(Elliptic Curve Cryptography)是基于椭圆曲线数学理论的公钥密码系统,由Neal Koblitz和Victor Miller在1985年独立提出。相比RSA,ECC在相同安全强度下密钥更短(256位ECC ≈ 3072位RSA…...
STM32标准库-DMA直接存储器存取
文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA(Direct Memory Access)直接存储器存取 DMA可以提供外设…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
css的定位(position)详解:相对定位 绝对定位 固定定位
在 CSS 中,元素的定位通过 position 属性控制,共有 5 种定位模式:static(静态定位)、relative(相对定位)、absolute(绝对定位)、fixed(固定定位)和…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
C# SqlSugar:依赖注入与仓储模式实践
C# SqlSugar:依赖注入与仓储模式实践 在 C# 的应用开发中,数据库操作是必不可少的环节。为了让数据访问层更加简洁、高效且易于维护,许多开发者会选择成熟的 ORM(对象关系映射)框架,SqlSugar 就是其中备受…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...
