IO流
一、概述
流是磁盘或其他外围设备中存储的数据的源点或终点。标准输入输出、文件的操作、网络上的数据流、字符串流、对象流、zip文件流等,java将输入输出抽象为流。
数据流分类:既可以是未经加工的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数据。
1. 字节流:数据流中最小的数据单元是字节
2. 字符流:数据流中最小的数据单元是字符,java中的字符是Unicode编码,一个字符占用两个字节
1. 输入流:只能读不能写,基类为InputStream(字节输入流),或者Reader(字符输入流)
2. 输出流:只能写不能读,基类为OutputStream(字节输出流),或者Writer(字符输出流)
二、InputStream
InputStream为字节输入流的超类,为抽象类,必须依靠子类实现各种功能。传输的数据单元为字节(8bit),提供了3种重载的read()方法
1. public abstract int read():读取一个byte的数据,返回值是高位补0的int类型值。若返回值为-1说明没有读取到任何字节,读取工作结束
2. public int read(byte[] b):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。
3. public int read(byte[] b, int off, int len):从输入流中最多读取len个字节的数据,存放到偏移量为off的b数组中
4. public int available():返回输入流中可以读取的字节数
5. public long skip(long n):忽略输入流的n个字节,返回值是实际忽略的字节数
6. public int close():使用完,必须对打开的流进行关闭
inputStream的实现类为:
1.FileInputStream把一个文件作为InputStream,实现对文件的读取操作
2. ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用
3. StringBufferInputStream:把一个String对象作为InputStream
4. PipedInputStream:实现了pipe的概念,主要在线程中使用
5. SequenceInputStream:把多个InputStream合并为一个InputStream
三、OutputStream抽象类
OutputStream提供了3个writer方法来做数据的输出
1. public void write(byte b[]):将参数b中的字节写到输出流
2. public void write(byte b[], int off, int len):将参数b的从偏移量off开始的len个字节写到输出流
3. public abstract void write(int b):先把int转换为byte类型,把低字节写入到输出流
4. public void flash():将数据缓冲区中数据全部输出,并清空缓冲区
5. public void close():关闭输出流并释放与流相关的系统资源
OutputStream实现类
1. ByteArrayOutputStream:把信息存入内存中的一个缓冲区中
2. FileOutputStream:把信息存入文件中
3. PipedOutputStream:实现了pipe的概念,主要在线程中使用
4. SequenceOutputStream:把多个OutStream合并为一个OutStream
OutputStream流结束的判断:方法read()的返回值为-1时;readLine()的返回值为null时
四、文件输入流FileInputStream类
FileInputStream可以使用read()方法一次读入一个字节,并以int类型返回,或者是使用read()方法时读入至一个byte数组,byte数组的元素有多少个,就读入多少个字节。在将整个文件读取完成或写入完毕的过程中,这么一个byte数组通常被当作缓冲区,因为这么一个byte数组通常扮演承接数据的中间角色。
作用:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类。
五、文件输出流FileOutputStream类
作用:用来处理以文件作为数据输出目的的数据流;或者说是从内存区读数据入文件.
注意: (1)文件中写数据时,若文件已经存在,则覆盖存在的文件;(2)的读/写操作结束时,应调用close方法关闭流。
六、缓冲输入输出流 BufferedInputStream/ BufferedOutputStream
计算机访问外部设备非常耗时。访问外存的频率越高,造成CPU闲置的概率就越大。为了减少访问外存的次数,应该在一次对外设的访问中,读写更多的数据。缓冲流就是每一个数据流分配一个缓冲区,一个缓冲区就是一个临时存储数据的内存。这样可以减少访问硬盘的次数,提高传输效率。
BufferedInputStream当向缓冲流读取数据时,数据先写到缓冲区,待缓冲区写满后,系统一次性将数据发送给输出设备。
BufferedOutputStream当从缓冲区读取数据时,系统先从缓冲区读出数据,待缓冲区为空时,系统再从输入设备读取到缓冲区。
七、字符流Writer/Reader
java中字符是采用Unicode标准,一个字符是16位,使用两个字节表示。为此,java中引入了处理字符的流。
Reader抽象类:
用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
Writer抽象类:
写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。
Reader类能够将输入流中采用其他编码类型的字符转换为Unicode字符,然后在内存中为其分配内存
Writer类能够将内存中的Unicode字符转换为其他编码类型的字符,再写到输出流中。