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

IO文件操作

认识文件

狭义的文件

存储在硬盘上的数据,以“文件"为单位,进行组织
常见的就是普通的文件
(文本文件,图片, office系列,视频,音频可执行程序…)文件夹也叫做"目录"
也是一种特殊的文件。

广义的文件

操作系统,是要负责管理软硬件资源,操作系统(Linux)往往会把这些资源都统一的抽象成"文件"来进行管理。

“一切皆文件”

比如.有一个网卡就把网卡这个设备抽象成一个文件.创建了特殊的文件,表示网卡从网卡接受数据,就读这个文件,往网卡里发送数据,就写这个文件
比如,有一个键盘想从键盘读取数据,也是把键盘抽象成一个文件(stdin),,读这个文件就能读到用户输入的按键内容了.

目录结构

本质是一颗多叉树。

image-20230306165509710

一个文件在电脑上的具体位置,就过多叉树上的路径来描述。

路径

1、绝对路径

从树型结构的角度来看,树中的每个结点都可以被一条从根开始,一直到达的结点的路径所描

述,而这种描述方式就被称为文件的绝对路径

E:\编程\xshell

image-20230306170045374

image-20230306165701739

2、相对路径

从根开始进行路径的描述,我们可以从任意结点出发,进行路径的描述,而这种描述方式就被

称为相对路径(relative path),相对于当前所在结点的一条路径

大白话:

首先得有一个"基准路径”也叫做"工作路径"
相对路径就是以基准路径为起点,往下继续怎么走,才能到达目标的路径表示方式

假设基准路径是E盘,此时我想到xshell这个目录下:E:\编程\xshell

./编程/xshell

.用于表示"当前目录"

如果基准路径是:E:\编程\xshell\ColorSchemes,我想到xshell目录找xshell.exe

用相对路径表示:…/xshell.exe

..用于表示返回上一级目录

Java 中操作文件

文进程中是属于操作系统层面提供的一系列API,不同的操作系统提供的API不同,Java作为一个跨平台的语言,为了统一代码,就在JVM中把不同系统的操作文件的API进行了封装。

Java 中通过 java.io.File 类来对一个文件(包括目录)进行抽象的描述。注意,有 File 对象,并不

代表真实存在该文件。

File概述

看 File 类中的常见属性、构造方法和方法

构造方法:

签名说明
File(File parent, String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例
File(String pathname)根据文件路径创建一个新的 File 实例,路径可以是绝对路径或者相对路径
File(String parent, String child)根据父目录 + 孩子文件路径,创建一个新的 File 实例,父目录用路径表示

常用方法:

修饰符及返回值类型** **方法签名说明
StringgetParent()返回 File 对象的父目录文件路径
StringgetName()返回 FIle 对象的纯文件名称
StringgetPath()返回 File 对象的文件路径
StringgetAbsolutePath()返回 File 对象的绝对路径
StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径
booleanexists()判断 File 对象描述的文件是否真实存在
booleanisDirectory()判断 File 对象代表的文件是否是一个目录
booleanisFile()判断 File 对象代表的文件是否是一个普通文件
booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返回 true
booleandelete()根据 File 对象,删除该文件。成功删除后返回 true
String[]list()根据 File 对象,删除该文件。成功删除后返回 true
File[]listFiles()返回 File 对象代表的目录下的所有文件名
booleanmkdir()创建 File 对象代表的目录
booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录
booleanrenameTo(File dest)进行文件改名,也可以视为我们平时的剪切、粘贴操作
voiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行

实例代码1:

public static void main(String[] args) throws IOException {File file = new File("E:\\编程\\coding");System.out.println(file.getParent());System.out.println(file.getName());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());}

E:\编程 【父目录文件路径】
coding 【 FIle 对象的纯文件名称】
E:\编程\coding 【File 对象的文件路径】
E:\编程\coding 【返回 File 对象的绝对路径
E:\编程\coding 【返回 File 对象的修饰过的绝对路径】

实例代码2:

public static void main(String[] args) throws IOException {File file = new File(".\\bbb.txt");System.out.println(file.getParent());System.out.println(file.getName());System.out.println(file.getPath());System.out.println(file.getAbsolutePath());System.out.println(file.getCanonicalPath());}

