Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据

1.File(操作文件本身)

1.定义

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第1张图片

目录

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第2张图片

2.常用方法

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第3张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第4张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第5张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第6张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第7张图片


3.路径引用符

可以用/或者\\分隔路径

image-20231206181001993

还可以用File.separator分隔路径,会根据不同系统使用啥分隔符。

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第8张图片


4.绝对路径、相对路径及桌面路径表示

桌面路径为:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第9张图片

我电脑的用户名为X

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第10张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第11张图片

5.示例代码(遍历文件夹)

1.创建文件对象

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第12张图片

示例:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第13张图片

image-20231206181503808

f1.length():以字节为单位,仅仅是获取该文件夹/文件的大小,如果是文件夹 不是获取文件夹的大小及文件夹里面文件夹的大小之和。

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第14张图片

2.常用方法1:判断文件类型(文件、文件夹),获取文件信息等

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第15张图片

示例:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第16张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第17张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第18张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第19张图片

如果该文件对象是绝对路径的话,则getAbsolutePath就是绝对路径,若是相对路径则会补全为绝对路径(路径都是带后缀的)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第20张图片

3.常用方法2:创建和删除文件、文件夹

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第21张图片

示例:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第22张图片

4.常用方法3:遍历文件夹

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第23张图片

示例:

list()列表的名称及包括文件夹名称也包括文件名称(如图中的授课新得.txt)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第24张图片

listFiles()方法能获取当前文件对象路径的一级文件对象,注意是一级文件对象

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第25张图片

listFiles()使用注意事项

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第26张图片

示例:

1.当主调是文件,返回null

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第27张图片

无需ab.txt存不存在,只要是获取文件的一级目录对象都返回null。

路径不存在的一级目录文件对象返回null

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第28张图片

2.当主调是空文件夹是,返回一个长度为0的数组,数组内容为[]。图中aaa是空文件夹

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第29张图片

3.当主调是一个有内容的文件夹时,将里面所有的一级文件及文件夹的路径放在File数组中返回(即正常情况)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第30张图片

4.这里只演示第一点

image-20231206190054808

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第31张图片

test是桌面上的一个文件夹。现在现在这个文件夹和文件进行隐藏。

可以看到隐藏结果获取到了

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第32张图片

