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

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

反向工程与模型迁移:打造未来商品详情API的可持续创新体系

在电商行业蓬勃发展的当下&#xff0c;商品详情API作为连接电商平台与开发者、商家及用户的关键纽带&#xff0c;其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息&#xff08;如名称、价格、库存等&#xff09;的获取与展示&#xff0c;已难以满足市场对个性化、智能…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

unix/linux,sudo,其发展历程详细时间线、由来、历史背景

sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...

k8s业务程序联调工具-KtConnect

概述 原理 工具作用是建立了一个从本地到集群的单向VPN&#xff0c;根据VPN原理&#xff0c;打通两个内网必然需要借助一个公共中继节点&#xff0c;ktconnect工具巧妙的利用k8s原生的portforward能力&#xff0c;简化了建立连接的过程&#xff0c;apiserver间接起到了中继节…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek

文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama&#xff08;有网络的电脑&#xff09;2.2.3 安装Ollama&#xff08;无网络的电脑&#xff09;2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...

【JVM】Java虚拟机(二)——垃圾回收

目录 一、如何判断对象可以回收 &#xff08;一&#xff09;引用计数法 &#xff08;二&#xff09;可达性分析算法 二、垃圾回收算法 &#xff08;一&#xff09;标记清除 &#xff08;二&#xff09;标记整理 &#xff08;三&#xff09;复制 &#xff08;四&#xff…...

DiscuzX3.5发帖json api

参考文章&#xff1a;PHP实现独立Discuz站外发帖(直连操作数据库)_discuz 发帖api-CSDN博客 简单改造了一下&#xff0c;适配我自己的需求 有一个站点存在多个采集站&#xff0c;我想通过主站拿标题&#xff0c;采集站拿内容 使用到的sql如下 CREATE TABLE pre_forum_post_…...