文件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级就是咱们平时用的那些软…...
微信小程序实现图片拖拽调换位置效果 -- 开箱即用
在编写类似发布朋友圈功能的功能时,需要实现图片的拖拽排序,删除图片等功能。 博主的小程序首页也采用了该示例代码,可以在威信中搜索: 我的百宝工具箱 或者复制后面的🔗在手机打开: #小程序://百宝工具箱/…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
质量体系的重要
质量体系是为确保产品、服务或过程质量满足规定要求,由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面: 🏛️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限,形成层级清晰的管理网络…...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
Android第十三次面试总结(四大 组件基础)
Activity生命周期和四大启动模式详解 一、Activity 生命周期 Activity 的生命周期由一系列回调方法组成,用于管理其创建、可见性、焦点和销毁过程。以下是核心方法及其调用时机: onCreate() 调用时机:Activity 首次创建时调用。…...
网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...
Qt 事件处理中 return 的深入解析
Qt 事件处理中 return 的深入解析 在 Qt 事件处理中,return 语句的使用是另一个关键概念,它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别:不同层级的事件处理 方…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
