IO流
1,分类
Java.io 包中定义了多个流类型(类或抽象类)来实现输入/输出功能;可以从不同的角度对其进行分类:
- 输入流和输出流:数据流的方向不同。
- 字节流和字符流:处理数据单位不同。
- 节点流和处理流:功能不同划分。
JDK所提供的所有流类型位于包 Java.io内,都分别继承自以下四种抽象流类型。
输入流:InputStream(字节流),Reader(字符流)
输出流:OutPutStream(字节流),Writer(字符流)
2,字节流和字符流
字节流:最原始的一个流,读出来的数据就是010101这种最底层的数据表示形式,只不过它是按照字节来读的,一个字节(Byte)是8位(bit)读的时候不是一个位一个位的来读,而是一个字节一个字节来读。
字符流:字符流是一个字符一个字符地往外读取数据。一个字符是2个字节。
3,输入流和输出流
用一根管道一端插进文件里,一端插进程序里面,然后开始读数据,那么这是输入还是输出呢?
如果站在文件的角度上,这叫输出。
如果站在程序的角度上,这叫输入。
注意:输入流和输出流都是站在程序的角度上来说。
4,节点流和处理流
你要是对原始的流不满意,你可以在这根管道外面再套其它的管道,套在其它管道之上的流叫处理流。为什么需要处理流呢?这就跟水流里面有杂质,你要过滤它,你可以再套一层管道过滤这些杂质一样。
节点流:从一个特定的数据源(节点)读写数据。(文件,内存)
处理流:连接在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写能力。
节点流
类型 | 字符流 | 字节流 |
---|---|---|
File(文件) | FileReader、FileWriter | FileInputStream、FileOutputStream |
Memory Array | CharArrayReader、CharArrayWriter | ByteArrayInputStream、ByteArrayOutputStream |
Memory String | StringReader、StringWriter | - |
Pipe(管道) | PipedReader、PipedWriter | PipedInputStream、PipedOutputStream |
处理流
处理类型 | 字符流 | 字节流 |
---|---|---|
Buffering 缓冲流 | BufferedReader、BufferedWriter | BufferedInputStream、BufferedOutputStream |
Filtering | FilterReader、FilterWriter | FilterInputStream,FilterOutputStream |
Converting between bytes and character 转换流 | InputStreamReader、OutputStreamWriter | |
Object Serialization 对象流 | - | ObjectInputStream、ObjectOutputStream |
Data conversion 数据流 | - | DataInputStream、DataOutputStream |
Counting | LineNumberReader | LineNumberInputStream |
Peeking ahead | PusbackReader | PushbackInputStream |
Printing 打印流 | PrintWriter | PrintStream |
5,InputStream
继承关系
- InputStream
- 节点流
- FileInputStream
- PipedInputStream
- ByteArrayInputStream
- StringBufferInputStream
- 处理流
- FilterInputStream
- LineNumberInputStream
- DataInputStream
- BufferedInputStream
- PushbackInputStream
- SequenceInputStream
- ObjectInputStream
常用方法
//读取一个字节并以整数的形式返回(0~255)
//如果返回-1就说明已经到了输入流的末尾
int read() throws IOException
//读取一系列字节并存储到一个数组buffer
//返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1
int read(byte[] buffer) throws IOException
//读取length个字节
//并存储到一个字节数组buffer,从length位置开始
//返回实际读取的字节数,如果读取前以到输入流的末尾返回-1.
int read(byte[] buffer,int offset,int length) throws IOException
//关闭流释放内存资源
void close() throws IOException
//跳过n个字节不读,返回实际跳过的字节数
long skip(long n) throws IOException
read()方法是一个字节一个字节地往外读,每读取一个字节,就处理一个字节。
read(byte[] buffer)方法读取数据时,先把读取到的数据填满这个byte[]类型的数组buffer(buffer是内存里面的一块缓冲区),然后再处理数组里面的数据。这就跟我们取水一样,先用一个桶去接,等桶接满水后再处理桶里面的水。
如果是每读取一个字节就处理一个字节,这样子读取也太累了。
6,OutputStream
继承关系
- OutputStream
- 节点流
- FileOutputStream
- PipedOutputStream
- ByteArrayOutputStream
- 处理流
- FilterOutputStream
- DataOutputStream
- BufferedOutputStream
- PrintStream
- ObjectOutputStream
常用方法
//向输出流中写入一个字节数据,该字节数据为参数b的低8位
void write(int b) throws IOException
//将一个字节类型的数组中的数据写入输出流
void write(byte[] b) throws IOException
//将一个字节类型的数组中的从指定位置(off)开始的len个字节写入到输出流
void write(byte[] b,int off,int len) throws IOException
//关闭流释放内存资源
void close() throws IOException
//将输出流中缓冲的数据全部写出到目的地
void flush() throws IOException
7,Reader
继承关系
- Reader
- 节点流
- CharArrayReader
- PipedReader
- StringReader
- 处理流
- BufferedReader
- LineNumberReader
- InputStreamReader
- FileReader(节点流)
- FilterReader
- PushbackReader
常用方法
//读取一个字节并以整数的形式返回(0~255)
//如果返回-1就说明已经到了输入流的末尾
int read() throws IOException
//读取一系列字节并存储到一个数组buffer
//返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1 int
read(byte[] buffer) throws IOException
//读取length个字节
//并存储到一个字节数组buffer,从length位置开始
//返回实际读取的字节数,如果读取前以到输入流的末尾返回-1.
int read(byte[] buffer,int offset,int length) throws IOException
//关闭流释放内存资源
void close() throws IOException
//跳过n个字节不读,返回实际跳过的字节数
long skip(long n) throws IOException
8,Writer
继承关系
- Writer
- 节点流
- CharArrayWriter
- PipedWriter
- StringWriter
- 处理流
- BufferedWriter
- OutputStreamWriter
- FileWriter(节点流)
- FilterWriter
常用方法
//向输出流中写入一个字节数据,该字节数据为参数b的低16位
void write(int b) throws IOException
//将一个字节类型的数组中的数据写入输出流
void write(byte[] b) throws IOException
//将一个字节类型的数组中的从指定位置(off)开始的len个字节写入到输出流
void write(byte[] b,int off,int len) throws IOException
//关闭流释放内存资源
void close() throws IOException
//将输出流中缓冲的数据全部写出到目的地
void flush() throws IOException