Java I/O流
一、流的分类
- 按照操作数据单位不同,分为:字节流(8 bit),字符流(16 bit)
- 按照数据的流向不同,分为:输入流 输出流
抽象基类 | 字节流 | 字符流 |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
由这四个类(抽象类)派生出来的子类名称都是以其父类名作为子类名的后缀
IO流体系
分类 | 字节输入流 | 字节输出流 | 字符输入流 | 字符输出流 |
---|---|---|---|---|
抽象基类 | InputStream | OutputStream | Reader | Writer |
访问文件 | FileInputStream | FileOutputStream | FileReader | FileWriter |
访问数组 | ByteArrayInputStream | ByteArrayOutputStream | CharArrayReader | CharArrayWriter |
访问管道 | PipedInputStream | PipedOutStream | PipedReader | PipedWriter |
访问字符串 | StringReader | StringWriter | ||
缓冲流 | BufferedInputStream | BufferedOutputStream | BufferdReadier | BufferWriter |
转换流 | InputStreamReader | OutputStreamWriter | ||
对象流 | ObjectInputStream | ObjectOutput Stream | ||
FilterInputStream | FilterOutputStream | FilterReader | FilterWriter | |
打印流 | PrintStream | PrintWriter | ||
推回输入流 | PushbackInputStream | PushbackReader | ||
特殊流 | DataInputStream | DataOutputStream |
字符流与字节流区别
- 字节流操作的基本单元为字节;字符流操作的基本单元为Unicode码元。
- 字节流在操作的时候不会用到缓冲区,而字符流在操作的时候会用到缓冲区
- 字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串
二、File操作
2.1 FileReader
构造方法
FileReader(File file) //根据给定的 File 对象构造一个FileReader 对象。
FileReader(FileDescriptor fd) //根据给定的文件名构造一个 FileReader对象。
FileReader(String fileName) //根据给定的 FileDescriptor构造一个FileReader对象
使用
int read() throws IOException //读取单个字符,返回一个int型变量代表读取到的字符 返回值为-1相当于读完
int read(char [] c, int offset, int len)//读取字符到c数组,返回读取到字符的个数
void close() throw IOException //关闭流
2.2 FileWriter
构造方法
FileWriter(String fileName) throws IOException //根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName,boolean append) throws IOException//根据给定的文件名以及指示是否附加写入数据的boolean 值来构造 FileWriter 对象。append : 一个 boolean 值,如果为 true,则将数据写入文件末尾处,而不是写入文件开始处。
FileWriter(File file) throws IOException //根据给定的 File 对象构造一个 FileWriter 对象。
常用方法
void write(int c) //写入一个字符
void write(String str)//写入字符串
void write(String str, int off, int len) //写一个字符串的一部分。
void write(char[] cbuf, int off, int len) //写入字符数组的一部分。
void flush() throws IOException //刷新流。
void close() throws IOException //关闭流之前,要先刷新
2.3 FileInputStream
构造方法
FileInputStream(File file) throws FileNotFoundException //根据给定的 File 对象构造一个FileInputStream 对象。
FileInputStream(String name) throws FileNotFoundException //根据给定的文件名构造一个 FileInputStream 对象。
FileInputStream(FileDescriptor fd) //根据给定的 FileDescriptor构造一个FileInputStream对象
常用方法
int read() throws IOException //将读入的byte型8位二进制转化为10进制int型返回,-1表示读完
int read(byte[] b) throws IOException//从输入流中读取b.length个字节到字节数组中,返回读入缓冲区的总字节数 -1表示读完
int read(byte[] b,int off,int len) throws IOException //从输入流中读取最多len个字节到字节数组中,从数组的off位置开始存储字节
void close() throws IOException //关闭流
2.4 FileOutputStream
构造方法
FileOutputStream(File file) throws FileNotFoundException //根据给定的 File 对象构造一个FileOutputStream 对象。
FileOutputStream(File file,boolean append) throws FileNotFoundException{} //如果第二个参数为true,则字节将写入文件的末尾而不是开头,第二个参数为false时,覆盖原内容
FileOutputStream(String name) throws FileNotFoundException{}//据给定的文件名对象构造一个FileOutputStream 对象。
FileOutputStream(String name,boolean append) throws FileNotFoundException
常用方法
void write(int b) throws IOException //将指定的一个字节写入文件的输出流中
void write(byte[] b) throws IOException //将指定字节数组中的b.length个字节写入到输出流中
void write(byte[] b,int off,int len) throws IOException //将从偏移量off开始的指定字节数组中的len个字节写入输出流中
void close() throws IOException //关闭流
常用String类下的getBytes方法使字符串转化为byte型数组
三、缓冲流
Buffered与FIle在文件操作上的区别
- BufferedReader和BufferedWriter在内存中会自带一个8kb的字节缓冲区
- BufferedReader提供了readLine()方法
- BufferedReader类会尽量提取比当前操作所需的更多字节,以应该更多情况下的效率提升
3.1 BufferedReader
构造方法
BufferedReader br = new BufferedReader(new FileReader("FileName"));//首先创建FileReader对象,将FileReader传递给BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("FileName"), "utf-8"));//利用包装的InputStream类创建BufferedReader对象
常用方法
int read() throws IOException; //读取1个或多个字节,返回一个字符,当读取到文件末尾时,返回-1
int read(byte[] b,int off,int len) throws IOException //从输入流中读取最多len个字节到字节数组中,从数组的off位置开始存储字节
String readline() //读取一行的数据,存储在字符串中返回,不包括换行符
void close() //关闭流
乱码问题
包装FileReader的BufferedReader在读取文件时候如果文件的编码和项目的编码不一样的时候,会出现乱码
解决方法:
使用包装InputStreamReader的BufferedReader读取文件
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("FileName"), "utf-8"));
//BufferedReader只负责读到它的内部缓冲区中,而解码的工作是InputStreamReader完成的。
3.2 BufferedWriter
构造方法
BufferedWriter bw = new BufferedWriter(new FileWriter("FileName"));//首先创建FileWriter对象,将FileWriter传递给BufferedWriter
常用方法
void write(int c) //写入单个字符。
void write(char[] c, int off, int len) //从off开始写入字符数组的长为len的某一部分
void write(String s, int off, int len) //从off开始写入字符串长为len的某一部分。
void newLine() //写入一个行分隔符。
void flush() throws IOException //刷新该流的缓冲。
void close() throws IOException //关闭流之前,要先刷新
3.3 BufferedInputStream
构造方法
BufferedInputStream input = new BufferedInputStream(new FileInputStream("FileName"));//利用包装的InputStream类创建BufferedInputStrea对象
常用方法
int read() throws IOException // 读取下一个字节
int read( byte [] b, int off, int len) throws IOException // 将缓冲区中的数据写入到字节数组b中。off是字节数组b的起始位置,len是写入长度
void mark(int readlimit) //标记“缓冲区”中当前位置。 readlimit为mark后最多可读取的字节数
void reset() throws IOException // 将“缓冲区”中当前位置重置到mark()所标记的位置
void close() throws IOException //关闭流
3.4 BufferedOutputStream
构造方法
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream("FileName"));//利用包装的OutputStream类创建BufferedOutputStrea对象
常用方法
void write(int b)throws IOException //一次写一个字节
void write(byte[] b,int off,int len) throws IOException //从字节数组off开始写入长为len的字节串
void flush() throws IOException //刷新缓冲
void close() throws IOException //关闭流之前,要先刷新