流---马士兵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






总结


  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值