Java IO流与文件(一)
基本概念
- 输入输出(I/O):指程序与外部设备或其他计算机交互的操作
- 通过输入输出从外界接收信息或传递信息给外界
- Java将其通过接口实现,使程序简单
- 流
- 指在计算机输入输出操作中各部件间的数据流动,是一组有序的数据集合
- 有方向
- 代表数据输入源或数据输出目的
- 屏蔽实际I/O数据处理细节,使输入输出独立于设备
- 分类
- 按传输方向分:输入流和输出流
- 按数据处理单位分:字节流和字符流
- 按流功能分:节点流、处理流
- 其数据可为原始二进制数据或经处理的特定格式的数据
- 输入输出流
- 称为数据流
- 是Java程序发送和接收数据的通道
- 输入流是从存储介质或数据通道读数据,输出流是向存储介质或数据通道写数据
- 特性
- 数据获取与发送均沿数据序列顺序进行
- 先进先出
- 一个流只有一个功能,只读或只写,
- 目的:使程序输入输出独立于相关设备
- 对于输入输出设备,只需针对流做处理,无需关心和修改源程序细节,增强了程序可移植性
- 缓冲流
- 一个流配备一个缓冲区
- 缓冲区:用于传送数据的内存块
- 向一个缓冲流写入数据时,系统将数据转发到缓冲区
- 缓冲区自动记录数据
- 当缓冲区满时,系统数据全发送到外部设备
- 缓冲流从缓冲区读数据
- 缓冲区为空时,从外部设备自动读取数据并尽可能填满缓冲区
- 一个流配备一个缓冲区
- 节点流和处理流
- 节点流:指从某个特定的数据源(节点)读/写数据的流
- 处理流:必须套接在已存在的流之上,为已存在的流提供更丰富特性
- 被套接的流可以是节点流也可以是处理流
- 指在计算机输入输出操作中各部件间的数据流动,是一组有序的数据集合
I/O流类
概述
- Java提供了java.io包,其中每个类代表一种特定输入/出流
- 其输入输出流可按处理数据单位不同分两类:面向字节和面向字符
- 面向字节流:数据处理以字节为基本单位
- 每次读取8位二进制数,也称二进制字节流或位流
- 即最小数据单元为字节
- 能处理文本文件和二进制文件数据
- 以Stream结尾
- InputStream类和OutputStream类:是所有字节流的父类
- InputStream:
- 主要子类
类 功能 FileInputStream 从文件中读取输入流 PipedInputStream 输入管道 FilterInputStream 过滤输入流 ByteArrayInputStream 从字节数组读取输入流 SequenceInputStream 两个或多个输入流的联合输入流,按顺序读取 ObjectInputStream 对象的输入流 LineNumberInputStream 为文本文件输入流附加行号 DataInputStream 包含读取Java标准数据类型方法的输入流 BufferedInputStream 缓冲输入流 PushbackInputStream 返回一个字节,并将该字节放回输入流 - 常用方法
方法 说明 void close() 关闭输入流 void mark() 标记输入流当前位置 void reset() 将读取位置返回到标记处 int read() 从输入流中当前位置读入一个字节的二进制数据,以此数据为低位字节,补足16位的整型量(0~255)后返回,若输入流中当前位置没有数据,则返回-1 int read(byte b[]) 从输入流中当前位置连续多个字节保持在数组中,并返回所读取的字节 int read(byte b[],int off,int len) 从输入流中当前位置连续len长的字符,从数组第off+1个元素位置开始存放,并返回所读取字节数 int available() 返回输入流中可读取的字节数 long skip(long n) 略过n个字节 boolean markSupported() 测试输入数据是否支持标记
- 主要子类
- InputStream:
- OutputStream:
- 主要子类
类 说明 FileOutputStream 写入文件的输出流 PipedOutputStream 输出管道 FilterOutputStream 过滤输出流 ByteArrayOutputStream 写入字节数组的输出流 ObjectOutputStream 对象的输出流 DataOutputStream 包含写Java标准数据类型方法的输出流 BufferedOutputStream 缓冲输出流 PrintStream 包含print()和println()的输出流 - 常用方法
方法 说明 void close() 关闭输出流 void flush() 强制清空缓冲区并执行向外设输出数据 void write(int b) 将参数b的低位字节写入到输出流 void write(byte b[]) 按顺序将数组b[]中全部字节写入到输出流 void write(byte b[],int off,int len) 按顺序将数组b[]中第off+1个元素开始的len个数据写入到输出流 - 字节流写数据换行方式:
- Windows系统为:\r\n
- linux为:\n
- mac为:\r
- 主要子类
- InputStream和OutputStream都是抽象类,故程序中创建的输入流对象一般是它们某个子类的对象,通过调用对象继承的read()和write()方法就可实现对相应外设的输入输出操作
- 每次读取8位二进制数,也称二进制字节流或位流
- 面向字符流:用于字符数据的处理
- 一次读取16位二进制数,并作为字符而非二进制位处理
- 即最小数据单元为字符
- Java内部字符均使用Unicode编码,一个字符占两个字节
- 字符流可将该内部格式按本地字符集自动转换
- 输入流Reader和输出流Write
- 输入流Reader
- 主要子类
方法 说明 CharArrayReader 从字符数组读取输入流 BufferedReader 缓冲输入字符流 PipedReader 输入管道 InputStreamReader 将字节转换到字符的输入流 FilterReader 过滤输入流 StringReader 从字符串中读取的输入流 LineNUmberReader 为输入数据附加行号 PushbackReader 返回一个字符并将此字节放回输入流 FileReader 从文件读取的输入流 - 常用方法
方法 说明 int read() 从输入流中读取下一个字符,以int型返回(0~65535).若读取前已到达流末尾,则返回-1 int read(char buff[]) 从输入流读取若干个字符以填充字符数组buff,返回实际读取的字符数。若读取前已到达流末尾,则返回-1 abstract int read(char buff[],int offset,int len) 从输入流读取len个字符数组buff(读取的第一个字符存放于buff[offset],返回实际读取的字符数。若读取前已到达流末尾,则返回-1 void mark(int readlimit) 对输入流的当前位置做标记,以便之后回到该位置。readlimit指定了在可重新回的前提下允许读取的最大字符 void reset() 将输入流的当前位置重新定位到最后一次调用mark方法时的位置。调用此方法后,后续read方法将从当前位置读取 boolean markSupported() 判断输入流是否支持mark和reset long skip(long n) 跳过n个字符,返回值为实际跳过的字符数 abstract void close() 关闭输入流并释放与之关联的所有系统资源 boolean ready() 测试流是否可读取
- 主要子类
- 输出流Writer
- 主要子类
方法 说明 CharArrayWriter 写到字符数组的输出流 BufferedWriter 缓冲字符输出流 PipedWriter 输出管道 OutputStreamWriter 转换字符到字节的输出流 FliterWriter 过滤输出流 StringWriter 输出字符串到流 PrintWriter 包含print()和println()的输出流 FileWriter 输出到文件的输出流 - 常用方法
方法 说明 void write(int c ) 将c的低16位写到输出流,高16位被忽略 void write(String str) 将字符串str写到输出流 void write(String str,int offset,int len) 将字符串tr中从offset开始的len个字符写到输出流 void write(char buff[]) 将字符数组写到输出流 abstract void write(char buff[],int offset,int len) 将字符数组bufff从offset开始的len个字符写到输出流 abstract void flush() 刷新输出流,并强制将所有缓冲输出流中的字符写到输入流 abstract void close() 关闭输出流并释放与之关联的所有系统资源
- 主要子类
- 输入流Reader
- 一次读取16位二进制数,并作为字符而非二进制位处理
- 使用字节流和字符流的步骤基本相同
- 创建数据源相关流对象,利用流对象方法从流输入/出数据,最后执行close()方法关闭流
- 使用场景
- 若为纯文本文件,优先使用字符流
- 若为图片、视频、音频等二进制文件,优先使用字节流
- 若不确定文件类型,优先使用万能的字节流
- 面向字节流:数据处理以字节为基本单位
- 体系结构
- 3个预定的可直接使用的流对象
- System.in:标准输入,通常代表键盘输入
- System.out:标准输出,通常写往显示器
- System.err:标准错误输出,通常写往显示器
过滤流
- FilterInputStream和FilterOutputStream:
- 分别为InputStream和OutputStream的直接子类
- 实现了对数据读/写及对数据做类型或格式转换
- 即可实现对二进制字节数据的理解和编码的转换
- 常用的两个过滤流:数据输入流DataInputStream和数据输出流DataOutputStream
- 分别实现了接口DataInput和接口DataOutput
- 实现了对不同类型数据的读/写
- 输入/输出流分别作为数据输入/输出流的构造方法