前置知识:字符集
常见字符集
- ASCII字符集:只有英文、数字、符号等,占1个字节
- GBK字符集:汉字占2个字节,英文、数字占1个字节
- UTF-8字符集:汉字占3个字节,英文、数字占1个字节
Unicode字符集(统一码,也叫万国码)
Unicode是国际组织制定的,可以容纳世界上所有文字、符号的字符集。
UTF-32:四个字节存储 不被采纳,太占内存,通信效率低。
UTF-8:
注意1:字符编码时使用的字符集,和解码时使用的字符集必须一致,否则会出现乱码。
注意2:英文,数字一般不会乱码,因为很多字符集都兼容了ASCII编码。
字符集的编码、解码操作
编码:把字符按照指定字符集编码成字节。
解码:把字节按照指定字符集解码成字符。
IO流
概述
I指Input,称为输入流:负责把数据读到内存中去
0指Output,称为输出流:负责写数据出去
IO流的应用场景
怎么学IO流
1、先搞清楚I0流的分类、体系
2、再挨个学习每个I0流的作用、用法。
IO流的分类
总结流的四大类:
字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式读入到内存中去的流
字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流
字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式读入到内存中去的流。
字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络介质中去的流,
抽象类不能创建对象,不能直接使用他们,需要找他们的实现类来使用。
IO流 - 字节流
Filelnputstream(文件字节输入流):就是从文件中读取字节到内存中去。
文件字节输入流:每次读取一个字节
读取文件的字节数据的时候,犹豫文件是在内存里面的,因此是需要去硬盘里面找文件的数据读取的,但是程序是在内存中执行的,是不能够直接找硬盘中的文件的,每次读取文件的字节时,程序实际上是通过调用系统相关的硬件资源去读取硬盘里的文件数据的;而程序调用系统的硬件资源的开销以及去硬盘中找数据的性能相对内存来说是很慢的,因此在开发中有这样一个规矩:尽量减少程序调用系统的硬件资源读取这个数据的频次。
注意事项:
使用Filelnputstream每次读取一个字节,读取性能较差,并且读取汉字输出会乱码。
文件字节输入流:每次读取多个字节
buffer可以当作一个桶,性能得到了明显的提升,但是这种方案也不能避免读取汉字输出乱码的问题。但是这种方案适合做文件拷贝操作(会结合文件字节输出流来实现)。
文件字节输入流:一次读取完全部字节
1、使用字节流读取中文,如何保证输出不乱码,怎么解决?
定义一个与文件一样大的字节数组,一次性读取完文件的全部字节。
直接把文件数据全部读取到一个字节数组可以避免乱码,是否存在问题?
- 如果文件过大,创建的字节数组也会过大,可能引起内存溢出
读写文本内容更适合用字符流
字节流适合做数据的转移,如:文件复制等
文件字节输出流:写字节出去
FileOutputStream(文件字节输出流):写字节数据到文件里去。
案例:文件复制
释放资源的方式
try-catch-finally
- finally代码区的特点:无论try中的程序是正常执行了,还是出现了异常,最后都一定会执行finally区,除非JVM终止。
- 作用:一般用于在程序执行完成后进行资源的释放操作(专业级做法)。
try-with-resource
因为finally这种方法比较臃肿