以下讲解的类都继承于InputStream、OutputStream、Reader、Writer类,下面链接是这些类的常用方法:
缓冲I/O的一种性能优化,缓冲流为I/O增加了内存缓冲区,有了缓冲区,使得在I/O流上执行skip()、mark()、reset()方法成为可能
1.BufferedInputStream类与BufferedOutputStream类
BufferedInputStream类可以对所有InputStream的子类进行带缓冲区的包装,以达到性能的优化,BufferedInputStream类有两个构造方法,如下:
- BufferedInputStream(InputStream in):创建一个带有32个字节的缓冲输入流;
- BufferedInputStream(InputStream in,int size):按指定的大小来创建缓冲输入流;
BufferedOutputStream类中的flush()方法被用来把缓冲区中的字节写入到文件中,并清空缓冲,BufferedOutputStream类也有两个构造方法,和BufferedInputStream类类似,如下:
- BufferedOutputStream(OutputStream in):创建一个带有32个字节的缓冲输入流;
- BufferedOutputStream(OutputStream in,int size):按指定的大小来创建缓冲输入流;
注意:即使在缓冲区没有满的情况下,使用flush()方法也会将缓冲区的字节强制写入到文件中。
BufferedInputStream类要比FileInputStream类快上很多,下面以两种类举例说明,使用FileInputStream类来读取文件时所用到的时间,代码如下:
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
File file = new File("C:\\Users\\Administrator\\Desktop\\jdk api 1.8_google.CHM");
//系统开始时间(毫秒)
long start = System.currentTimeMillis();
try {
FileInputStream fi = new FileInputStream(file);
byte chr[] = new byte[1024];
//循环读取文件内容
while(fi.read(chr) != -1) {
}
fi.close();
//系统结束时间(毫秒)
long end = System.currentTimeMillis();
System.out.println("运行毫秒数:" + (end - start));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
返回结果:
上述代码中,用到的文件是javaAPI文档,文件太小的话,体验不出来效果,下面在看用BufferedInputStream类查看文件的速度,代码如下:
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test {
public static void main(String[] args) {
File file = new File("C:\\Users\\Administrator\\Desktop\\jdk api 1.8_google.CHM");
//系统开始时间(毫秒)
long start = System.currentTimeMillis();
try {
FileInputStream fi = new FileInputStream(file);
BufferedInputStream bi = new BufferedInputStream(fi);
byte chr[] = new byte[1024];
//循环读取文件内容
while(bi.read(chr) != -1) {
}
bi.close();
fi.close();
//系统结束时间(毫秒)
long end = System.currentTimeMillis();
System.out.println("运行毫秒数:" + (end - start));
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
返回结果:
上面实例可以看出,BufferedInputStream类要比FileInputStream类块很多。
2.BufferedReader类与BufferedWriter类
BufferedReader类与BufferedWriter类分别继承Reader类与Writer类,这两个类同样具有内部缓冲机制,并以行为单位进行输入/输出。
BufferedReader类的常用方法及说明如下表:
方法 | 返回值 | 说明 |
read() | int | 读取单个字符 |
readLine() | String | 读取一个文本行,并将其返回为字符串,若无数据可读,则返回null |
BufferedWriter类的常用方法及说明如下表:
下面以行为单位进行输入/输出为例,代码如下:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class BufferedTest {
public static void main(String args[]) {
// 定义字符串数组
String content[] = { "你不喜欢我,", "我一点都不介意。", "因为我活下来,", "不是为了取悦你!" };
File file = new File("word.txt"); // 创建文件对象
try {
FileWriter fw = new FileWriter(file); // 创建FileWriter类对象
// 创建BufferedWriter类对象
BufferedWriter bufw = new BufferedWriter(fw);
for (int k = 0; k < content.length; k++) { // 循环遍历数组
bufw.write(content[k]); // 将字符串数组中元素写入到磁盘文件中
bufw.newLine(); // 将数组中的单个元素以单行的形式写入文件
}
bufw.close(); // 将BufferedWriter流关闭
fw.close(); // 将FileWriter流关闭
} catch (IOException e) { // 处理异常
e.printStackTrace();
}
try {
FileReader fr = new FileReader(file); // 创建FileReader类对象
// 创建BufferedReader类对象
BufferedReader bufr = new BufferedReader(fr);
String s = null; // 创建字符串对象
int i = 0; // 声明int型变量
// 如果文件的文本行数不为null,则进入循环
while ((s = bufr.readLine()) != null) {
i++; // 将变量做自增运算
System.out.println("第" + i + "行:" + s); // 输出文件数据
}
bufr.close(); // 将BufferedReader 流关闭
fr.close(); // 将FileReader流关闭
} catch (IOException e) { // 处理异常
e.printStackTrace();
}
}
}
返回结果: