【JavaEE】——文件IO

8e19eee2be5648b78d93fbff2488137b.png

阿华代码,不是逆风,就是我疯

你们的点赞收藏是我前进最大的动力!!

希望本文内容能够帮助到你!!

目录

一:认识文件

1:文件的概念

2:文件的结构

3:文件路径

(1)绝对路径

(2)相对路径

(3)举例

二:文件的分类

1:文本文件

2:二进制文件

3:如何判断文件的种类

三:Feil类对文件操作

1:Feil类

2:File类的构造方法

3:获取属性方法

代码示例一

代码示例二

 4:判断方法

 5:创建删除方法

6:创建移动方法

7:创建File对象代表的目录

8:文件改名操作

四:文件流

五:字节流

1:InputStream

(0)打开文件

(1)构造方法

(2)类/异常解析

(3)文件资源泄露

(4):read方法

①引入

②三种参数代码示例

2:OutputStream

3:Scanner联动

​编辑

六:字符流

1:Reader类

2:Writer类 


一:认识文件

1:文件的概念

对于计算机来说,“文件”是一个非常广义的概念,可以指普通的文件,文件夹,一些硬件设备也被抽象成了文件(例如:键盘,耳机,显示器,网卡等)

对于机械硬盘来说它更加擅长顺序读写,不擅长随机读写

比如有一个很大的文件,我们需要把这个文件整体复制一份就是顺序读写

某个目录中有很多的小文件,(数目比较多)需要把整个目录都拷贝一份,就是随机读写。

2:文件的结构

文件系统的结构是按照“树形结构”来组织文件的,是N叉树,一个普通文件(非目录)就是一个叶子节点,对一个目录文件来说,里面又可以有很多的子节点

3:文件路径

形如上述的图片,从树根节点,一级一级的往下走,直到直到目标文件,这个过程中经过的所有文件目录的名字串起来,使用正斜杠——“/”,或者反斜杠——“\”分割,就构成了“路径”

注:此过程并非是遍历树,可以想象成类似于Hash这样的结构

(1)绝对路径

从树根节点 出发,一层一层到达目标文件

(2)相对路径

先指定一个“当前目录”/“基准目录”,从当前目录出发,找到目标文件

(3)举例

二:文件的分类

1:文本文件

文本文件是按照“字符串”的形式来理解文本内容的(文本文件里面的二进制内容,也都表示为字符串,可以理解为——二进制内容都是合法的字符(像字符编码,英文字母用ASCII,汉字用utf8/gbk))

举例:.java   .c    .cpp   文本文档

2:二进制文件

二进制文件没有上述的限制,储存任何数据都可以。

举例:图片,音频,可执行程序,动态库,.class文件,富文本文件

富文本文件包括不限于:word  docx excle  xlsx  power point  pptx

3:如何判断文件的种类

使用记事本打开文本文件,如果看到的是乱码,就是二进制文件

三:Feil类对文件操作

引入:在Java中,对于文件操作的Api这里有两类

针对文件系统的操作:创建,删除,重命名,

针对文件内容的操作:读文件,写文件

1:Feil类

2:File类的构造方法

3:获取属性方法

代码示例一

构造File用绝对路径

