IO流

流:好比两根管道,一根向里,一根向外,向里向外是相对于我们的程序来说的。流是成对的

流的分类:

根据方向不同:输入流与输出流;

读取数据单位不同:字节流与字符流

 

字节流:

InputStream(抽象类),用于字节流的输入

常用子类:FileInputStream:

1、如果要读取文件,一般要循环判断,例如:

while((data=fis.read(bytes))!=-1)  ,判断文件中是否还有可读的字节。读取方法read。如果读取单个字节中文将显示乱码,中文为2个字节。

2、读取文件不能追加,当文件读完后,当再次读取时,读取的是空白字符。

3、缓冲流:BufferedInputStream(用的少,因为它读的是字节,所以有无没什么区别)                  读取字节的三种方式:

OutputStream(抽象类),用于字节流的输出

常用子类:FileOutputStream:

注意:1、调用输出方法:write,读取字节的方式实现复制文件,看实例源码:CopyTest.java

2、BufferedOutputStream(与上同)

流打开了记得关闭。

 

字符流:

Reader(抽象类),用于字符流的输入

常用子类:FileReader 

BufferedReader(常用,因为它套的是字符,读取一行,常用readLine方法)

Writer(抽象类),用于字符流的输出

常用子类:FileWriter   

BufferedWriter(与上同,它可以直接写入字符串)

读取字符的方式实现文件复制:参考源码:BufferedTest.java

 

转换流:

Reader

InputStreamReader:字节流转换为字符流

标准输入:

BufferedReader  br=new BufferedReader(new InputStreamReader(System.in));

 

Writer:OutputStreamWriter

 

数据流:

读取或写入原生数据类型(int、double)

ByteArrayInputStream套接DataInputStream

ByteArrayOutputStream套接DataOutputStream

读取与存放原生数据到容器中:原文件:DataStreamTest.java

从程序中写入数据到文件中,写入的原生数据为二进制(字符除外),从文件中读取二进制数据,例如游戏里面的数据:源文件:DataStreamTest2

 

打印输出流:

字节打印流:PrintStream

字符打印流:PrintWriter:

其输出操作不会抛异常,用户通过检测错误状态获取错误信息,并且其有自动flush功能。可以自动实现字节流与字符流的转换

常用方法:print println  flush

参考源码:PrintStreamTest.java

 

对象流:可以实现将对象的写入或读取

ObjectInputStream

ObjectOutputStream

将对象写入文件中,要对对象进行序列化,将对象转换为二进制,需让对象实现Serializable接口(窄接口,无方法)。要将对象的二进制数据从文件中读取出来,需要将对象进行反序列化。调用transient可以使属性和方法不被反序列化,在属性和方法前加入transient即可。参考源码:Object.java   +   Student.java

 

 

流中的一个设计模式:

   DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(

           new FileOutputStream("data.txt")));

FileOutputStream("data.txt"):向文件写入数据

BufferedOutputStream(new FileOutputStream("data.txt")):以缓冲的方式向文件中写入数据

 

DataOutputStream(new BufferedOutputStream(

           new FileOutputStream("data.txt"))):以缓冲的方式向文件中写入基本类型的数据。写入的数据位二进制数据,

它一层套一层实现3个功能

装饰模式。