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

leetcode 71~80 学习经历

leetcode 71~80 学习经历71. 简化路径72. 编辑距离73. 矩阵置零74. 搜索二维矩阵75. 颜色分类76. 最小覆盖子串77. 组合78. 子集79. 单词搜索80. 删除有序数组中的重复项 II小结71. 简化路径 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &am…...

使用metrics-server监控k8s的资源指标

首先&#xff0c;欢迎使用DHorse部署k8s应用。 k8s可以通过top命令来查询pod和node的资源使用情况&#xff0c;如果直接运行该命令&#xff0c;如下所示。 [rootcentos05 deployment]# kubectl top pod W0306 15:23:24.990550 8247 top_pod.go:140] Using json format to …...

【Copula】考虑风光联合出力和相关性的Copula场景生成(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

【java基础】泛型程序设计基础

文章目录泛型是什么自定义泛型类自定义泛型方法类型变量的限定总结泛型是什么 泛型类和泛型方法有类型参数&#xff0c;这使得它们可以准确地描述用特定类型实例化时会发生什么。在没有泛型类之前&#xff0c;程序员必须使用Objct编写适用于多种类型的代码。这很烦琐&#xff…...

【省选模拟测试23 T1直径】更好的做法

题目大意和普通做法 省选模拟测试23 T1直径 题解 对于上文中有三个儿子的根节点的树&#xff0c;其直径数量为abbccaabbccaabbcca。那么对于上文中有nnn个儿子的根节点的树&#xff0c;其直径数量为多少呢&#xff1f; 每个儿子所在子树中的点与其他儿子所在子树中的点都能组…...

SpringCloud基础(3)-微服务远程调用

SpringCloud基础1. 微服务的远程调用2. Eureka注册中心1. 搭建Eureka服务注册中心1. 微服务的远程调用 服务提供者&#xff1a;一次业务中被其它服务调用的一方&#xff1b; 服务消费者&#xff1a;一次业务中调用其它服务的一方&#xff1b; 2. Eureka注册中心 记录所有服务…...

10.单点登录原理及JWT实现

单点登录原理及JWT实现 一、单点登录效果 首先我们看通过一个具体的案例来加深对单点登录的理解。案例地址&#xff1a;https://gitee.com/xuxueli0323/xxl-sso?_fromgitee_search 把案例代码直接导入到IDEA中 然后分别修改下server和samples中的配置信息 在host文件中配置 …...

图表控件LightningChart.NET 系列教程(十一):LightningChart 组件——添加至 Blend WPF 项目

LightningChart.NET 是一款高性能 WPF 和 Winforms 图表,可以实时可视化多达1万亿个数据点。可有效利用CPU和内存资源&#xff0c;实时监控数据流。同时&#xff0c;LightningChart使用突破性创新技术&#xff0c;以实时优化为前提&#xff0c;大大提升了实时渲染的效率和效果&…...

libGDX:灯光效果实现一(实现一个点光源)

国内的libGDX文章很少&#xff0c;特别是libGDX实现灯光效果&#xff0c;所以就开始总结灯光效果的实现 绿色的框 是为了方便看到Body位置&#xff0c;使用Box2DDebugRenderer渲染的 工欲善其事&#xff0c;必先利其器&#xff0c;工具集合 gdx-setup.jar 1. 从libGDX官网下载…...

Java生态/Redis中如何使用Lua脚本

文章目录一、安装LUA1&#xff09;简单使用二、lua语法简介1、注释1&#xff09;单行注释2&#xff09;多行注释2、关键字3、变量1&#xff09;全局变量2&#xff09;局部变量4、数据类型1&#xff09;Lua数组2&#xff09;字符串操作5、if-else6、循环1&#xff09;for循环1&g…...