. 【父目录文件路径】
bbb.txt 【 FIle 对象的纯文件名称】
.\bbb.txt 【File 对象的文件路径】
C:\Users\22479\Desktop\Java\源码项目包\File.\bbb.txt 【返回 File 对象的绝对路径】
C:\Users\22479\Desktop\Java\源码项目包\File\bbb.txt 【返回 File 对象的修饰过的绝对路径】

代码示例3:

【假设一开始没bbb.txt这个文件 当前的.代表的是

image-20230306173148425

public static void main(String[] args) throws IOException {File file = new File(".\\bbb.txt");System.out.println(file.exists());System.out.println(file.isDirectory());System.out.println(file.createNewFile());System.out.println(file);
}

false 【文件不存在】
false 【这不是一个文件夹文件】
true 【创建文件成功】

image-20230306173139066

文件内容的读写**——** 数据流

【stream】流 :把读写操作比喻成“水流”

Java标准库就在“流”的概念上提供了一组类,完成读写文件的操作

image-20230306174512024

InputStream概述

方法

返回类型方法说明
intread()读取一个字节的数据,未读取到返回-1
intread(byte[] b)最多读取b.length字节的数据到b中,返回实际读到的数量。未读取到返回-1
intread(byte[] b,int off,int len)从off位置开始,最多读取len个字节,返回实际读到的数量,未读到返回-1
voidclose()关闭字节流

byte[] b:将读取到的内容放到这个数组中

InputStream 只是一个抽象类,要使用还需要具体的实现类,我们现在只关心从文件中读取,所以使用FileInputStream

FileInputStream

构造方法:

FileInputStream(File file)利用 File 构造文件输入流
FileInputStream(String name)利用文件路径构造文件输入流

示例一:读取bbb.txt里面的内容

image-20230306175626839

public static void main(String[] args) throws IOException {//这个操作相当于打开文件,想要读文件就得先打开InputStream inputStream = new FileInputStream(".\\bbb.txt");while(true) {int n = inputStream.read();// 代表文件已经全部读完if(n == -1) {break;}System.out.println(n);}//打开完毕以后必须关闭,防止内存泄漏inputStream.close();
}

读取的过程返回的int 值是对应字符的ascall码

当读完文件时候,read方法会返回-1

利用 Scanner 进行字符读取

上述例子中,我们看到了对字符类型直接使用 InputStream 进行读取是非常麻烦且困难的,所以,我们使用一种我们之前比较熟悉的类来完成该工作,就是 Scanner 类。

构造方法说明
Scanner(InputStream source)构造一个Scanner,产生从指定输入流产生的值
public static void main(String[] args) throws IOException {//这个操作相当于打开文件,想要读文件就得先打开InputStream inputStream = new FileInputStream(".\\bbb.txt");//Scanner构造方法 产生从指定输入流产生的值Scanner scanner = new Scanner(inputStream);//hasnext() 去读,如果读到空字符串就结束while(scanner.hasNext()) {String n = scanner.next();System.out.println(n);}//打开完毕以后必须关闭,防止内存泄漏inputStream.close();
}

OutputStream 概述

OutputStream 同样只是一个抽象类,要使用还需要具体的实现类。我们现在还是只关心写入文件中,所以使用 FileOutputStream

返回值方法说明
voidwrite(int b)写一个字节
voidwrite(byte[] bytes)将bytes数组的数据写到输出流
voidwrite(byte[] b,int off,int len)从off位置开始,写len长度的数据到输出流
voidclose()关闭字节流
voidflush()刷新缓存区,将数据刷新到硬盘

flush():我们知道 I/O 的速度是很慢的,所以,大多的 OutputStream 为了减少设备操作的次数,在写数据的时候都会将数据先暂时写入内存的一个指定区域里,直到该区域满了或者其他指定条件时才真正将数据写入设备中,这个区域一般称为缓冲区。但造成一个结果,就是我们写的数据,很可能会遗留一部分在缓冲区中。需要在最后或者合适的位置,调用 flush(刷新)操作,将数据刷到设备中。

FileOutputStream

