文件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级就是咱们平时用的那些软…...
微信小程序实现图片拖拽调换位置效果 -- 开箱即用
在编写类似发布朋友圈功能的功能时,需要实现图片的拖拽排序,删除图片等功能。 博主的小程序首页也采用了该示例代码,可以在威信中搜索: 我的百宝工具箱 或者复制后面的🔗在手机打开: #小程序://百宝工具箱/…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...
数据库正常,但后端收不到数据原因及解决
从代码和日志来看,后端SQL查询确实返回了数据,但最终user对象却为null。这表明查询结果没有正确映射到User对象上。 在前后端分离,并且ai辅助开发的时候,很容易出现前后端变量名不一致情况,还不报错,只是单…...
day51 python CBAM注意力
目录 一、CBAM 模块简介 二、CBAM 模块的实现 (一)通道注意力模块 (二)空间注意力模块 (三)CBAM 模块的组合 三、CBAM 模块的特性 四、CBAM 模块在 CNN 中的应用 一、CBAM 模块简介 在之前的探索中…...
[KCTF]CORE CrackMe v2.0
这个Reverse比较古老,已经有20多年了,但难度确实不小。 先查壳 upx压缩壳,0.72,废弃版本,工具无法解压。 反正不用IDA进行调试,直接x32dbg中,dump内存,保存后拖入IDA。 这里说一下…...
【SSM】SpringMVC学习笔记7:前后端数据传输协议和异常处理
这篇学习笔记是Spring系列笔记的第7篇,该笔记是笔者在学习黑马程序员SSM框架教程课程期间的笔记,供自己和他人参考。 Spring学习笔记目录 笔记1:【SSM】Spring基础: IoC配置学习笔记-CSDN博客 对应黑马课程P1~P20的内容。 笔记2…...
【芯片仿真中的X值:隐藏的陷阱与应对之道】
在芯片设计的世界里,X值(不定态)就像一个潜伏的幽灵。它可能让仿真测试顺利通过,却在芯片流片后引发灾难性后果。本文将揭开X值的本质,探讨其危害,并分享高效调试与预防的实战经验。 一、X值的本质与致…...
Java线程池核心原理与最佳实践
Java 线程池详解 线程池是Java并发编程的核心组件,它能高效管理线程生命周期,避免频繁创建销毁线程的开销,提升系统性能和资源利用率。 一、线程池核心优势 降低资源消耗:复用已创建的线程,减少线程创建销毁开销提高…...