import java.io.File;
import java.io.IOException;public class IO1 {public static void main(String[] args) throws IOException {File f = new File("C:/User/1/test.txt");//绝对路径//File f = new File("./test.txt");System.out.println(f.exists());//判断文件目录是否存在System.out.println(f.getParent());System.out.println(f.getName());//返回file对象的名称System.out.println(f.getPath());//返回file对象的文件路径System.out.println(f.getAbsolutePath());//返回绝对路径System.out.println(f.getCanonicalPath());//返回对象修饰过后的路径canonical规范的}}

代码示例二

构造对象用相对路径

.getPath()得到的就是构造方法中的参数

Canonical(读音:克挠你扣)规范的——可以理解为化简路径

import java.io.File;
import java.io.IOException;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 19:28*/
public class IO1 {public static void main(String[] args) throws IOException {//File f = new File("C:/User/1/test.txt");//绝对路径File f = new File("./test.txt");System.out.println(f.exists());//判断文件目录是否存在System.out.println(f.getParent());//返回父目录文件路径System.out.println(f.getName());//返回file对象的名称System.out.println(f.getPath());//返回file对象的文件路径System.out.println(f.getAbsolutePath());//返回绝对路径System.out.println(f.getCanonicalPath());//返回对象修饰过后的路径canonical规范的}}

 4:判断方法

我们可以使用file.createNewFile(如下代码),也可以直接手动在当前目录创建一个File文件——名字叫test.txt

import java.io.File;
import java.io.IOException;public class IODemon2 {public static void main(String[] args) throws IOException {File file = new File("./test.txt");System.out.println(file.exists());//文件存在吗System.out.println(file.isFile());//是普通文件嘛System.out.println(file.isDirectory());//是目录吗boolean ret = file.createNewFile();//创建文件;返回的结果就是创建成功和创建失败System.out.println("ret:" + ret);}}

 5:创建删除方法

file.delete删除文件,返回值类型为boolean类型

file.deleteNewFile退出时删除文件,返回值为void

注:删除目录只能一级一级的删除

import com.sun.xml.internal.ws.api.model.wsdl.WSDLOutput;import java.io.File;
import java.io.IOException;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:17*/
public class IODemon3 {public static void main(String[] args) throws IOException, InterruptedException {File file = new File("./test.txt");//boolean ret = file.delete();//删除文件//System.out.println(ret);boolean ret = file.createNewFile();//创建文件file.deleteOnExit();//返回值为void类型,退出的时候删除文件,测试的时候注意看左边的目录栏Thread.sleep(5000);}}

6:创建移动方法

import java.io.File;
import java.util.Arrays;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:44*/
public class IODemon4 {public static void main(String[] args) {File file = new File(".");//返回的是对象代表的目录下所有的文件//返回的是一个String[]类型的数组String[] files = file.list();System.out.println(Arrays.toString(files));//返回的file对象代表的目录下所有的文件,不过是以file对象表示File[] files2 = file.listFiles();System.out.println(Arrays.toString(files2));}
}

7:创建File对象代表的目录

import java.io.File;
import java.lang.reflect.Field;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-01* Time: 20:58*/
public class IODemon5 {public static void main(String[] args) {/* File file = new File("./aaa");//创建file为对象的目录boolean ret = file.mkdir();System.out.println(ret);*//* File file = new File("./bbb");boolean ret2 = file.mkdirs();//mkdirs(可以用于创建单个目录,也可以用于创建多级目录)System.out.println(ret2);*//*File file = new File("./aaa/bbb/ccc");boolean ret2 = file.mkdirs();//mkdirs(可以用于创建单个目录,也可以用于创建多级目录)System.out.println(ret2);*/File file = new File("./bbb");boolean ret = file.delete();//删除只能一级目录一级目录的删System.out.println(ret);}
}

8:文件改名操作

注意细节:file1文件改名为file2对象

import java.io.File;public class IODemon6 {public static void main(String[] args) {File file1 = new File("./aaa/bbb/ccc/bbb");File file2 = new File("./bbb");boolean ret = file2.renameTo(file1);//把bbb这个文件移入"./aaa/bbb/ccc"的/ccc下System.out.println(ret);}}

四:文件流

什么是文件流呢?

举个例子:要写100字节的内容,我们可以分10次写每次写10字节的内容,也可以分5次来写,每次写20字节的内容;当然也可以一次性写完

“流”是操作系统提供的概念,Java标准库中对于“进行了”封装,提供了一组类来负责这些工作

我们把这些类主要分为两种:字节流和字符流

五:字节流

代表类:InputStream——输入流,OutPutStream——输出流

1:InputStream

(0)打开文件

按照读文件的方式打开一个文件

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 11:46*/
public class IODemon7 {public static void main(String[] args) throws IOException {/*//打开文件InputStream inputStream = new FileInputStream("./test.txt");//在中间一定会涉及一些对文件的操作之类的,如果遇到bug或者像return之类的不可控的操作,close操作可能就会执行不到了//打开了文件最后还要关掉,打开文件操作会抛出FileNotFoundException异常inputStream.close();//关闭文件会抛出IOException异常,前后两者为父类子类的关系*//*//第二种写法InputStream inputStream = null;try {inputStream = new FileInputStream("./test.txt");}finally{inputStream.close();}*//*//第三种写法,try with resources版本try (InputStream inputStreeam = new FileInputStream("./test.txt")){//出了try{}代码块范围后,编译器会自动调用.close方法关闭文件//FileInputStream继承于InputStream,InputStream又实现了Closeable接口,必须实现了Closeable接口才可以被放到try()里面}*/}}

(1)构造方法

注:你给cpu送的信息叫输入,比如读操作。cpu给存储器等这些硬件设备送的信息叫做输出,比如写操作

(2)类/异常解析

(3)文件资源泄露

如果不执行文件关闭.close方法,就会有大问题。这里本质上是释放了文件的相关资源(PCB文件描述符表,不懂得铁子可以看前面写过的文章)这个表本质是一个数组或者顺序表,每打开一个文件,就会占据一个位置,如果不关闭一直打开就会导致表被耗尽,后续再想打开就会报错。

那么提问,文件描述符表不会动态扩容吗?对操作系统的内核来说,需要很高的性能,付出的代价太大了,容易造成系统的卡顿

(4):read方法

①引入

read读文件就是把硬盘数据读取到内存当中buffer,译为缓冲区

注意点①:offset此处缩写了

注意点②:传入的数组,在方法内部对数组内容修改过后,方法外部也能生效

注意点③:字符流读取文件的时候,

②三种参数代码示例

①*不带参数的读,一个一个字符的读

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 12:18*/
public class IOStream8 {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")){//读取操作,读到-1的时候就会停止while(true){int a = inputStream.read();if (a == -1){break;}System.out.print(a + " ");//读取的abcdef是ascii码值}}}
}

②*带入数组参数的读取,一次读取多个字符

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 12:56*/
public class IODemon9 {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")){while (true){//也可以一次读若干个字节,buffer(缓冲区)byte[] buffer = new byte[1024];//读的时候会尝试把buffer[1024]填满int n = inputStream.read(buffer);//传入的参数是buffer数组,方法内部对数组内容进行修改后,方法外部也能生效,实际上填不满1024个字节,if (n == -1){break;//读取到最后一个字符,就break}for (int i = 0; i < n; i++) {System.out.printf(" %x " ,buffer[i]);//遍历数组,并打印}}}}
}

③*构造String从0读到n(利用offset)

offset翻译为抵消补偿

注意看while循环:什么是文件流,假设我们要读取的文件很大,在这个循环中,每次尽可能读取1024个字节(可能读到的字节数比这个要小),这次读不完,我们就先用String给存起来(0到n),下一次while循环就接着读,“特别像字符串拼接   ”

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-02* Time: 13:22*/
public class IODemon10 {public static void main(String[] args) throws IOException {try(InputStream inputStream = new FileInputStream("./test.txt")){while (true){//也可以一次读若干个字节,buffer(缓冲区)byte[] buffer = new byte[1024];//读的时候会尝试把buffer[1024]填满int n = inputStream.read(buffer);//传入的参数是buffer数组,方法内部对数组内容进行修改后,方法外部也能生效if (n == -1){break;}String string = new String(buffer , 0 , n);//构造一个String对象,数组前n个字节来构造System.out.printf(string);//遍历数组,并打印}}}
}

2:OutputStream

按照写的方式打开文件

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 12:06*/
public class IODemo11 {public static void main(String[] args) throws FileNotFoundException {try{//打开操作会把原有文件中的内容清空,所以罪魁祸首不是Write操作而是打开操作OutputStream outputStream = new FileOutputStream("./test.txt");//OutputStream outputStream = new FileOutputStream("./test.txt",true);追加写byte[] buffer = new byte[]{97,98,99,100,101};outputStream.write(buffer);}catch (IOException e) {throw new RuntimeException(e);}}
}

3:Scanner联动

Scanner(System.in)中System.in本质就是一个InputStream

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.Scanner;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 13:21*/
public class IODemo14 {public static void main(String[] args) throws FileNotFoundException {try(InputStream inputStream = new FileInputStream("./test.txt")){Scanner scanner = new Scanner(inputStream);while(scanner.hasNext()){String s = scanner.next();System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}

六:字符流

以字符为单位进行读写,例如:用utf8表示汉字,3个字节就是一个汉字,每次读写都得以3个字节为单位来进行读写,不能一次读半个汉字

在用char类型的数组存储汉字时是把3个字节组成的utf8汉字转化为了Unicode,输出为String类型时在把Unicode转化为字节

代表类:Reader——输入,Writer——输出

1:Reader类

代码示例

把byte换为char测试一下,区别在于打印汉字

import java.io.*;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 12:33*/
public class IODemo12 {public static void main(String[] args) {try{//Reader和Writer的字符流与OutputStream和InputStream相似Reader reader= new FileReader("./test.txt");while(true){char[] buffer = new char[1024];int n = reader.read(buffer);if (n == -1){break;}String s = new String(buffer , 0 , n);System.out.println(s);}} catch (IOException e) {throw new RuntimeException(e);}}
}

如果文件中有内容换行操作了,那么有可能会有一些内容打印不到

2:Writer类 

记住:要把文件打开操作放到try()的括号里,要不然不会默认执行close关闭文件操作

import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;/*** Created with IntelliJ IDEA.* Description:* User: Hua YY* Date: 2024-10-05* Time: 13:07*/
public class IODemo13 {public static void main(String[] args) {try(Writer writer = new FileWriter("./test.txt",true)) {String s = "可选择续写操作 或者 清空在写操作";writer.write(s);} catch (IOException e) {throw new RuntimeException(e);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1555439.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【操作系统】体系结构

&#x1f339;&#x1f60a;&#x1f339;博客主页&#xff1a;【Hello_shuoCSDN博客】 ✨操作系统详见 【操作系统专项】 ✨C语言知识详见&#xff1a;【C语言专项】 目录 操作系统的内核 操作系统结构——分层结构 操作系统结构——模块化 操作系统结构——宏内核、微内核…

修改Anaconda虚拟环境默认安装路径(Linux系统)

文章目录 修改Anaconda虚拟环境默认安装路径(Linux系统)1.方法一&#xff1a;使用--prefix参数2.方法二&#xff1a;配置conda环境的默认安装位置 修改Anaconda虚拟环境默认安装路径(Linux系统) 1.方法一&#xff1a;使用--prefix参数 在创建虚拟环境时&#xff0c;使用--pre…

BUSHOUND的抓包使用详解

BUSHOUND是个过滤软件&#xff0c;确切来说是在windows操作系统它的驱动层USB传输的数据。所以这个数据上可能是与USB的总线上的数据是有一点差异的。 先要选择设备的抓包。所以就是在device这个界面底下&#xff0c;我们首先要选择我们要抓的设备。 尝试下键盘设备 电脑键盘…

【可视化大屏】将柱状图引入到html页面中

到这里还是用的死数据&#xff0c;先将柱状图引入html页面测试一下 根据上一步echarts的使用步骤&#xff0c;引入echarts.js后需要初始化一个实例对象&#xff0c;所以新建一个index.js文件来进行创建实例化对象和配置数据信息等。 //在index.html引入<script src"j…

Python爬虫使用实例-mdrama

一个Python爬虫使用实例&#xff1a;主要用于下载指定的剧集音频。分别从网页和json文件中获取剧集的title和剧集中所存在音频的id&#xff0c;调用you-get&#xff0c;最后自动重命名下载文件夹为剧集名title。 目标网址&#xff1a; https://www.missevan.com/mdrama/其中为…

开源AI智能名片小程序源码:私域电商构建独特竞争力的新机遇

摘要&#xff1a;本文旨在探讨私域电商如何利用开源AI智能名片小程序源码构建独特竞争力。在强调独特性是通向成功的必要条件的基础上&#xff0c;分析开源AI智能名片小程序源码在私域电商发展独特性方面的作用及相关策略。 一、引言 在竞争激烈的商业环境中&#xff0c;让自己…

RTX4060安装nvidia显卡驱动

文章目录 nvidia drivers下载删除原有nvidia驱动安装nvidia驱动如果报错Unable to find the kernel source tree for the currently runningbuilding kernel modules解决方法 报错成功安装!!! nvidia drivers下载 https://www.nvidia.cn/geforce/drivers/#:~:textNVIDIA%20GeF…

Python从入门到高手5.1节-Python简单数据类型

目录 5.1.1 理解数据类型 5.1.2 Python中的数据类型 5.1.3 Python简单数据类型 5.1.4 特殊的空类型 5.1.5 Python变量的类型 5.1.6 广州又开始变热 5.1.1 理解数据类型 数据类型是根据数据本身的性质和特征来对数据进行分类&#xff0c;例如奇数与偶数就是一种数据类型。…

去噪扩散模型

Denoising Diffusion Probabilistic Models 图像扩散模型是一种生成模型&#xff0c;它基于概率扩散过程来生成新的图像。 核心步骤包括&#xff1a;&#xff08;1&#xff09;前向扩散过程&#xff1b;&#xff08;2&#xff09;逆向扩散过程 前向扩散过程&#xff08;正向过…

No.4 笔记 | 探索网络安全:揭开Web世界的隐秘防线

在这个数字时代&#xff0c;网络安全无处不在。了解Web安全的基本知识&#xff0c;不仅能保护我们自己&#xff0c;也能帮助我们在技术上更进一步。让我们一起深入探索Web安全的世界&#xff0c;掌握那些必备的安全知识&#xff01; 1. 客户端与WEB应用安全 前端漏洞&#xff1…

Spring Boot框架下的大学生就业招聘平台

5系统详细实现 5.1 用户模块的实现 5.1.1 求职信息管理 大学生就业招聘系统的用户可以管理自己的求职信息&#xff0c;可以对自己的求职信息添加修改删除操作。具体界面的展示如图5.1所示。 图5.1 求职信息管理界面 5.1.2 首页 用户登录可以在首页看到招聘信息展示也一些求职…

STM32中断——外部中断

目录 一、概述 二、外部中断&#xff08;Extern Interrupt简称EXTI&#xff09; 三、实例-对射式红外传感器 1、配置中断&#xff1a; 2 、完整代码 一、概述 中断&#xff1a;在主程序运行过程中&#xff0c;出现了特定的中断触发条件(中断源)&#xff0c;使得CPU暂停当…

【图论】树剖(上):重链剖分

一、前置知识清单 深度优先搜索DFS 点我复习图的存储 复习链接敬请期待树状数组 点我复习 二、树剖简介 树剖&#xff08;树链剖分&#xff09;&#xff0c;是一种把树划分成链的算法&#xff0c;该算法分为重链剖分和长链剖分。 本文仅讨论重链剖分&#xff0c;长链剖分目前…

MySQL联合索引、索引下推Demo

1.联合索引 测试SQL语句如下&#xff1a;表test中共有4个字段(id, a, b, c)&#xff0c;id为主键 drop table test;#建表 create table test(id bigint primary key auto_increment,a int,b int,c int )#表中插入数据 insert into test(a, b, c) values(1,2,3),(2,3,4),(4,5,…

算法修炼之路之滑动窗口

目录 一&#xff1a;滑动窗口的认识及模板 二&#xff1a;LeetcodeOJ练习 1.第一题 2.第二题 3.第三题 4.第四题 5.第五题 6.第六题 7.第七题 一&#xff1a;滑动窗口的认识及模板 这里先通过一道题来引出滑动窗口 LeetCode 209 长度最小的子数组 画图分析&…

aws(学习笔记第一课) AWS CLI,创建ec2 server以及drawio进行aws画图

aws(学习笔记第一课) 使用AWS CLI 学习内容&#xff1a; 使用AWS CLI配置密钥对创建ec2 server使用drawio&#xff08;vscode插件&#xff09;进行AWS的画图 1. 使用AWS CLI 注册AWS账号 AWS是通用的云计算平台&#xff0c;可以提供ec2&#xff0c;vpc&#xff0c;SNS以及clo…

使用 Python 遍历文件夹

要解决这个问题&#xff0c;使用 Python 的标准库可以很好地完成。我们要做的是遍历目录树&#xff0c;找到所有的 text 文件&#xff0c;读取内容&#xff0c;处理空行和空格&#xff0c;并将处理后的内容合并到一个新的文件中。 整体思路&#xff1a; 遍历子目录&#xff1…

2.3MyBatis——插件机制

2.3MyBatis——插件机制 1.基本用法2.原理探究2.1加载过程2.2执行过程2.2.1 插件的执行点2.2.2 SQL执行的几个阶段2.2.3 如何梳理出执行流程 插件机制是一款优秀框架不可或缺的组成部分&#xff0c;比如spring、dubbo&#xff0c;还有我们要聊的Mybatis等等。所谓插件&#xff…

vSAN02:容错、存储策略、文件服务、快照与备份、iSCSI

目录 vSAN容错条带化存储策略1. 创建新策略2. 应用存储策略 vSAN文件服务文件服务快照与备份 vSAN iSCSI目标服务 vSAN容错 FTT&#xff1a;Fault to Tolerance 允许故障数 故障域&#xff1a;每一台vSAN主机是一个故障域 - 假设3台超融合&#xff08;3计算1存储&#xff09;&…

力扣 简单 110.平衡二叉树

文章目录 题目介绍解法 题目介绍 解法 平衡二叉树:任意节点的左子树和右子树的高度之差的绝对值不超过 1 //利用递归方法自顶向下判断以每个节点为根节点的左右子树的最大深度是否大于1 class Solution {public boolean isBalanced(TreeNode root) {if(root null){return tr…