构造方法说明
FileInOutStream(String name)利用文件路径构造文件输入流

向bbb.txt文件里面写入:“bili”

public static void main(String[] args) throws IOException {//这个操作相当于打开文件,想要读文件就得先打开OutputStream outputStream = new FileOutputStream(".\\bbb.txt");//使用write往bbb.txt写内容outputStream.write('b');outputStream.write('i');outputStream.write('l');outputStream.write('i');//关闭outputStream 防止内存泄漏outputStream.close();
}

注意:使用OutputStream写文件的时候,只要打开文件成功,就会把原有的内容清空。

利用PrinterPrintWriter进行输出

PrintWriter 类中提供了我们熟悉的 print/println/printf 方法

public static void main(String[] args) throws IOException {//这个操作相当于打开文件,想要读文件就得先打开OutputStream outputStream = new FileOutputStream(".\\bbb.txt");PrintWriter printWriter = new PrintWriter(outputStream);printWriter.print('b');printWriter.print('i');printWriter.print('l');printWriter.print('i');printWriter.print('b');printWriter.print('i');printWriter.print('l');printWriter.print('i');//关闭outputStream 防止内存泄漏printWriter.close();outputStream.close();
}

Reader概述

读取的是字符类的数据流

返回类型方法说明
intread()读取一个字节的数据,未读取到返回-1
intread(char[] b)最多读取b.length字节的数据到b中,返回实际读到的数量。未读取到返回-1
intread(char[] b, int off, int len)从off位置开始,最多读取len个字节,返回实际读到的数量,未读到返回-1

Reader是一个接口,真正的想使用Reader下面的方法进行读取,还需要使用FileReader

FileReader

构造方法:

FileInputStream(File file)利用 File 构造文件输入流
FileReader(String name)利用文件路径构造文件输入流

示例:

public static void main(String[] args) throws IOException {//这个操作相当于打开文件,想要读文件就得先打开Reader reader = new FileReader(".\\bbb.txt");while(true) {int n = reader.read();if(n == -1) {break;}//FileRed的read方法虽然返回值是int类型,当实际应该是字符类型,我们需要手动强转 【reader读取字符流】System.out.print((char)n);}//进行问卷操作的时候完毕以后要close,防止资源泄露reader.close();
}

为什么要close

每个进程都对应着(一个或者多个)PCB,PCB里面有一个字段,文件描述表

文件描述表:相当于是一个数组/顺序表;进程每次打开 一个文件,都会在这个表里创建一个项,就表示一个文件,如果关闭一个文件,就会把对应的项释放掉。

如果不关闭,意味着这个项就在这里占着位置,如果你持续打开文件,并且从来不关,此时就会导致数组/顺序表位置被耗尽,后续再打开文件,就会打开失败

这就称作:文件资源泄露,非常严重的问题。

例如一群人来图书馆,每次借书以后都不还,后面的人想要借也没了,被那群不还的家伙借光了。

try with resources

image-20230306193121317

解决办法:使用try with resource

image-20230306193227828

把要关闭的对象写到try()里,当try结束,就会自动的调用到对应的对象的close方法,而且支持一个()放多个对象,多个对象的创建之间使用分割就行了。

OuptString操作每次都会覆盖之前的文件内容

/顺序表位置被耗尽,后续再打开文件,就会打开失败**。

这就称作:文件资源泄露,非常严重的问题。

例如一群人来图书馆,每次借书以后都不还,后面的人想要借也没了,被那群不还的家伙借光了。

try with resources

[外链图片转存中…(img-ZZivm3gg-1678103137099)]

解决办法:使用try with resource

[外链图片转存中…(img-1PIV7pLS-1678103137100)]

把要关闭的对象写到try()里,当try结束,就会自动的调用到对应的对象的close方法,而且支持一个()放多个对象,多个对象的创建之间使用分割就行了。

OuptString操作每次都会覆盖之前的文件内容

FileRed的read方法虽然返回值是-1,但是他的真正的返回值其实是一个

相关文章:

IO文件操作