6.重命名文件、文件夹(renameTo(文件对象)

案例:改变某个文件夹下的视频序号,要求从19开始

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第33张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第34张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第35张图片

直接输出文件对象,会直接输出该文件对象对应的路径

7.文件搜索(递归实现)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第36张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第37张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第38张图片

再找到像要的文件(对象)后如果要打开或执行,可以用以下代码实现

 Runtime runtime = Runtime.getRuntime();
 runtime.exec(文件对象.getAbsolutePath());

8.删除非空文件夹(删除文件和删除空文件用相应的方法,可以直接调用)

此密码文件夹假如非空,也就是里面有文件或文件夹

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第39张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第40张图片

2.IO流(操作文件的数据)

注意:流使用完之后必须用.close()方法关闭

1.概述

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第41张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第42张图片

2.分类

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第43张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第44张图片

3.文件流体系结构(基础原始流)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第45张图片

1.FileInputStream(字节输入流)

常用于拷贝文件,文件传输等操作。

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第46张图片

1.每次读一个字节(性能差)

1.单个读取文件内容(每次读一个字节,性能能差,而且因为每次读一个字节读汉字会乱码)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第47张图片

2.循环读取文件内容(每次读一个字节,性能能差,而且因为每次读一个字节读汉字会乱码

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第48张图片

下面进行改善

2.每次读多个字节(推荐)

自定义字节数组byte [] buffer = new byte[每次读取的字节大小]

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第49张图片

bug

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第50张图片

最终优化后的代码:

性能得到了明显提升,但是还是不能避免读取汉字时会乱码,如下图每次截取3个字节,可能会把汉字中的字节截断

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第51张图片

常用于拷贝文件,文件传输等操作。

3.一次读取完全部字节(可以解决读取的内容中文乱码问题)——不适合一次性读取大文件

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第52张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第53张图片

方式1

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第54张图片

用完记得用close()方法关闭流

方式2(代码简洁,若读取的文件太大,会抛异常)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第55张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第56张图片

总结

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第57张图片

2.FileOutputStream(字节输出流)

image-20231207132138643

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第58张图片

close()方法关闭流。

示例代码:

1.写单个字节

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第59张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第60张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第61张图片

2.写多个字节(要写回车直接写"\r\n".getBytes())

image-20231207132641461

按需写多个字节

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第62张图片

上面的文件写操作都是重新覆盖,要追加文件写的内容,需在下一个参数中填true

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第63张图片

要写换行符直接用"\r\n"

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第64张图片

文件拷贝案例(字节输入流和字节输出流实现)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第65张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第66张图片

实现代码

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第67张图片

释放资源

1.try-catch-finally(代码比较复杂,但也可以使用)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第68张图片

2.try-witch-resource(代码简洁)

try-catch执行完成后,会自动执行资源的close()方法

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第69张图片

图1-1

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第70张图片

格式:

try(

资源

)

资源就是该类实现AutoCloseable接口或者它的父类实现了AutoCloseable也算该子类实现了哦,在代码执行后会自动执行重写的close()方法,如上图1-1。

3.FileReader(字符输入流)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第71张图片

示例代码:

1.每次读单个字符(性能差)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第72张图片

2.每次读多个字符(推荐)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第73张图片

4.FileWtiter(字符输出流)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第74张图片

new FileWriter(File/String, true)中的true表示追加文件内容,默认不填写的话是覆盖文件内容操作。

.write("\r\n");表示写入换行。

示例代码

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第75张图片

注意事项

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第76张图片

注意:字符流写内容的时候,会先把内容存入内存的一块区域暂时保存,当你调用flush或close方法时,才会真正写入到文件中去。若该内容区域满了,还没刷新或关闭的话,会先把这块区域的内容先写入到文件中去,以便存其他写入内容。

所以它的效率比字节输出流的效率高,因为字节输出流每次写文件内容会调用系统资源往文件里面写内容,而字符输出流可以自己控制写入次数

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第77张图片

flush()方法刷新流,使得写入数据生效。刷新后还可以使用该流,也可以多次刷新

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第78张图片

close()关闭流,使得写入数据生效。关闭流后,不能在使得该流,否则报错“Stream closed ”

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第79张图片

4.缓冲流(提高读写数据的性能)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第80张图片

对原始流进行加工

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第81张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第82张图片

1.字节缓冲输入、输出流(BufferedInputStream、BufferedOutputStream)

代码不变,多了二行包装代码

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第83张图片

可定义缓冲池大小,默认8KB

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第84张图片

2.字符缓冲输入、输出流(BufferedReader、BufferedWriter)

1.字符缓冲输入流(BufferedReader)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第85张图片

注意:readLine()是该BufferedReader的独有方法,若用多态写法的话,就不能调用该独有功能了。

示例代码:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第86张图片

独有的readLine()方法,不能用多态写法

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第87张图片

readLine()读到结尾会返回null,所以可以配合循环来实现读内容

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第88张图片

2.字符缓冲输出流(BufferedWriter)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第89张图片

newLine()是该类的独有方法用于写入换行,要调用该方法不能用多态写法,只能该类变量接收。

5.字符转换流(解决不同编码读取时乱码问题)

注意:该字符转换流是针对原始字节流,因为只有字节流才会出现乱码问题,而不针对字符流(字符流不存在乱码问题)。

该字符转换流可以理解为原始字节输入、输出流的字符流。该流还是低级流,可以用缓存流进行包装

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第90张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第91张图片

1.字符输入转换流

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第92张图片

示例代码:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第93张图片

2.字符输出转换流

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第94张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第95张图片

示例代码:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第96张图片

6.打印流(往文件里写啥内容就是啥内容,不进行任何转换)——底层自动包装缓存流,高效

如write(97)表示写的是a,而使用打印流write(97)表示可以写的就是这个原始内容97,不进行任何转换。

print(内容)方法表示写入的内容不默认添加换行。而且是该类的独有方法,必须子类变量接收赋值才能使用,多态写法则不能使用该独有方法。

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第97张图片

1.PrintStream(字节打印流)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第98张图片

print(内容)方法表示写入的内容不默认添加换行。而且是该类的独有方法,必须子类变量接收赋值才能使用,多态写法则不能使用该独有方法。


示例代码:

  1. 97不进行转换成a,就是原始内容97

    Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第99张图片

打印后的文件内容为

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第100张图片

2.指定写入内容的编码

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第101张图片

3.write()会对数字转为ACII码

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第102张图片

底层包装了缓存流性能高效。

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第103张图片


2.PrintWriter(字符打印流)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第104张图片

print(内容)方法表示写入的内容不默认添加换行。而且是该类的独有方法,必须子类变量接收赋值才能使用,多态写法则不能使用该独有方法。

示例代码:

用法和PrintStream一样

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第105张图片

3.追加文件内容的写法

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第106张图片

正确方式:

格式为new PrintWriter(文件对象)或PrintStream(文件对象) ,文件对象内部必须设置追加模式,如new FileOutputStream("C:\\a.txt", true)

错误方法:

new PrintWriter(文件对象或字符串路径, true)为错误写法。

4.输出重定向

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第107张图片

示例代码:重定向输出到文件

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第108张图片

日志文件就是输出重定向到日志文件中记录

7.数据流(常用于数据通信,比较方便)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第109张图片

1.DataOutputStream(数据字节输出流)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第110张图片

要使用独有方法,就不要用多态写法了。

示例代码:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第111张图片

该文件内容还包含了数据类型,以一种特殊形式存储的,不是用来看的

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第112张图片

2.DataInputputStream(数据字节输入流)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第113张图片

示例代码:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第114张图片

8.序列化流(及transient关键字)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第115张图片

序列化与反序列化

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第116张图片

1.ObjectOutputStrean(序列化流)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第117张图片

类要使用序列化,必须实现Serializable接口。

示例代码:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第118张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第119张图片

文件内容

image-20231207163525907

2.ObjectInputStrean(反序列化流)

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第120张图片

示例代码:

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第121张图片

3.transient关键字

示例理解

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第122张图片

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第123张图片

3.IO框架

1.定义及方法

image-20231207171222994

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第124张图片

2.使用步骤

1.去官方Commons-io官网下载压缩包

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第125张图片

2.解压后复制该jar包到项目中去

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第126张图片

3.在项目中新建文件夹lib,并右击Add as Library

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第127张图片

4.将该jar包复制到该lib文件夹下就能使用了

3.示例代码

Java文件流大家族(通俗易懂,学习推荐版,很详细)——操作文件本身和文件中的数据_第128张图片

你可能感兴趣的:(Java学习从0到1,java,学习,文件流,笔记)