流---马士兵java

流---马士兵java

流---马士兵java

流---马士兵java

按数据流的方向:输入流和输出流(站在程序的角度,不要站在数据的角度)

按处理数据单位:字节流和字符流

按功能不同:节点流和处理流

节点流:一个管道直接怼到数据源上

处理流:这个管道包了另一个管道

把流想象成不同的管道,一端接着程序,一端接着数据源,可以怼着数据源往外读数据,也可以把管道怼在上面往里写


一根管道怼在文件上读数据:输入流

反之是输出流


字节流:0101....(1个字节是8位)

字符流:一个字符一个字符往外读(字符是2个字节)


流---马士兵java

图上浅蓝和深蓝是处理流


流---马士兵java

ByteArray:字节数组

StringBufferInput:从一个字符串

ObjectInput:读出一个对象


流---马士兵java

butter表示的是缓冲区,相当于一个水桶,暂时储存水,存到一定量再处理,int表示的是返回int类型个字节数

byte[]表示的是字节数组,int offset表示从数组的某个位置开始存,int length表示存多少个


流---马士兵java

OutputStream是往外读

流---马士兵java

流---马士兵java

要先写flush再写close,是为了把数据全部读进去,防止数据还没有读进去(还有半桶水),结果就把管道关闭了


流---马士兵java

reader是2个字节2个字节往外读

流---马士兵java

流---马士兵java

(上面写错了,是输出数据)也是输出2个字节,16位

流---马士兵java



流---马士兵java

节点流是管道直接怼在数据源上


例子

流---马士兵java

流---马士兵java

1个字节1个字节往外读,而中文是2个字节,所以会出现???改成Reader就可以了


例子2

流---马士兵java

InputStream是往外读数据,outputStream往里写数据

流---马士兵java



字符型的输入输出

流---马士兵java

流---马士兵java

因为是一个字符一个字符往外读,所以不会出现中文出现一半(也就是???)


流---马士兵java

流---马士兵java



处理流

流---马士兵java

处理流是包在别的流上面的流,相当于包在别的管道上的管道

流---马士兵java

也就是带缓冲区的,也就是带水桶的,可以减少对IO的读写次数,保护硬盘

例子

流---马士兵java

流---马士兵java

如果要转换为字符,就强制转换为char类型

流---马士兵java

流---马士兵java

1310是回车换行,转换为char后,正好打印回车出来


流---马士兵java

new FileWriter相当于管道,管道不好用,在外面再套一个bw,然后再往里写数据

读的时候,下面的那个管道不好读,只能一个字符一个字符往外读,不好用,所以使用另外一个管道br



流---马士兵java

文件内容是读到String s的s里面去了,不是读出到显示窗口了,是读到变量的内存区域里去了 ,这就叫做是读到程序里面去了,显示在上面那个黑色窗口的内容不是叫做读进来的内容

输入是指输入到为你内存分配的一个区域里去了


流---马士兵java

转换流可以把字节流转换为字符流

InputStreamReader:InputStream是字节流,Reader是字符流。这个的意思就是把InputStream转换为Reader

OutputStreamWriter:就是把OutputStream转换为Writer,转换之后,原本是一个字节一个字节往里写,现在不用了,现在可以一个字符一个字符往里写,而且可以写到字符串里面。如果用的FileoutputStream只能一个字节一个字节往里写,没关系,在外面套一层字符的转换流,就可以顺着管道换一个字符串一个字符串往外写,这个接口(管道)用起来就简单多了

流---马士兵java

getEncoding是指拿到它的字符编码

上图出现的那个true是指追加,也就是在原来的基础文件之上添加,从原来的文件尾巴往里添,如果不写true的话,会把原来的文件给擦掉,然后重新往里写,

true后面那个是字符编码,按照这个字符编码,把下面的内容写进去

流---马士兵java

GBK打印的是osw.getEncoding那行的,为什么打印这个呢?因为系统当前默认的编码是GBK,所以没有指定编码的情况下,都使用当前系统的默认编码

指定编码之后,拿出来肯定是指定编码ISO8859_1


看看下面的东西写没写进去

流---马士兵java

写进去了

如果把FileOutputStream方法的true去掉了:

流---马士兵java

只有下面的内容了,因为前面写的东西被擦掉了

流---马士兵java

这是在往里写


流---马士兵java

in是那个最小的管道,它已经怼到我们键盘输入的窗口,准备开始往外面读内容了

转换为Reader之后,按照字符来读,如果按照字节来读的话,如果读汉字,会只读一半出来,会出现???

br可以一次读一行readLine


流---马士兵java

这个黑窗口一直在等待我们的输入,这个方法叫做阻塞式的方法

这个方法readLine比较特殊,但是实际上又不是它的问题,是System.in比较特殊,因为它是等待着标准输入,

没有输入就得一直等着,这个也叫作同步方法(也就是你不输入我就不能干别的,也就会停在br.readLine那里,下面的内容执行不了)




流---马士兵java

流---马士兵java

一根管道怼在字节数组上,准备往里写数据,这个管道不好使,在外面再套一个管道 

Math.random()是写随机数

流---马士兵java

流---马士兵java

最右边那个方框是ByteArray



流---马士兵java不会抛异常,Printline打印会抛异常

还要自动的flush功能,会把水桶的水清空

流---马士兵java

流---马士兵java

if那行的意思是每打印100个数,换一行

流---马士兵java

不是打到黑窗口那里了,setOut

是打印到文件里了

流---马士兵java



流---马士兵java

agrs是命令行参数

System.out是PrintStream 类型,所以可以传进去

这个程序的功能是把一个程序挨着盘读出来

只要传入文件名,文件名传到String参数那里,然后开始读内容,每读一行,打印到fs上,fs传的是System.out

流---马士兵java


日志

流---马士兵java

Buffer那句的意思是把一个管道怼到标准输入上面,也就是怼到键盘上了

br.readLine()这是阻塞式方法,因为是从system.in(从标准输入读的)

log自带flush功能,但是写了更保险

Date是util里的

流---马士兵java

流---马士兵java




Object流(不太懂)

流---马士兵java


流---马士兵java

int,int,int,doule(4个字节4个字节4个字节8个字节)

流---马士兵java

流---马士兵java

看看写的内容和读的内容是否一致

在k上加上transient(透明),则k的值变为0

transient修饰的成员变量在序列化的时候,不给予考虑,也就是默认值,即0

流---马士兵java





总结

流---马士兵java