当前位置: 首页 > 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的同…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

OpenLayers 分屏对比(地图联动)

注&#xff1a;当前使用的是 ol 5.3.0 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key 地图分屏对比在WebGIS开发中是很常见的功能&#xff0c;和卷帘图层不一样的是&#xff0c;分屏对比是在各个地图中添加相同或者不同的图层进行对比查看。…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

Go 并发编程基础:通道(Channel)的使用

在 Go 中&#xff0c;Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式&#xff0c;用于在多个 Goroutine 之间传递数据&#xff0c;从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

React从基础入门到高级实战:React 实战项目 - 项目五:微前端与模块化架构

React 实战项目&#xff1a;微前端与模块化架构 欢迎来到 React 开发教程专栏 的第 30 篇&#xff01;在前 29 篇文章中&#xff0c;我们从 React 的基础概念逐步深入到高级技巧&#xff0c;涵盖了组件设计、状态管理、路由配置、性能优化和企业级应用等核心内容。这一次&…...