@**
Java 中对各种流的认识和使用
**
高级java编程,重要的是思想,即是think java,没错,语法绝对不是重点,不是不要记忆,而是需要我们不要纠结。
1、java中的IO流和文件,类比我们现实生活中的水流,I:是InputStream,是输入流,将外界的数据传输到我们的
程序代码中,这就需要一定的通道,在我们的API中存在着四个抽象类,他们的继承子类实现了输入的相关方法。对于
OutputStream来说也是一样的。
四个顶级抽象类分别为InputStream、OutputStream、Reader、Writer。
前者为字节输入输出流的抽象父类,后者为字符输入输出流的抽象父类。
2、就拿InputStream的继承类FileInputStream类来说,有很多的方法来实现通道的功能。
方法有read(),close(),skip(),reset(),mark().
1> int read() 表示读取下一个字节,返回值是字符的位置。
2> int read(byte[] b) 表示每次读取字节的个数,个数就是数组的长度。返回值是每次读取的字符数。
3> int read(byte[] b,off,len ) 三参方法中的off是偏移量,表示从哪个字符位置开始读取,
len表示每次读取数组中的字符个数。返回值还是和2>一样,同样是每次读取的字符数。
4> 对象.close() :关闭资源。
5> reset()重置读取字符的位置。
6> mark() 标记字符位置
7> skip() 跳过n个字节。
3、OutputStream中有的方法有:write(),close(),flush().
1>write() 方法的用法和read一致,只是文件输出流,
2> flush()刷新缓冲池中的数据,强制将缓冲池中剩余字符输出到文件中。
3> close() 关闭通道,释放资源。
4、缓冲
当高速内存读取和输出磁盘中的低速文件时,会出现CPU等待的情况,为解决这个问题,就出现了缓存的概念,
在我们的程序代码中就体现在在类中维护一个数组,数组
的长度就是缓冲区的大小,输入时 先将一部分数据存入缓冲区,再将缓冲区的全部数据输入程序代码中。
默认缓冲区的大小就是8192个字节。
5、包装流:不能自己单独使用,必须结合其他流一块使用。
包装流的作用是用来包装其他节点流,达到增强效果的作用。
这种设计思想在OOAD中称之为装饰者模式
节点流:功能比较基本的流但可以单独使用。很明确的知道数据的来源和去向。
6、缓冲流(字节输入输出)
BufferedInputStream
BufferedOutputStream
7、对象流
ObjectInputStream
ObjectIOutputStream
可以实现一个java对象的持久化存储,传输的对象必须是可序列化的。
序列化:把对象中的信息按照一定的顺序转换成字节信息。
反序列化:将字节信息转换成对象的正常属性。
通过对象流传输的类中必须实现一个接口 serializable(),可序列化的方法。
* 对象的各种属性也必须是可序列化的。
8>、字符缓冲流(包装流)
BufferedReader
BufferedWriter
*输入流只能包装输入流
输出流只能包装输出流
字节流只能包装字节流
字符流只能包装字符流
readLine()方法用于输入一行内容。
newLine()方法用于换行。
9>、流执行完毕之后需要关闭,存在缓冲区的流需要关闭,先开的后关,后开的先关,这句话永远是正确的,
但是在包装流中只需要关闭包装流即可。
10>、InputStreamReader
OutputStreamReader
字节字符转换流