javajavase
IO是Input/Output的缩写,IO技术是非常实用的技术,用于处理设备之间的数据传输。如读/写文件,网络通讯等
- Java程序中,对于数据的输入输出操作以“流(stream)”的方式进行
Java.IO包下提供了各种“流”类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据
Java IO原理
输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存)中
- 输出output:将程序(内存)数据输出到磁盘、光盘等存储设备中
流的分类
按流的方向
- 输入流:数据流向是数据源到程序(以InputStream、Reader结尾的流)
- 输出流:数据流向是程序到目的地(以OutPutStream、Writer结尾的流)
按处理的数据单元
- 字节流:以字节为单位获取数据,命名上以Stream结尾的流一般是字节流
- 字符流:以字符为单位获取数据,命名上以Reader/Writer结尾的流一般是字符流
按处理对象不同
- 节点流:可以直接从数据源或目的地读写数据
- 处理流:不直接连接到数据源或目的地,是”处理流的流”。通过对其他流的处理提高程序的性能,处理流也叫包装流
IO流体系
Java的IO流共涉及40多个类,实际上非常规则,都是从如下4个抽象基类派生的
由这四个类派生出来的子类名称都是以其父类名作为子类名后缀
几个常用的IO流结构
** | 节点流(或文件流) | 缓冲流(处理流的一种) |
---|---|---|
InputStream | FileInputStream (read(byte[] buffer)) | BufferedInputStream (read(byte[] buffer)) |
OutputSteam | FileOutputStream(write(byte[] buffer,0,len) | BufferedOutputStream (write(byte[] buffer,0,len) / flush() |
Reader | FileReader (read(char[] cbuf)) | BufferedReader (read(char[] cbuf) / readLine()) |
Writer | FileWriter (write(char[] cbuf,0,len) | BufferedWriter (write(char[] cbuf,0,len) / flush() |
InputSteam & Reader
InputStream 和 Reader 是所有输入流的基类
FileInputStream 用于读取非文本数据之类的原始字节流,要读取字符流,需要使用 FileReader
程序中打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显式关闭文件IO资源
InputSteam
**int read()**
- 读取一个字节的数据并将字节的值作为int类型返回(0-255之间)。如果未读出字节则返回-1表示读取结束(汉字是两个字节,现在读取一个字节就转换为char输出,会出现乱码题)
**int read(byte[] b)**
- 从该输入流读取最多b.length个字节的数据(字节数组)并将它存到数组b中,返回读取字节长度,如果返回-1说明已经读到文件末尾
**int read(byte[] b,int off,int len)**
- 将输入流中最多len个数据字节读入byte数组。尝试读取len个字节(读取的字节也可能小于该值),以整数形式返回实际读取的字节数。如果返回-1说明已经读到文件末尾
**public void close() throws IOException**
**int read(char[] cbuf)**
- 将字符读入数组。如果已到达流的末尾,则返回-1。否则返回本次读取的字符数
**int read(char[] cbuf,int off,int len)**
- 将字符读入数组的某一部分。存到数组cbuf中,从off处开始存储,最多读len个字符。如果已到达流的末尾,则返回-1。否则返回本次读取的字符数
**public void close() throws IOException**
-
OutputSteam & Writer
OutputStream 和 Writer 是所有输出流的基类
FileOutputstream 用于写出非文本数据之类的原始字节流,要写出字符流需要使用 FileWriter
因为字符流直接以字符作为操作单位,所以 Writer 可以用字符串来替换字符数组,即以String对象作为参数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个字节写入此输出流
**public void flush() throws IOException**
- 刷新此输出流并强制写出所有缓冲的输出字节,调用此方法指示应将这些字节立即写入它们预期的目标
**public void close() throws IOException**
**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()**
- 刷新该流的缓冲,则立即将它们写入预期目标
**public void close() throws IOException**
- 创建File类的对象,指明读取的数据的来源(要求此文件一定要存在)
- 创建相应的输入流,将File类的对象作为参数,传入流的构造器中
- 具体的读入过程:创建相应的byte[] 或 char[]
- 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally处理
输出过程
- 创建File类的对象,指明写出的数据的位置(不要求此文件一定要存在)
- 创建相应的输出流,将File类的对象作为参数,传入流的构造器中
- 具体的写出过程:write(char[]/byte[] buffer, 0, len)
- 关闭流资源
说明:程序中出现的异常需要使用try-catch-finally处理