系统温习------黑马程序员Java+AI智能辅助编程全套视频教程
存储&读写数据的方案
变量、数组、对象、集合这些数据容器都在内存 中,一旦程序结束,或者断电,数据就没有了。
文件可以长久保存数据 ,它在电脑磁盘中保存,即便断电,或者程序终止,文件中的数据也不会丢失。
File类只能对文件本身进行操作 ,不能读写文件里面存储的数据 。使用IO流读写数据.
File
File类的对象可以代表文件/文件夹,并可以调用其提供的方法对象文件进行操作。
创建File类对象

只要带盘符的都称之为绝对路径 E:/resource/aaa.txt
相对路径:不带盘符,默认是到idea工程下直接寻找文件的 ,一般用来找工程下的项目文件的。

delete方法默认只能删除文件和空文件夹,删除后的文件不会进入回收站。


方法递归
递归如果没有控制好终止 ,会出现递归死循环 ,导致栈内存溢出错误。
递归算法三要素:递归公式、递归终点、递归的方向走向终点。

每天在做同一件事,典型的规律化问题,考虑递归三要素。

文件搜索

①找出D:盘下的所有一级文件对象(listFiles( ))
②遍历全部一级文件对象,判断是否是文件
③如果是文件,判断是否是自己想要的
④如果是文件夹,需要继续进入到该文件夹,重复上述过程

字符集
标准ASCII字符集包括了英文、符号等。使用1个字节存储一个字符 ,首位是0 ;GBK汉字编码字符集,GBK中一个中文字符编码成两个字节的形式存储 ,规定汉字的第一个字节的第一位必须是1。 GBK兼容ASCII,英文数字仍占1个字节。
Unicode字符集(万国码),Unicode是国际组织制定 的,可以容纳世界上所有文字、符号的字符集。
UTF-32 4个字节表示一个字符。占存储空间大,通信效率低。
UTF-8是Unicode字符集的一种编码方案,采取可变长编码方案,共分四个长度区:1个字节,2个字节,3个字节,4个字节。英文字符、数字等只占1个字节,汉字字符占用3个字节。

技术人员在开发时都应该使用UTF-8编码!
字符编码时使用的字符集,和解码时使用的字符集必须一致 ,否则会出现乱码。
英文和数字不会乱码。
使用程序对字符进行编码和解码操作
对字符的编码:
对字符的解码:


IO流
I指input,称为输入流:负责把数据读到内存中去 ;O值Output,称为输出流:负责写数据出去。

IO流的体系:
字节输入流 InputStream
字节输出流 OutputStream
字符输入流 Reader
字符输出流 Writer
FileInputStream(文件字节输入流)
作用:以内存为基准,可以把磁盘文件中的数据以字节的形式读入到内存中去。



使用FileInputStream每次读取一个字节,读取性能较差,并且读取汉字输出会乱码 。使用FileInputStream每次读取多个字节,读取性能得到了提升,但读取汉字输出还是会乱码。
使用字节流读取中文保证输出不乱码需要定义一个与文件一样大的字节数组,一次性读取完文件的全部字节 。但是如果文件过大,创建的字节数组也会过大,可能引起内存溢出。
一次读取完全部字节(适用于读小文件)

结论:读取文本 适合用字符流 ;字节流 适合做数据的转移 ,比如:文件复制。
文件字节输入流读取文件数据的步骤:①创建一个文件字节输入流管道与源文件接通;②调read( )方法每次读一个字节或read(buffer)来读取数据。
FileOutputStream文件字节输出流
以内存为基准,把内存中的数据以字节的形式写出到文件中去。



文件复制
任何文件的底层都是字节 ,字节流做复制 是一字不漏的转移完全部字节 ,只要复制后的文件格式一致就没问题。

步骤:
①准备源文件和目标文件(复制过去需要带文件名,无法自动生成文件名)。创建一个文件字节输入流管道与源文件接通,创建一个文件字节输出流管道与目标文件接通。
②准备一个字节数组和一个整型变量记录每次读入的长度,通过循环先将源文件的数据装入桶中(字节数组),再通过文件字节输出流管道接收桶中的数据并将其写入到目标文件中。(读多少,就写入多少!!!)
资源释放
try-catch-finally
finally代码区的特点:无论try中的程序是正常执行还是出现异常,最后都一定会执行finally区,除非JVM终止。
作用:一般用于在程序执行完成后进行资源的释放操作。

以上方案不美观,臃肿。JDK 7开始提供了更简单的资源释放方案:try-with-resource


该资源使用完毕后,会自动调用其close( )方法,完成对资源的释放!
( )中只能放置资源 ,否则报错。资源 一般指的是最终实现了AutoCloseable接口。
FileReader文件字符输入流,以内存为基准,可以把文件中的数据以字符的形式读入到内存中去。
FileReader(文件字符输入流)
用于读取文本文件中的字符。
创建FileReader文件输入流管道 ,调用其read方法读取字符。



FileWriter(文件字符输出流)
以内存为基准,把内存中的数据以字符的形式写出到文件中去。


字符输出流写出数据后,必须刷新流,或者关闭流,写出去的数据才能生效。

BufferedInputStream(缓冲字节输入流)和BufferedOutputStream(缓冲字节输出流)
作用:提高字节输入流读取数据的性能。

原理 :缓冲字节输入流 自带了8KB缓冲池 ;缓冲字节输出流 也自带了8KB缓冲池。

BufferedReader(缓冲字符输入流)

新增功能:按照行读取字符

按照行读取数据:(目前读取文本最优雅的方案)

BufferedWriter(缓冲字符输出流)

新增功能:换行

缓冲流案例
++需求:把出师表的文章顺序进行恢复到一个新文件中。++
①定义一个缓存字符输入流管道与源文件接通。
②定义一个List集合存储读取的每行数据。
③定义一个循环按照行读取数据 ,存入到List集合中去。
④对List集合中的每行数据按照首字符编号升序排序。
⑤定义一个缓存字符输出管道与目标文件接通。
⑥遍历List集合中的每个元素 ,用缓冲输出管道写出并换行。
性能分析
测试用例:分别使用原始的字节流,以及字节缓冲流复制一个很大视频。
测试步骤:
①使用低级的字节流 按照一个一个字节的形式复制文件。
②使用低级的字节流 按照字节数组的形式复制文件。
③使用高级的缓冲字节流 按照一个一个字节的形式复制文件。
④使用高级的缓冲字节流 按照字节数组的形式复制文件。
建议使用字节缓冲输入流、字节缓冲输出流 ,结合字节数组的方式。目前性能最优。
其他流
InputStreamReader(字符输入转换流)
解决不同编码时,字符流读取文本内容乱码的问题。
解决思路:先获取文件的原始字节流 ,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了。


PrintStream/PrintWriter(打印流)
PrintStream继承自字节输出流OutputStream,支持写字节。
PrintWrite继承自字符输出流Writer,支持写字符。
作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。


如果要实现追加,则需要将一个可以追加的低级字节输出流作为参数构造一个打印流则可以实现追加。

特殊数据流
DataOutputStream(数据输出流)
允许把数据和其类型一并写出去。


DataInputStream(数据输入流)
用于读取数据输出流写出去的数据。


收和发要一一对应
IO框架
框架是一个预先写好的代码库或一组工具,旨在简化和加速开发过程。
IO框架封装了Java提供的对文件、数据进行操作的代码 ,对外提供了更简单的方式来对文件进行操作,对数据进行读写等。