认识文件 狭义的文件 存储在硬盘上的数据,以“文件"为单位,进行组织 常见的就是普通的文件 (文本文件,图片, office系列,视频,音频可执行程序…)文件夹也叫做"目录" 也是一种特殊的文件。 广义的文件 操作系统,是要负责管理软硬件资源,操作系统(…...

【构建工具】webpack 3、4 升级指南,摆脱低版本的困扰

一、依赖处理 1.升级通用依赖 借用 ncu 库实现&#xff0c;帮你改写需要升级的package.json 然后再 npm install ncu -u <packages> # 可以指定依赖 ncu # 升级全部依赖大概列了下升级的效果 add-asset-html-webpack-plugin ^2.1.3 → ^5.0.2 clean-webpack-…...

Javaweb第一个项目——实现简单的登陆功能

第一步&#xff1a;打开idea-->文件-->新建 第二步&#xff1a; 在Demo文件夹 点击右键-->添加框架支持-->找到Web应用程序 勾选 第三步&#xff1a;配置Tomcat 第四步&#xff1a;新建一个lib&#xff08;建在web-INF文件夹下&#xff09;文件夹 用于存放jar包…...

OpenKruise 开发者不容错过的带薪实习机会!马上加入 LFX Mentorship 计划

LFX Mentorship 计划由 Linux Foundation 组织发起&#xff0c;为像 OpenKruise 这样的 CNCF 托管项目提供了激励开源贡献、扶植社区发展的优秀土壤。参与其中的开发者不仅有机会在经验丰富的社区 Mentor 指导下贡献开源项目、为职业生涯加分&#xff0c;完成工作后还能获得 $3…...

《c++ primer笔记》第八章 IO库

前言 简单看一下就行 文章目录一、IO类1.1基本概念1.2管理输出缓冲二、文件输入输出2.1文件模式三、string流3.1istringstream3.2ostringstream一、IO类 1.1基本概念 ​ 我们常见的流有istream和ostream&#xff0c;这两个流都是有关输入和输出的&#xff0c;此外&#xff0c…...

web开发 用idea创建一个新项目

这个写着就是给自己当备忘录用的QAQ 这个老师上课一通操作啥也没看清…卑微搞了半天看样子是成功了 记录一下省的以后忘了怎么创建&#xff08;&#xff1f; zufe lxy 2023.3 先行条件是已经自己装好了Tomcat和idea&#xff01;&#xff01;&#xff08;我的idea是申请了教育…...

【FMCW 03】测速

从上一讲 测距 末尾的frame讲起。我们知道一个chirp对应了一个采样后的IF信号&#xff0c;我们将这些采样后的IF信号按chirp的次序排列成一个帧&#xff08;frame&#xff09;&#xff0c;这就得到了我们实际中接收后处理的FMCW信号。 由于chirp的发射返回时间很短&#xff0c;…...

ERP(企业资源管理)概述

&#x1f31f;所属专栏&#xff1a;ERP企业资源管理&#x1f414;作者简介&#xff1a;rchjr——五带信管菜只因一枚&#x1f62e;前言&#xff1a;该系列将持续更新ERP的相关学习笔记&#xff0c;欢迎和我一样的小白订阅&#xff0c;一起学习共同进步~&#x1f449;文章简介&a…...

深入理解java虚拟机精华总结:性能监控和故障处理工具、类加载机制

深入理解java虚拟机精华总结&#xff1a;性能监控和故障处理工具、类加载机制性能监控和故障处理工具、类加载机制jpsjstatjinfojmapjhatjstackVisualVM类加载机制类加载的时机类加载的过程加载验证准备解析初始化类加载器类与类加载器双亲委派模型破坏双亲委派模型往期内容&am…...

推荐系统与推荐算法

文章目录第一章1.1推荐系统意义与价值1.2推荐系统历史与框架1.3推荐算法分类第二章2.1协同过滤的基本思想与分类2.2基于用户的协同过滤2.3基于项目的协同过滤2.4基于邻域的评分预测2.5基于二部图的协同过滤第三章3.1基于关联规则的推荐3.2基于矩阵分解的评分预测3.3概率矩阵分解…...

socket 编程实战(编写客户端程序 )

