IO(上)
IO流按操作数据的不同可以分为字节流和字符流,按数据传输的方向的不同又可以分为输入流和输出流。IO包中,字节流的输入输出分别用java.io.InputStream和java.io.OutputStream表示,字符流的输入输出分别用java.io.Reader和java.io.Writer表示。
字节流
可以把InputStream和OutputStream看成两根水管,所有输入输出的字节都需要经过他们。
InputStream的四个方法:4.void close() 关闭此输入流并释放与该流关联的所有系统资源
OutputStream是用于写数据的,提供了如下5个方法:
4.void flush() 刷新此输出流并强制写出所有缓冲的输出字节
5.void close() 关闭此输出流并释放与此流相关的所有系统资源
InputStream类和OutputStream类都是抽象类,不能被实例化。
JDK专门提供了FileInputStream(InputStream的子类)和FileOutputStream(OutputStream的子类)针对文件的读写。
如果通过FileOutputStream向一个已经存在的文件中写入数据,那么该文件中的数据会先被清空再写入,如果想要在已有的基础上再加入新的内容,可以使用FileOutputStream的构造函数FileOutputStream(String fileName,boolean append)来创建文件输出流对象,并把append参数的值设置为ture。
为了避免遇到异常时,IO流的close方法无法关闭,通常把close方法写在finally里面。
文件的拷贝:IO流通常都是成对出现的,文件的拷贝就需要通过输入流读取文件中的数据,通过输出流将数据写入文件。(文件路径时用\或者/)
字节流的缓冲区:之前的拷贝文件,我们是一个字节一个字节的读写,效率低下,因此定义了一个缓冲区来提高效率,可以定义一个字节数组作为缓冲区,可以一次性读取多个字节的数据。
装饰设计模式:装饰设计就是通过包装一个类,动态地为它增加功能的一种设计模式。
字节缓冲流:IO包中提供两个带缓冲的字节流,BufferedInputStream和BufferedOutputStream,这两个都用了装饰设计模式。应用程序通过缓冲流来完成数据的读写,缓冲流又是通过底层被包装的字节流与设备进行关联的。
字符流
字节流中的Reader和Writer就相当于InputStream和OutputStream。
通过字符输入流FileReader可以直接从文件中读取字符,FileWriter可以将字符写入文件,用法和字节流的基本都相似。
字符流同样提供了缓冲区的包装流来提供读写的效率。BufferedReader和BufferedWriter。在BufferedReader中有个readLine()方法用于一次读取一行文本。用了缓冲区的代码,一定要调用close方法,因为字符会先进入缓冲区,只有缓冲区满了或者调用了close方法,这些字符才会写入目标文件。
LineNumberReader:是为了方便查找代码中的错误,JDK提供的一个可以跟踪行号的输入流,是BufferedReader的直接子类。
转换流(仅作用于文本文件):InputStreamReader(Reader子类,将字节流转换成字符流)和OutputStreamWriter(Writer子类,将字符流转换成字节流)。转换流也是一种包装流 。