概述
IO
是Input/Output
的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等。
Java程序中,对于数据的输入输出操作以“流(stream)”的方式进行。
java.io
包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据。
流的分类
操作数据单位:字节流、字符流
- 对于文本文件(
.txt
,.java
,.c
,.cpp
),使用字符流处理 - 对于非文本文件(
.jpg
,.mp3
,.mp4
,.avi
,.doc
,.ppt
,...),使用字节流处理
数据的流向:输入流、输出流
-
input
(输入):读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中。 -
output
(输出):将程序(内存)数据输出到磁盘、光盘等存储设备中。
流的角色:节点流、处理流
节点流:直接从数据源或目的地读写数据。
![](https://img.haomeiwen.com/i11007011/224f91628b7d68ac.png)
处理流:不直接连接到数据源,而是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。
![](https://img.haomeiwen.com/i11007011/97c127b2b1455e90.png)
流的分类图示:
![](https://img.haomeiwen.com/i11007011/3f0bfb7b689317f1.png)
IO流的体系结构
流的体系
![](https://img.haomeiwen.com/i11007011/252c27e193b97951.png)
红色框为4个抽象基类,蓝色背景框为常用IO流
常用的几个IO流
抽象基类 | 节点流(或文件流) | 缓冲流(处理流的一种) |
---|---|---|
InputStream | FileInputStream | BufferedInputStream |
OutputSteam | FileOutputStream | BufferedOutputStream |
Reader | FileReader | BufferedReader |
Writer | FileWriter | BufferedWriter |
对抽象基类的说明
抽象基类 | 字节流 | 字符流 |
---|---|---|
输入流 | InputSteam | Reader |
输出流 | OutputSteam | Writer |
- 说明:Java的lO流共涉及40多个类,实际上非常规则,都是从以上4个抽象基类派生的。
- 由这四个类派生出来的子类名称都是以其父类名作为子类名后缀。
InputSteam & Reader
-
InputStream
和Reader
是所有输入流的基类。 -
InputStream
(典型实现:FileInputStream
)int read()
int read(byte[] b)
int read(byte[] b,int off,int len)
-
Reader
(典型实现:FileReader
)int read()
int read(char[] c)
int read(char[] c,int off,int len)
- 程序中打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件IO资源。
-
FileInputStream
从文件系统中的某个文件中获得输入字节。FileInputStream
用于读取非文本数据之类的原始字节流。要读取字符流,需要使用FileReader
。
InputSteam:
-
int read()
从输入流中读取数据的下一个字节,返回0到255范围内的int字节值。如果因为已经到达流末尾而没有可用的字节,则返回值-1。
-
int read(byte[] b)
从此输入流中将最多b.length个字节的数据读入一个byte数组中。如果因为已经到达流末尾而没有可用的字节,则返回值-1,否则以整数形式返回实际读取的字节数。
-
int read(byte[] b,int off,int len)
将输入流中最多len个数据字节读入byte数组。尝试读取len个字节,但读取的字节也可能小于该值。以整数形式返回实际读取的字节数。如果因为流位于文件末尾而没有可用的字节,则返回值-1。
-
void close()
关闭此输入流并释放与该流关联的所有系统资源。
Reader:
-
int read()
读取单个字符。作为整数读取的字符,范围在
0
到65535
之间(0x00-0xffff
)(2个字节的Unicode
码),如果已到达流的末尾,则返回-1。 -
int read(char[] cbuf)
将字符读入数组。如果已到达流的末尾,则返回-1。否则返回本次读取的字符数。
-
int read(char[] cbuf, int off, int len)
将字符读入数组的某一部分。存到数组
cbuf
中,从off
处开始存储,最多读len
个字符。如果已到达流的末尾,则返回-1。否则返回本次读取的字符数。 -
void close()
关闭此输入流并释放与该流关联的所有系统资源
OutputSteam & Writer
-
OutputStream
和Writer
也非常相似:-
void write(int b)
和void write(int c)
; -
void write(byte[] b)
和void write(char[] cbuf)
; -
void write(byte[] b, int off, int len)
和void write(char[] buff, int off, int len)
; -
void flush()
; -
void close()
;需要先刷新,再关闭此流
-
- 因为字符流直接以字符作为操作单位,所以 Writer可以用字符串来替换字符数组,即以 String对象作为参数
-
void write(String str)
; -
void write(String str, int off, int len)
;
-
-
FileOutputStream
从文件系统中的某个文件中获得输出字节。FileOutputstream
用于写出非文本数据之类的原始字节流。要写出字符流,需要使用FileWriter
OutputStream:
-
void write(int b)
将指定的字节写入此输出流。 write的常规协定是:向输出流写入一个字节。要写入的字节是参数b的八个低位。b的24个高位将被忽略。即写入0~255范围的
-
void write(byte[] b)
将
b.length
个字节从指定的byte
数组写入此输出流。write(b)
的常规协定是:应该与调用wite(b, 0, b.length)
的效果完全相同。 -
void write(byte[] b, int off, int len)
将指定
byte
数组中从偏移量off
开始的len
个字节写入此输出流。 -
void flush()
刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标。
-
void close()
关闭此输岀流并释放与该流关联的所有系统资源。
Writer:
-
void write(int c)
写入单个字符。要写入的字符包含在给定整数值的16个低位中,16高位被忽略。即写入0到65535之间的 Unicode码。
-
void write(char[] cbuf)
写入字符数组
-
void write(char[] cbuf, int off, int len)
写入字符数组的某一部分。从
off
开始,写入len
个字符 -
void write(String str)
写入字符串。
-
void write(String str, int off, int len)
写入字符串的某一部分。
-
void flush()
刷新该流的缓冲,则立即将它们写入预期目标。
-
void close()
关闭此输出流并释放与该流关联的所有系统资源
输入、输出标准化过程
输入过程
- 创建
File
类的对象,指明读取的数据的来源。(要求此文件一定要存在) - 创建相应的输入流,将
File
类的对象作为参数,传入流的构造器中 - 具体的读入过程:创建相应的
byte[]
或char[]
。 - 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally
处理。
输出过程
- 创建
File
类的对象,指明写出的数据的位置。(不要求此文件一定要存在) - 创建相应的输出流,将
File
类的对象作为参数,传入流的构造器中 - 具体的写出过程:
write(char[] cbuffer, 0, len)
或write(byte[] buffer, 0, len)
- 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally
处理。
下篇文章,介绍节点流的使用。
网友评论