编写客户端程序 接着上一篇&#xff1a;实战服务端程序 接下来我们再编写一个简单地客户端应用程序&#xff0c;客户端的功能是连接上小节所实现的服务器&#xff0c;连接成功之后向服务器发送数据&#xff0c;发送的数据由用户输入。示例代码如下所示&#xff1a; #include…...

“巨亏成名”的魔鬼交易员,你知道几个?

谁说在期货市场上只有赚大钱才能出名&#xff1f;殊不知还有这样一群特殊的交易员靠着巨额亏损而“一战成名”&#xff0c;亏得是老东家元气大伤&#xff0c;外号“魔鬼交易员”——“不亏不成魔”&#xff01;接下来火象就给大家盘点几位代表性魔鬼交易员&#xff0c;看看他们…...

1380:分糖果(candy)

1380&#xff1a;分糖果(candy) 时间限制: 1000 ms 内存限制: 65536 KB 【题目描述】 童年的我们&#xff0c;将和朋友分享美好的事物作为自己的快乐。这天&#xff0c;C小朋友得到了Plenty of candies&#xff0c;将要把这些糖果分给要好的朋友们。已知糖果从一个人传…...

数据挖掘(2.1)--数据预处理

一、基础知识 1.数据的基本概念 1.1基础知识 数据是数据对象(Data Objects)及其属性(Attributes)的集合。 数据对象(一条记录、一个实体、一个案例、一个样本等)是对一个事物或者物理对象的描述。 数据对象的属性则是这个对象的性质或特征&#xff0c;例如一个人的肤色、眼球…...

PMP考前冲刺3.06 | 2023新征程,一举拿证

题目1-2&#xff1a;1.一名团队成员表示&#xff0c;他们的用户故事要等到迭代结束后才能完成&#xff0c;因为他们的职能经理要求他们协助解决高优先级的生产问题。项目经理应该做什么&#xff1f;A.将问题上报给项目发起人以解决和调整项目燃尽图B.与产品负责人讨论用户故事不…...

buuctf-pwn write-ups (11)

文章目录buu083-x_ctf_b0verfl0wbuu084-picoctf_2018_leak_mebuu085-inndy_echobuu086-hitcontraining_unlinkbuu087-ciscn_2019_final_3buu088-axb_2019_fmt64buu089-wustctf2020_name_your_catbuu090-pwnme1buu091-axb_2019_brop64buu092-[极客大挑战 2019]Not Badbuu083-x_c…...

【VTK】VTK隐藏vtkOutputWindow窗口的正确方法

VTK隐藏vtkOutputWindow窗口 要求隐藏vtkOutputWindow窗口&#xff0c;但是不能把Warning警告和Error错误的信息都给屏蔽了 网上常见的错误方法&#xff1a; 现在百度搜索出来的方法几乎都是在这样做&#xff1a;在main文件中使用vtkOutputWindow::SetGlobalWarningDisplay(0…...

顺序表以及链表的应用及区别(包含OJ讲解)

前面我已经发过怎么实现链表以及顺序表&#xff0c;今天大概的总结一下。 顺序表&#xff1a; 1.能够随时的存取&#xff0c;比较方便。 2.插入删除时&#xff0c;需要挪动数据&#xff0c;比较麻烦&#xff0c;因为是连续存储。 3.存储密度相对于链表来说是比较高的&#…...

JVM简介

一、什么是JVM JVM是Java Virtual Machine&#xff08;Java虚拟机&#xff09;的缩写&#xff0c;JVM是一种用于计算设备的规范&#xff0c;它是一个虚构出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 Java语言的一个非常重要的特点就是与平…...

Leetcode.1653 使字符串平衡的最少删除次数

题目链接 Leetcode.1653 使字符串平衡的最少删除次数 Rating &#xff1a; 1794 题目描述 给你一个字符串 s&#xff0c;它仅包含字符 a和 b​​​​ 。 你可以删除 s中任意数目的字符&#xff0c;使得 s平衡 。当不存在下标对 (i,j)满足 i < j&#xff0c;且 s[i] b的同…...

AI驱动编辑预设:智能调色与音频处理实战指南

