文件IO(Java)
注:此博文为本人学习过程中的笔记
1.概念
狭义上的文件是指保存在硬盘上的文件,广义上指操作系统进行资源管理的一种机制,很多软件/硬件资源都可以抽象成文件,这里我们针对的是狭义上的文件。
在硬盘里还有文件夹,这是通俗的说法,我们一般称其为目录。
2.硬盘,内存和寄存器
1.区别
存储空间
硬盘很大(几TB),内存更小(几十GB),寄存器非常小(不到1KB)
访问速度
硬盘很慢,内存快,寄存器很快
成本
硬盘便宜,内存贵,寄存器不单独卖,很贵
2.硬盘
硬盘分为固态硬盘和机械硬盘,机械硬盘受限于内部结构,速度非常慢。
3.路径
一台计算机中能够保存的文件有很多,那么要怎么识别唯一的文件呢?此时就需要用到路径。路径就是定位到文件的一系列过程。在计算机中,目录套目录形成了树形结构,从树根开始到最终的文件,都需要经过哪些目录,就形成路径。
1.使用
一般用“/”(正斜杠)表示。主流操作系统中都是使用/表示,windows比较特殊,使用“\”(反斜杠)表示。不过windows里是兼容正斜杠的,所以我们都使用正斜杠。在编写代码的时候,正斜杠可以直接使用,反斜杠需要转义。
2.相对路径和绝对路径
1.绝对路径
从盘符开始逐级表示
2.相对路径
相对路径需要明确一个基准,使用.表示基准的位置。使用..表示基准的上一层。使用../..表示基准的上两层。
在代码中写一个相对路径,它的基准是不确定的。如果在IDEA上运行,基准就是项目的目录。如果打一个jar包,单独运行jar包,那么是在哪个目录执行运行命令,基准就是哪个目录。
4.文件的种类
从开发的角度把文件分成两类,二进制文件和文本文件。图片,视频,压缩包之类的都是二进制文件。
所有的文件都是二进制文件,有一些文件是特殊的,二进制数据刚好能构成一些字符,能狗仔码表查到,并且构成有意义的内容。判断文本文件的方法很简单,直接用记事本打开看即可。注意word里的docx是二进制文件,里面不只有文本,还有格式,图表之类的东西。
5.Java标准库中操作文件的类
1.文件系统操作
创建文件,删除文件,重命名,创建目录
File - Java17中文文档 - API参考文档 - 全栈行动派 (qzxdp.cn)
进行文件系统操作时使用File这个类。里面的方法大多比较简单,查看文档即可,这里只写一些需要注意的点。
1.方法注意点
1.list()和listFile()
这个方法的作用是返回当前目录的子元素有哪些,需要注意的是它是无法获得子元素的子元素或孙子元素的,如果想,需要我们通过代码来实现。list返回的是字符串,而listFile返回的是File类,可以进行更多操作。
2.renameTo()
这个方法的作用是重命名目录,对于操作系统来说,重命名和移动本质上是一样的,因为定位文件是靠路径完成的。
2.文件内容操作
针对一个文件的内容进行读和写,通过一组“流对象”实现。流是操作系统层面的术语,和语言无关,其他语言操作文件内容也叫流。输入和输出是以cpu为参考的。
字节流读数据时是文件的原始数据。而字符流会根据文件内容的编码格式进行解析,比如可以把utf-8编码下3个字节的汉字解析后放到2个字节的char里。
其中的操作大部分是很相似的,这里就只详细介绍InputStream,其他都一笔带过。
1.字节流
读写文件以字节为单位,是针对二进制文件进行使用的。字节流主要有两个类InputStream和OutputStream,其他类都直接或间接继承这两个类。
1.InputStream
1.new操作
//注意InputStream是个抽象类
InputStream inputStream = new FileInputStream(文件路径);
这里的创建操作一旦成功,就认为打开了文件。要先打开文件才能进行操作,这是操作系统定义的流程。这个时候就不能忘记操作完成之后要关闭文件。
2.close()
inputStream.close();
不手动释放文件资源,就会引起文件资源泄露问题。 每次打开一个文件,就会在文件描述符表(固定长度的顺序表)中占据一个表项,如果光打开,不关闭,这里的文件描述符表的表项就会耗尽,后续再打开文件就会失败。文件操作附表是不能自动扩容的,操作系统内核里的操作是给所有进程提供的,如果能自动扩容会进一步增加内核的不可控因素。
close和unlock一样,容易因为各种原因漏掉,所以我们可以使用finally语句或者try语句的变种来保证close操作一定执行。
try {InputStream inputStream = new FileInputStream();
} finally {inputStream.close();
}//括号里可以new多个,在括号里new的东西会在try的代码块结束后自动调用close关闭
try(InputStream inputStream = new FileInputStream();) {}
//能自动关闭的类都实现了Closable接口
3.read()
int read()
调用一次,读取一个字节,返回的是int而不是byte,返回值是正常数字时对照码表查具体是什么,返回-1是表示文件已经读完
try(InputStream inputStream = new FileInputStream("./text.txt")) {//开始进行读文件操作while(true) {int data = inputStream.read();if(data == -1) {//如果读完就退出break;}System.out.println(data);}
}
int read(byte[] b)
一次读若干个字节,读取到的数据放到参数b中。
这个方法使用参数作为方法的返回值。一般来说,方法都是把参数作为需要加工的材料,把返回值当作生产出来的产品。有时也会使用参数来接收返回值,当参数是一个引用类型时,方法内部修改对象内容也能影响到方法外部。
这种"输出型参数"本质上是语法的限制,因为语法限制方法只能有一个返回值,如果希望返回多个数据,只能通过参数来凑。
try(InputStream inputStream = new FileInputStream("./text.txt")) {byte[] data = new byte[1024];while(true) {//read方法会尽可能读完数据,直到把data填满为止。int n = inputStream.read(data);//这里的n表示实际读了几个字节for(int i = 0; i < n; i++) {System.out.println(data[i]);}}
}
int read(byte[], int off, int len)
这里的off表示offset指的是偏移量,也可以理解成数组下标,len表示长度。这个方法和第二个类似,多了指定下标和长度。
2.OutputStream
1.new
对于OutputStream来说,默认情况下会尝试创建不存在的文件。打开文件的一瞬间是会清除上次文件的内容的,可以设置成追加写的模式,避免文件被清空。
OutputStream outputStream = new FileOutputStream("./text.txt", true);
2.write
void write(int b)
一次写一个字节
void write(byte[] b)
一次写若干个字节
void write(byte[] b, int off, int, len)
一次写若干个字节,可以指定下标和长度
2.字符流
读写文件以字符为单位,是针对文本文件进行使用的。字符流主要有两个类Writer和Reader,其他类都直接或间接继承这两个类。
1.Reader
1.read()
int read()
一次读一个字符
int read(char[] cbuf)
一次读一个字符数组
int read(CharBuffer target)
CharBuffer相当于对char[]进行了封装
int read(char[] cbuf, int off, int len)
一次读一个字符数组,可以指定下标和长度
2.Writer
write()
void write(int c)
void write(String str)
void write(char[] cubf)
void write(String str, int off, int len)
void write(char[] cubf, int off, int len)
3.提高效率的方法
1.手动创建缓冲区,手动减少read和write的次数
2.使用标准库提供的"BufferedStream"缓冲区流
相关文章:
文件IO(Java)
注:此博文为本人学习过程中的笔记 1.概念 狭义上的文件是指保存在硬盘上的文件,广义上指操作系统进行资源管理的一种机制,很多软件/硬件资源都可以抽象成文件,这里我们针对的是狭义上的文件。 在硬盘里还有文件夹,这…...
常见缓存淘汰算法(LRU、LFU、FIFO)的区别与实现
一、前言 缓存淘汰算法主要用于在内存资源有限的情况下,优化缓存空间的使用效率。以确保缓存系统在容量不足时能够智能地选择需要移除的数据。 二、LRU(Least Recently Used) 核心思想:淘汰最久未被访问的数据。实现方式&#x…...

Sentinel数据S2_SR_HARMONIZED连续云掩膜+中位数合成
在GEE中实现时,发现简单的QA60是无法去云的,最近S2地表反射率数据集又进行了更新,原有的属性集也进行了变化,现在的SR数据集名称是“S2_SR_HARMONIZED”。那么: 要想得到研究区无云的图像,可以参考执行以下…...

HTMLCSS模板实现水滴动画效果
.container 类:定义了页面的容器样式。 display: flex:使容器成为弹性容器,方便对其子元素进行布局。justify-content: center 和 align-items: center:分别使子元素在水平和垂直方向上居中对齐。min-height: 100vh:设…...
Cesium实现地形可视域分析
Cesium实现可视化分析 一、地形可视域主要实现技术(Ray + 地形碰撞检测) Cesium 本身的 Ray 类可以用来执行非常精确的射线检测,我们可以结合地形高度(sample)来逐点检测光线是否与 terrain 相交,从而判断是否可见。 1.1 优势 实时判断每条射线是否被 terrain 遮挡地形…...
前端如何获取文件的 Hash 值?多种方式详解、对比与实践指南
文章目录 前言一、Hash 值为何重要?二、Hash 值基础知识2.1 什么是 Hash?2.2 Hash 在前端的应用场景2.3 常见的 Hash 算法(MD5、SHA 系列) 三、前端获取文件 Hash 的常用方式3.1 使用 SparkMD5 计算 MD5 值3.2 使用 Web Crypto AP…...

【数据可视化艺术·应用篇】三维管线分析如何重构城市“生命线“管理?
在智慧城市、能源管理、工业4.0等领域的快速发展中,地下管线、工业管道、电力通信网络等“城市血管”的复杂性呈指数级增长。传统二维管理模式已难以应对跨层级、多维度、动态变化的管线管理需求。三维管线分析技术应运而生,成为破解这一难题的核心工具。…...
蓝桥杯 16.对局匹配
对局匹配 原题目链接 题目描述 小明喜欢在一个围棋网站上找别人在线对弈。这个网站上所有注册用户都有一个积分,代表他的围棋水平。 小明发现,网站的自动对局系统在匹配对手时,只会将积分差恰好是 K 的两名用户匹配在一起。如果两人分差小…...

【MinerU】:一款将PDF转化为机器可读格式的工具——RAG加强(Docker版本)
目录 创建容器 安装miniconda 安装mineru CPU运行 GPU加速 多卡问题 创建容器 构建Dockerfile文件 开启ssh服务,设置密码为1234等操作 # 使用官方 Ubuntu 24.04 镜像 FROM ubuntu:24.04# 安装基础工具和SSH服务 RUN apt-get update && \apt-get ins…...
DeepSeek回答过于笼统,提示词如何优化
针对DeepSeek回答过于笼统的问题,可通过以下方法优化,使输出更具体、详细: 一、优化提示词设计 明确具体要求 在提问中嵌入「背景限制示例」,例如: “作为跨境电商运营新手,请详细说明如何优化亚马逊产品标…...
C语言实现贪心算法
一、贪心算法核心思想 特征:在每一步选择中都采取当前状态下最优(局部最优)的选择,从而希望导致全局最优解 适用场景:需要满足贪心选择性质和最优子结构性质 二、经典贪心算法示例 1. 活动选择问题 目标:…...
全球碳化硅晶片市场深度解析:技术迭代、产业重构与未来赛道争夺战(2025-2031)
一、行业全景:从“材料突破”到“能源革命”的核心引擎 碳化硅(SiC)作为第三代半导体材料的代表,凭借其宽禁带(3.26eV)、高临界击穿场强(3MV/cm)、高热导率(4.9W/cmK&…...
FreeRTOS学习笔记【10】-----任务上下文切换
1 概念性内容 开机到调度需要经历的步骤有: 系统初始化任务创建启动调度器上下文切换时间分片任务执行 1.1 任务本质 FreeRTOS 的 任务(Task)本质上就是一个运行在任务自己的栈区中无限循环的函数 一段上下文(context&#x…...

Appium自动化开发环境搭建
自动化 文章目录 自动化前言 前言 Appium是一款开源工具,用于自动化iOS、Android和Windows桌面平台上的本地、移动web和混合应用程序。原生应用是指那些使用iOS、Android或Windows sdk编写的应用。移动网页应用是通过移动浏览器访问的网页应用(appum支持iOS和Chrom…...

C++学习-入门到精通-【1】C++编程入门,输入/输出和运算符
C学习-入门到精通-【1】C编程入门,输入/输出和运算符 C编程入门,输入/输出和运算符 C学习-入门到精通-【1】C编程入门,输入/输出和运算符第一个C程序:输出一行文本算术运算 第一个C程序:输出一行文本 // 文本打印程序…...
UOJ 228 基础数据结构练习题 Solution
Description 给定序列 a ( a 1 , a 2 , ⋯ , a n ) a(a_1,a_2,\cdots,a_n) a(a1,a2,⋯,an),有 m m m 个操作分三种: add ( l , r , k ) \operatorname{add}(l,r,k) add(l,r,k):对每个 i ∈ [ l , r ] i\in[l,r] i∈[l,r] 执行 …...

面向高性能运动控制的MCU:架构创新、算法优化与应用分析
摘要:现代工业自动化、汽车电子以及商业航天等领域对运动控制MCU的性能要求不断提升。本文以国科安芯的MCU芯片AS32A601为例,从架构创新、算法优化到实际应用案例,全方位展示其在高性能运动控制领域的优势与潜力。该MCU以32位RISC-V指令集为基…...

某地农产品交易中心钢网架自动化监测项目
1. 项目简介 本项目规划建设现代物流产业园,新建6万平方米仓库,具体为新建3栋钢构仓库2万平方米,2栋砖混结构仓库1万平方米,3栋交易中心2万平方米,改造现有3栋3层砖混结构仓库1万平方米,配备智能化仓库物流…...

【无人机】无人机位置估计出现偏差的原因分析
目录 #0、原因分析 #1、过度振动的测定 #2、确定过度陀螺仪偏差 #3、偏航精度差的测定 #4、确定 GPS 精度差 #5、确定 GPS 数据丢失 #6、气压计地面效应补偿 #0、原因分析 位置背离的最常见原因是: 参考:Using the ECL EKF | PX4 Guide (v1.15)…...

element-plus(vue3)表单el-select下拉框的远程分页下拉触底关键字搜索实现
一、基础内核-自定义指令 1.背景 2.定义 3.使用 4.注意 当编辑时需要回显,此时由于分页导致可能匹配不到对应label文本显示,此时可以这样解决 二、升级使用-二次封装组件 三、核心代码 1.自定义指令 定义 ----------------selectLoadMoreDirective.…...

轻松完成视频创作,在线视频编辑器,无需下载软件,功能多样实用!
小白工具的在线视频编辑https://www.xiaobaitool.net/videos/edit/ 功能丰富、操作简便,在线裁剪或编辑视频工具,轻松完成视频创作能满足多种视频编辑需求。 格式支持广泛:可编辑超百种视频格式,基本涵盖常见和小众视频格式&#…...
高精度运算
1.乘法 #include <bits/stdc.h> using namespace std;char s1[2000], s2[2000]; int a[2000], b[2000], c[4000];int main() {cin >> s1 >> s2;int ls1 strlen(s1);int ls2 strlen(s2);int ls3 ls1 ls2;// 将字符串 s1 和 s2 转换为数组 a 和 bfor (int…...
express的模板handlebars用app.engine()创建配置和用exphbs.create()的区别
在使用 express-handlebars 时,app.engine 和 exphbs.create 都可以用来配置 Handlebars 模板引擎,但它们的使用方式和功能有一些区别。以下是详细的对比和说明 app.engine 方法 app.engine 是 Express 提供的方法,用于注册一个新的模板引擎…...

豆瓣图书数据采集与可视化分析(三)- 豆瓣图书数据统计分析
文章目录 前言一、数据读取与保存1. 读取清洗后数据2. 保存数据到CSV文件3. 保存数据到MySQL数据库 二、不同分类统计分析1. 不同分类的图书数量统计分析2. 不同分类的平均评分统计分析3. 不同分类的平均评价人数统计分析4. 不同分类的平均价格统计分析5. 分类综合分析 三、不同…...
聊透多线程编程-线程互斥与同步-13. C# Mutex类实现线程互斥
目录 一、什么是临界区? 二、Mutex类简介 三、Mutex的基本用法 解释: 四、Mutex的工作原理 五、使用示例1-保护共享资源 解释: 六、使用示例2-跨进程同步 示例场景 1. 进程A - 主进程 2. 进程B - 第二个进程 输出结果 ProcessA …...
Sql刷题日志(day5)
面试: 1、从数据分析角度,推荐模块怎么用指标衡量? 推荐模块主要目的是将用户进行转化,所以其主指标是推荐的转化率推荐模块的指标一般都通过埋点去收集用户的行为并完成相应的计算而形成相应的指标数据,而这里的驱动…...
【Test】单例模式❗
文章目录 1. 单例模式2. 单例模式简单示例3. 懒汉模式4. 饿汉模式5. 懒汉式和饿汉式的区别 1. 单例模式 🐧定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点。 单例模式是一种常用的软件设计模式,在它的核心结构中只包…...

c++进阶——类与继承
文章目录 继承继承的基本概念继承的基本定义继承方式继承的一些注意事项 继承类模板 基类和派生类之间的转换继承中的作用域派生类的默认成员函数默认构造函数拷贝构造赋值重载析构函数默认成员函数总结 不能被继承的类继承和友元继承与静态成员多继承及其菱形继承问题继承模型…...
虚拟滚动;懒加载;高并发组件
虚拟滚动的实现 思路:它只渲染当前可视区域内的元素,而不是整个列表,滚动时计算出应该显示哪些元素 原生JS class VirtualScroll {constructor(container, items, itemHeight, renderItem) {this.container container;this.items items;t…...

复杂地形越野机器人导航新突破!VERTIFORMER:数据高效多任务Transformer助力越野机器人移动导航
作者: Mohammad Nazeri 1 ^{1} 1, Anuj Pokhrel 1 ^{1} 1, Alexandyr Card 1 ^{1} 1, Aniket Datar 1 ^{1} 1, Garrett Warnell 2 , 3 ^{2,3} 2,3, Xuesu Xiao 1 ^{1} 1单位: 1 ^{1} 1乔治梅森大学计算机科学系, 2 ^{2} 2美国陆军研究实验室&…...