简介
Java IO流有输入流、输出流,也可以看成是字节流、字符流。
1、输入流和输出流很好理解,只需要搞清楚所谓的输入和输出是相对与程序来说的。
2、字符流实际上是通过字节流实现的,所以字符流能完成的工作,字节流都可以胜任。另外,根据API的说明,我们提倡在读取文本文件时采用字符流,而读取非文本文件(图像和音频等)时必须使用字节流。
3、IO流与File类的关系,简单的说File类是用来表示文件的属性,IO流是用来读取文件内容的。
常用的IO流
IO | 输入流 | 输出流 |
---|---|---|
字节流 | InputStream | OutputStream |
字符流 | Reader | Writer |
字节流InputStream和OutputStream作为字节流的最基本类,都在Java io包下,它们是抽象类,不能够被实例化,所以在实际使用中需要根据实际情况选择它们的子类来实例化。相同的,字符流Reader和Writer也是如此。
InputStream常用子类——FileInputStream
构造方法:
FileInputStream(File file)
FileInputStream(String name)
常用方法分析:
int available() 返回可以不受阻塞地从此文件输入流中读取的字节数。
void close() 关闭此文件输入流并释放与此流有关的所有系统资源。
int read() 从此输入流中读取一个数据字节。
int read(byte[] b) 从此输入流中将最多 b.length 个字节的数据读入一个字节数组中。
int read(byte[] b, int off, int len) 从此输入流中将最多 len 个字节的数据读入一个字节数组中。
long skip(long n) 从输入流中跳过并丢弃 n 个字节的数据。
值得注意的是关于read方法,可以视为一次只读取一个字节和一次性读取多个字节。一般后者的读取速度比前者要快。
InputStream常用子类——DataInputStream
构造方法:
DataInputStream(InputStream in) 使用指定的基础 InputStream 创建一个 DataInputStream。
常用方法分析:
int read(byte[] b) 从所包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组 b 中。
int read(byte[] b, int off, int len) 从所包含的输入流中将 len 个字节读入一个字节数组中。
boolean readBoolean() 参见 DataInput 的 readBoolean 方法的常规协定。
byte readByte() 参见 DataInput 的 readByte 方法的常规协定。
char readChar() 参见 DataInput 的 readChar 方法的常规协定。
double readDouble() 参见 DataInput 的 readDouble 方法的常规协定。
float readFloat() 参见 DataInput 的 readFloat 方法的常规协定。
void readFully(byte[] b) 参见 DataInput 的 readFully 方法的常规协定。
void readFully(byte[] b, int off, int len) 参见 DataInput 的 readFully 方法的常规协定。
int readInt() 参见 DataInput 的 readInt 方法的常规协定。
long readLong() 参见 DataInput 的 readLong 方法的常规协定。
String readUTF() 参见 DataInput 的 readUTF 方法的常规协定。
static String readUTF(DataInput in) 从流 in 中读取用 UTF-8 修改版格式编码的 Unicode 字符格式的字符串;然后以 String 形式返回此字符串。
int skipBytes(int n) 参见 DataInput 的 skipBytes 方法的常规协定。
该类方法的主要特点是包装了直接读取制定类型数据,可以一次性读取int ,long,double等数据
InputStream常用子类——BufferedInputStream
构造方法:
BufferedInputStream(InputStream in) 创建 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream,并保存其参数,即输入流 in,以便将来使用。
常用方法分析:
int available() 返回可以不受阻塞地从此输入流读取的字节数。
void close() 关闭此输入流并释放与该流关联的所有系统资源。
void mark(int readlimit) 参见 InputStream 的 mark 方法的常规协定。
boolean markSupported() 测试此输入流是否支持 mark 和 reset 方法。
int read() 从输入流读取下一个数据字节。
int read(byte[] b, int off, int len) 在此字节输入流中从给定的偏移量开始将各字节读取到指定的 byte 数组中。
void reset() 将此流重新定位到对此输入流最后调用 mark 方法时的位置。
long skip(long n) 跳过和放弃此输入流中的 n 个数据字节。
该类的主要特点是提供的每次读取多个字符的read方法,从而进一步提高了数据获取的效率
OutputStream常用子类——FileOutputStream
构造方法:
FileOutputStream(File file)
常用方法分析:
void close() 关闭此输出流并释放与此流有关的所有系统资源。
void flush() 刷新此输出流并强制写出所有缓冲的输出字节。
void write(byte[] b) 将 b.length 个字节从指定的字节数组写入此输出流。
void write(byte[] b, int off, int len) 将指定字节数组中从偏移量 off 开始的 len 个字节写入此输出流。
值得注意的是,关于flush这个方法,是将已经写入到内存的内容交由系统写入文件。一般系统会自动写入文件,可用可不用。
OutputStream常用子类——DataOutputStream
构造方法:
DataOutputStream(OutputStream out) 创建一个新的数据输出流,将数据写入指定基础输出流。
常用方法分析:
void flush() 清空此数据输出流。
int size() 返回计数器 written 的当前值,即到目前为止写入此数据输出流的字节数。
void write(byte[] b, int off, int len) 将指定字节数组中从偏移量 off 开始的 len 个字节写入基础输出流。
void writeXXX(XXX v)
将一个XXX值以相应的形式写出到基础输出流中。
与DataInputStream相对应,主要特点是提供将一定格式的字符以相应的格式输出
OutputStream常用子类——BufferedOutputStream
构造方法:
BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,以将数据写入指定的基础输出流。
BufferedOutputStream(OutputStream out, int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的基础输出流。
常用方法分析:
void flush() 刷新此缓冲的输出流。
void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流。
void write(int b) 将指定的字节写入此缓冲的输出流。
与BufferedinputStream相对应,提供一次性输出多字符的方法
Reader常用子类——FileReader
构造方法:
FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
常用方法分析:
int read() 读取单个字符。返回作为整数读取的字符,如果已达到流末尾,则返回 -1。
int read(char []cbuf) 将字符读入数组。返回读取的字符数。如果已经到达尾部,则返回-1。
void close()关闭此流对象。释放与之关联的所有资源。
Reader常用子类——InputStreamReader
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,否则可能接受平台默认的字符集。
构造方法:
InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
InputStreamReader(InputStream in, Charset cs) 创建使用给定字符集的 InputStreamReader。
InputStreamReader(InputStream in, CharsetDecoder dec) 创建使用给定字符集解码器的 InputStreamReader。
InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。
常用方法分析:
主要用途是配合BufferedReader使用
Reader常用子类——BufferedReader
构造方法:
BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
BufferedReader(Reader in, int sz) 创建一个使用指定大小输入缓冲区的缓冲字符输入流。
eg.
FileReader fr = new FileReader("D:/test.txt");
BufferedReader br = new BufferedReader(fr);
//用于接收键盘和其他设备录入
BufferedReader br = new BufferedReader(
new InputStreamReader(System.in));
常用方法分析:
void close() 关闭该流。
void mark(int readAheadLimit) 标记流中的当前位置。
boolean markSupported() 判断此流是否支持 mark() 操作(它一定支持)。
int read() 读取单个字符。
int read(char[] cbuf, int off, int len) 将字符读入数组的某一部分。
String readLine() 读取一个文本行。
boolean ready() 判断此流是否已准备好被读取。
void reset() 将流重置为最新的标记。
long skip(long n) 跳过字符。
关于read方法和readLine方法,read方法与一般的读方法大致相同,readLine方法则可以一次性读取一行,效率相对较高。
Writer常用子类——FileWriter
构造方法:
FileWriter(File file) 在给出 File 对象的情况下构造一个 FileWriter 对象。
FileWriter(String fileName) 在给出文件名的情况下构造一个 FileWriter 对象。
常用方法分析:
void write(String str) 写入字符串。当执行完此方法后,字符数据还并没有写入到目的文件中去。此时字符数据会保存在缓冲区中。此时在使用刷新方法就可以使数据保存到目的文件中去。
viod flush() 刷新该流中的缓冲。将缓冲区中的字符数据保存到目的文件中去。
viod close() 关闭此流。在关闭前会先刷新此流的缓冲区。在关闭后,再写入或者刷新的话,会抛IOException异常。
Writer常用子类——BufferedWriter
构造方法:
BufferedWriter(Writer out) 创建一个使用默认大小输出缓冲区的缓冲字符输出流。
BufferedWriter(Writer out, int sz) 创建一个使用指定大小输出缓冲区的新缓冲字符输出流。
常用方法分析:
void close() 关闭该流。
void flush() 刷新该流的缓冲。
void newLine() 写入一个行分隔符。
void write(char[] cbuf, int off, int len) 写入字符数组的某一部分。
void write(int c) 写入单个字符。
void write(String s, int off, int len) 写入字符串的某一部分。
几个例子
eg.复制test.txt中的内容到copy.txt
package com.buaa.io;
//文本文件复制,优先使用字符流,且使用BufferedReader和BufferedWriter效率最高
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
public class copyFile {
public static void main(String[] args)throws Exception {
BufferedWriter bw = new BufferedWriter(new FileWriter("d:/copy.txt"));
FileReader fr = new FileReader("d:/test.txt");
BufferedReader br = new BufferedReader(fr);
String s = null;
while((s=br.readLine())!=null){
bw.write(s);
bw.newLine();
}
br.close();
bw.close();
}
}
eg.复制test.rar压缩包
留白