流---马士兵java
流
按数据流的方向:输入流和输出流(站在程序的角度,不要站在数据的角度)
按处理数据单位:字节流和字符流
按功能不同:节点流和处理流
节点流:一个管道直接怼到数据源上
处理流:这个管道包了另一个管道
把流想象成不同的管道,一端接着程序,一端接着数据源,可以怼着数据源往外读数据,也可以把管道怼在上面往里写
一根管道怼在文件上读数据:输入流
反之是输出流
字节流:0101....(1个字节是8位)
字符流:一个字符一个字符往外读(字符是2个字节)
图上浅蓝和深蓝是处理流
ByteArray:字节数组
StringBufferInput:从一个字符串
ObjectInput:读出一个对象
butter表示的是缓冲区,相当于一个水桶,暂时储存水,存到一定量再处理,int表示的是返回int类型个字节数
byte[]表示的是字节数组,int offset表示从数组的某个位置开始存,int length表示存多少个
OutputStream是往外读
要先写flush再写close,是为了把数据全部读进去,防止数据还没有读进去(还有半桶水),结果就把管道关闭了
reader是2个字节2个字节往外读
(上面写错了,是输出数据)也是输出2个字节,16位
节点流是管道直接怼在数据源上
例子
1个字节1个字节往外读,而中文是2个字节,所以会出现???改成Reader就可以了
例子2
InputStream是往外读数据,outputStream往里写数据
字符型的输入输出
因为是一个字符一个字符往外读,所以不会出现中文出现一半(也就是???)
处理流
处理流是包在别的流上面的流,相当于包在别的管道上的管道
也就是带缓冲区的,也就是带水桶的,可以减少对IO的读写次数,保护硬盘
例子
如果要转换为字符,就强制转换为char类型
1310是回车换行,转换为char后,正好打印回车出来
new FileWriter相当于管道,管道不好用,在外面再套一个bw,然后再往里写数据
读的时候,下面的那个管道不好读,只能一个字符一个字符往外读,不好用,所以使用另外一个管道br
文件内容是读到String s的s里面去了,不是读出到显示窗口了,是读到变量的内存区域里去了 ,这就叫做是读到程序里面去了,显示在上面那个黑色窗口的内容不是叫做读进来的内容
输入是指输入到为你内存分配的一个区域里去了
转换流可以把字节流转换为字符流
InputStreamReader:InputStream是字节流,Reader是字符流。这个的意思就是把InputStream转换为Reader
OutputStreamWriter:就是把OutputStream转换为Writer,转换之后,原本是一个字节一个字节往里写,现在不用了,现在可以一个字符一个字符往里写,而且可以写到字符串里面。如果用的FileoutputStream只能一个字节一个字节往里写,没关系,在外面套一层字符的转换流,就可以顺着管道换一个字符串一个字符串往外写,这个接口(管道)用起来就简单多了
getEncoding是指拿到它的字符编码
上图出现的那个true是指追加,也就是在原来的基础文件之上添加,从原来的文件尾巴往里添,如果不写true的话,会把原来的文件给擦掉,然后重新往里写,
true后面那个是字符编码,按照这个字符编码,把下面的内容写进去
GBK打印的是osw.getEncoding那行的,为什么打印这个呢?因为系统当前默认的编码是GBK,所以没有指定编码的情况下,都使用当前系统的默认编码
指定编码之后,拿出来肯定是指定编码ISO8859_1
看看下面的东西写没写进去
写进去了
如果把FileOutputStream方法的true去掉了:
只有下面的内容了,因为前面写的东西被擦掉了
这是在往里写
in是那个最小的管道,它已经怼到我们键盘输入的窗口,准备开始往外面读内容了
转换为Reader之后,按照字符来读,如果按照字节来读的话,如果读汉字,会只读一半出来,会出现???
br可以一次读一行readLine
这个黑窗口一直在等待我们的输入,这个方法叫做阻塞式的方法
这个方法readLine比较特殊,但是实际上又不是它的问题,是System.in比较特殊,因为它是等待着标准输入,
没有输入就得一直等着,这个也叫作同步方法(也就是你不输入我就不能干别的,也就会停在br.readLine那里,下面的内容执行不了)
一根管道怼在字节数组上,准备往里写数据,这个管道不好使,在外面再套一个管道
Math.random()是写随机数
最右边那个方框是ByteArray
不会抛异常,Printline打印会抛异常
还要自动的flush功能,会把水桶的水清空
if那行的意思是每打印100个数,换一行
不是打到黑窗口那里了,setOut
是打印到文件里了
agrs是命令行参数
System.out是PrintStream 类型,所以可以传进去
这个程序的功能是把一个程序挨着盘读出来
只要传入文件名,文件名传到String参数那里,然后开始读内容,每读一行,打印到fs上,fs传的是System.out
日志
Buffer那句的意思是把一个管道怼到标准输入上面,也就是怼到键盘上了
br.readLine()这是阻塞式方法,因为是从system.in(从标准输入读的)
log自带flush功能,但是写了更保险
Date是util里的
Object流(不太懂)
int,int,int,doule(4个字节4个字节4个字节8个字节)
看看写的内容和读的内容是否一致
在k上加上transient(透明),则k的值变为0
transient修饰的成员变量在序列化的时候,不给予考虑,也就是默认值,即0
总结