转载请注明: https://www.jianshu.com/p/b25992906b12
![](https://img.haomeiwen.com/i2842625/f3bc42a22f69ea6f.png)
代码很简单:根据上图进行桥接(IO的设计采用装饰模式,所以是层层包裹的形式)
"//说明 :为了让注释更加清晰,在注释两边加了双引号,如果需要测试代码,请自行去掉"
"/**
* 目的 :
* 1、测试非文本格式是否可以用字符流?
* 2、测试缓冲字符流与缓冲字节流的速度对比?
* 3、流关闭顺序?
* 4、熟悉各个流的常用方法与构造器参数
*/"
public class MyIO {
//head.mp4 为102M 的视频
public static void main(String[] args) {
// charBuffer();
byteBuffer();
}
"/**
* 测试结论:
* 1、map4 等非文件格式也可以用字符流, 当前字符流的copy速度为 11133
* 2、测试 缓冲区为1024 、2048、10240 差别很小,使用默认的缓冲区即可 。
* 3、关闭流为逆序,可以理解为栈的数据结构先开的后关。
* 4、可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法。
所以这里指关闭了处理流。
*/"
public static void charBuffer() {
BufferedWriter bw = null;
BufferedReader br = null;
try {
br = new BufferedReader( "//构造器可以规定其缓冲大小"
new InputStreamReader( "//构造器 转换流可以规定其编码格式"
new FileInputStream(
new File("F:\\IOTestFile\\head.mp4")
)
, "utf-8")
);
String line = "";
bw = new BufferedWriter(
new OutputStreamWriter( "//构造器 转换流可以规定其编码格式"
new FileOutputStream("F:\\IOTestFile\\copy\\head10240.mp4")
, "utf-8")
);
long begin = System.currentTimeMillis();
while ((line = br.readLine()) != null) {
bw.write(line);
bw.flush();
}
"// 用时毫秒"
System.out.println(System.currentTimeMillis() - begin);// "11133"
bw.close();
br.close();
} catch (Exception e) {
e.printStackTrace();
}
}
"/**
* 测试结果:
* 1、测试字节流的速度与字符流的速度对比 字节流的copy速度为240 (卧槽好快)。
* 2、如果没有缓冲,用head.map测试很慢
* 3、如果非文本文件还是使用节点流吧。因为快的一P啊。
*/"
public static void byteBuffer() {
BufferedInputStream bi=null;
BufferedOutputStream bo =null;
try {
bi = new BufferedInputStream(
new FileInputStream(
new File("F:\\IOTestFile\\head.mp4")
)
);
bo = new BufferedOutputStream( //构造器可指定缓冲区大小
new FileOutputStream (
new File("F:\\IOTestFile\\copy\\head.mp4")
)
);
byte[] buf = new byte[1024];
int len =-1;//-1表示到达末尾
long begin = System.currentTimeMillis();
"/**
* 以下是java API 对read 的介绍:
* 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b中,
以整数形式返回实际读取的字节数。
* 在输入数据可用、检测到文件末尾或者抛出异常前,此方法一直阻塞。
* */"
while((len=bi.read(buf))!=-1) {
"/**API write介绍:将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此缓冲的输出流 */"
bo.write(buf,0,len);
}
"// 用时毫秒"
System.out.println(System.currentTimeMillis() - begin); //240
bo.close();
bi.close();
} catch (Exception e) {
e.printStackTrace();
}
}
网友评论