IO流学习总结

1.流的概念


流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。


2.IO流的分类


按操作数据单位不同分为:字节流(8 bit),字符流(16 bit)  
按数据流的流向不同分为:输入流,输出流
按流的角色的不同分为:节点流,处理流(缓冲流,转换流,标准输入输出流,打印流,数据流,对象流)




 2.1字符流和字节流. 
  字符流分为Reader(输入流)和Writer(输出流)两种,其中Reader又可细分为InputStreamReader(转换流:字节流通向字符流的桥梁)和BufferedReader(缓冲流:特有方法readLine()),其中Writer又可细分为BufferedWriter(缓冲流:特有方法:newLine(),write(String str))和OutputStreamWriter(转换流:字符流通向字节流的桥梁)。
  字节流分为InputStream(输入流)和OutputStream(输出流)两种,其中InputStream又可细分为FileInputStream(从文件系统中的某个文件中获得输入字节用于读取诸如图像数据之类的原始字节流)和BufferedInputStream(缓冲流:是InputStream的间接子类),其中OutputStream(输出流)又可细分为BufferedOutputStream(缓冲流:是OutputStream的间接子类)和FileOutputStream(用于写入诸如图像数据之类的原始字节的流)。
 2.2字节流和字符流的区别与使用


  1.字节流读取的时候,读到一个字节就返回一个字节; 字符流基于字节流读取到一个或多个字节(中文对应的字节数是两个,在UTF-8码表中是3个字节)时,先去查指定的编码表,将查到的字符返回。 
  2.字节流可以处理所有类型数据,如:图片,MP3,AVI视频文件,而字符流只能处理字符数据。只要是处理纯文本数据,就要优先考虑使用字符流,除此之外都用字节流。
  3.对输入流只能进行读操作,对输出流只能进行写操作,程序中需要根据待传输数据的不同特性而使用不同的流。 
3.转换流


流向图:
  文本文件--(字节流)-->InputStreamReader--(字符流)-->程序;
  程序--(字符流)-->OutputStreamWriter--(字节流)-->文件;
     解码:字节数组字符串
     编码:字符串字节数组
InputStreamReader 是字节流通向字符流的桥梁 
OutputStreamWriter 是字符流通向字节流的桥梁 
转换流可以将字节转成字符,原因在于,将获取到的字节通过查编码表获取到指定对应字符。 
转换流的最强功能就是基于 字节流 + 编码表 。没有转换,没有字符流


4.标准输入输出流


System.in和System.out分别代表了系统标准的输入和输出设备
默认输入设备是键盘,输出设备是显示器
System.in的类型是InputStream
System.out的类型是PrintStream,其是OutputStream的子类FilterOutputStream 的子类
通过System类的setIn,setOut方法对默认设备进行改变。
  public static void setIn(InputStream in)
  public static void setOut(PrintStream out)




5.打印流


PrintWriter 
PrintStream 
注: 
A:只操作目的地,不操作数据源 
B:可以操作任意类型的数据 
C:如果启用了自动刷新,在调用println(),printf(),format()方法的时候,能够换行并刷新 
D:可以直接操作文件


6.序列化流


ObjectInputStream和OjbectOutputSteam用于存储和读取对象的处理流。它的强大之处就是可以把Java中的对象写入到数据源中,也能把对象从数据源中还原回来。




序列化(Serialize):用ObjectOutputStream类将一个Java对象写入IO流中(把对象作为一个整体按照流一样的方式传输或者存储);
反序列化(Deserialize):用ObjectInputStream类从IO流中恢复该Java对象(把网络中的流数据或者文件中的流数据还原成对象);
ObjectOutputStream和ObjectInputStream不能序列化static和transient修饰的成员变量。
 
主要方法有:
1.Object readObject();该方法抛出异常:ClassNotFountException。 
2. void writeObject(Object):被写入的对象必须实现一个接口:Serializable,否则就会抛出:NotSerializableException 
3.如果实现了该接口,想解决黄线问题就生成一个随机的serialVersionUID号码
7.节点流和处理流作用


节点流是从一个特定的数据源读取数据,包括FileInputStream,FileOutputStream,FlieReader,FileWriter。
处理流之一:缓冲流。缓冲流是“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法,通过对数据的处理为程序提供更强大的读写功能,包括BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter。对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush()将会使内存中的数据立刻写出。

猜你喜欢

转载自blog.csdn.net/jackFXX/article/details/78394209