1. 项目概述&#xff1a;AI驱动的编辑预设库最近在折腾视频和图片后期的时候&#xff0c;发现一个挺有意思的项目&#xff0c;叫kaushalrao/ai-editor-presets。光看名字&#xff0c;你可能觉得这又是一个普通的滤镜包或者调色预设合集。但深入用下来&#xff0c;我发现它的核心…...

超长上下文时代来临:百万Token窗口实测,我的工作流彻底变了

前言&#xff1a;一个让我彻底改变工作方式的实验 2026年初&#xff0c;我做了一件以前根本不敢想的事&#xff1a;把一份长达800页的技术规范文档&#xff0c;直接塞进了一个大模型的上下文窗口&#xff0c;然后让它帮我找出其中所有与安全性相关的条款&#xff0c;并逐条解释…...

基于Hive的淘宝用户购物行为数据分析及可视化

第1章 绪论1.1 课题背景互联网技术迅猛发展&#xff0c;电子商务平台聚集了庞大的用户数据&#xff0c;其中包含着大量的用户行为信息以及消费习惯。淘宝是中国最大的电子商务平台之一&#xff0c;其用户购物行为数据具有很高的研究价值。在大数据的背景下&#xff0c;怎样对数…...

Taotoken标准OpenAI协议兼容性在实际项目迁移过程中带来的便利

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken标准OpenAI协议兼容性在实际项目迁移过程中带来的便利 1. 项目背景与迁移动因 我们维护着一个内部知识库问答系统&#x…...

基于Circuit Playground Express与MakeCode的动感火焰球DIY制作全攻略

1. 项目概述&#xff1a;打造你的专属动感火焰球如果你玩过《魔兽世界》&#xff0c;一定对凯尔萨斯逐日者手中那团标志性的魔法火焰印象深刻&#xff1b;或者&#xff0c;你也曾幻想过像马里奥兄弟一样&#xff0c;投掷出酷炫的火球。现在&#xff0c;这个幻想可以变成你Cospl…...

3分钟快速上手:用MoneyPrinterTurbo一键生成AI短视频的完整指南

3分钟快速上手&#xff1a;用MoneyPrinterTurbo一键生成AI短视频的完整指南 【免费下载链接】MoneyPrinterTurbo 利用AI大模型&#xff0c;一键生成高清短视频 Generate short videos with one click using AI LLM. 项目地址: https://gitcode.com/GitHub_Trending/mo/MoneyP…...

怎么限制用户上传到MongoDB GridFS的文件总容量

GridFS不支持全局容量配额&#xff0c;需在应用层实现配额校验&#xff1a;上传前聚合查询fs.files中指定用户的length总和&#xff0c;判断是否超限&#xff0c;且须防范并发写入导致的超限问题。GridFS 本身不提供全局容量配额机制MongoDB 的 GridFS 是一个文件分片存储规范&…...

BQ34Z100-G1电量计配置不求人:用咸鱼EV2400+BqStudio完成电池组参数学习的保姆级教程

BQ34Z100-G1电量计配置实战&#xff1a;从零搭建高精度电池管理系统 在新能源和储能系统蓬勃发展的今天&#xff0c;精确的电池电量计量已成为电池管理系统(BMS)的核心竞争力。德州仪器(TI)的BQ34Z100-G1阻抗跟踪电量计凭借其出色的精度和稳定性&#xff0c;在工业储能、电动工…...

从零构建生产级AI助手:OpenClaw配置实战与自动化工作流指南

1. 项目概述&#xff1a;从零到一&#xff0c;构建你的生产级AI助手工作空间如果你和我一样&#xff0c;已经厌倦了每次配置AI助手时&#xff0c;都要从零开始摸索各种配置文件、脚本和最佳实践&#xff0c;那么这个名为openclaw-config的项目&#xff0c;绝对是你梦寐以求的“…...

NAS极速搭建PostgreSQL:打造个人专属数据仓库

1. 为什么选择NASPostgreSQL组合&#xff1f; 最近几年&#xff0c;越来越多的技术爱好者开始在家用NAS上部署数据库服务。我自己从2018年开始尝试这种方案&#xff0c;先后测试过MySQL、MongoDB和PostgreSQL&#xff0c;最终发现PostgreSQL在NAS上的表现最为出色。相比云数据库…...