Java - IO高级流¶
高级流是对基本流的封装.
tip: ctrl + alt +v 自动生成表达式左边,自动生成函数实现
缓冲流¶
当然,字符流本身就有buffer,因此效率不明显,但是有一些常见的好方法.
字节缓冲流¶

构造方法:¶
需要关联某个基本流,实际上是对基本流的包装.
示例¶
当然实际上是能控制缓冲区的大小的.不多赘述.
关的时候,(我们可以看看源码),只需要关闭缓冲流,就自动帮我们关闭那些基本流.
我们也可以一次读写多个字节:
- 有什么区别?
因此,这两者是有区别的.
字符缓冲流¶
构造方法:¶

特有方法:¶

示例¶
- readline
循环读取:

- newLine
这样,会在bw中追加一个换行.(会根据平台的不同追加不同的换行)
续写¶
注意,如果想开启续写要在基本流中加:

误区¶
- 能不能说字符缓冲流的缓冲区是8192字节? 答不是.是8192个字符的缓冲区.Java当中一个字符是两个字节,那么实际上是要乘2,一共16字节的buffer
- FileReader有自己的缓冲区,而关联在某个FileReader上的BufferedReader也有自己的缓冲区,两者的缓冲区之间的拷贝是否会影响效率? 答:不会.bufferReader会直接从FileReader的底层去读取数据到自己的缓冲区.
- java当中的char是2字节,但是我们知道utf8当中的汉字是3字节,那么一个char如何能存储一个汉字的?
答:实际上,Java的char/String用的是UTF16.UTF16当中,一个汉字只有两字节,是可以存储在一个char当中的,当我们在与外部交互的时候需要utf8,那么会进行转化:
拓展:utf16中的字符,有可能是2个字节,但也有可能是4个字节.在存储4个字节的情况下,一个字符会被用两个char进行表示.
String str = "中文"; byte[] utf8Bytes = str.getBytes("UTF-8"); // "中"转为3字节,"文"转为3字节 String str = new String(utf8Bytes, "UTF-8"); // 自动将UTF-8解码为UTF-16 - 如果没有close,也没有flush,那么,缓冲区的数据会丢失.因此,数据丢失时应该排查是否close了.
转换流¶

作用:¶
第一种方式在JDK11后被淘汰了
样例:¶

写入¶
替代方案:
JDK11之后,FileReader出现了新的构造函数.

写出¶
替代方案:

综合应用¶

使用字符流方法¶
也就是说,BufferedReader是可以关联InputStreamReader的.
序列化流/对象操作输出输出流¶
可以把数据写入到文件当中,写入的内容是肉眼不可读的.因此避免了被别人修改.
成员方法¶

示例¶
被写的对象的类需要实现Serializable接口.
但是这是一个标记型接口:

细节¶
序列号serialVersionUID¶
如果一个类可序列化,那么java会把根据它的成员等计算出一个序列号,类似于版本号.在写入文件的时候,会顺带把这个类的序列号写入.但是如果这时候修改了这个类的java代码,那么可能会导致版本号发生改变,从而导致反序列化的时候两个序列号不一样.
怎么办?我们手动规定版本号:
要求serialVersionUID这个变量名不能修改.
推荐的写法:
IDEA设置一下:

这时候就会提示:
点击add,就会手动生成一个.这个值是会根据成员等信息计算出来的,因此建议在javabean写完之后再生成.

这样,如果类修改了,那么反序列化后的对象与原来的对象相比,如果新增了字段,那么就会变成初始化值.
transient瞬态关键字¶
这样就可以保证某个字段不会被序列化.在读取时,这个字段会被初始化为默认值.
多次读取¶
如果不知道文件里存了几个对象,怎么办? 如果一直读,那么读到文件结尾时,会抛出异常.但我们写代码一般不会主动制造异常,怎么办?
我们一般会把要序列化的对象存在ArrayList里,从而方便读取:

打印流¶
只有输出流,没有输入流.
注意,只有特有方法才有.
字节打印流¶
构造函数¶
由于字节流底层没有缓冲区,因此后两个方法开不开自动刷新都一样.
成员方法¶

示例¶

字符打印流¶

构造方法¶

成员方法¶

示例¶

打印流和System.out的关系¶
System.out实际上是System类的一个静态成员变量
这是JVM在启动的时候默认创建的.默认指向控制台.
解压缩流/压缩流¶

解压缩流¶
只能为.zip后缀的.
压缩包中的每个文件都对应java中的一个zipENtry对象,解压的本质就是把每一个ZipEntry按照层级拷贝到本地的另一个文件夹当中.
1.如果获取完了,那么就会返回null.
2.子文件夹中的东西也能获取.

压缩流¶
压缩的本质:把每一个文件/文件夹看成zipEntry对象放到压缩包中.
压缩文件:¶

压缩文件夹¶
先说一个细节:如果我们这样写:
那么,压缩包里会创建一个目录aaa,然后里面有一个a.txt.

commons-io¶
java的压缩包就是jar.因此我们使用的时候需要把jar导入.
使用第三方:
导入的时候导入.jar后缀的,不要导入sources.

hutool工具包(常用)(也叫糊涂包)¶

制作假数据 - 爬取数据¶
tip:中文正则生成:
拼接函数就不写了.

制作假数据 - 糊涂包¶
把上面的改成用第三方库:

带权重的随机挑选¶
在负载均衡网关中,经常使用这个方法.
