最近在做一个基于JMF的视频聊天软件,视频算是通了,今天准备整下文件传输
以前听说过字节流与字符流的概念,今天意外玩了一下,发现不玩不知道,一玩吓一跳..........
以前用InputStream、OutputStream做过一些关于文件读取复制的小练习,当操作的文件超过3M的时候就明显感到吃力了,当时对这个没什么兴趣,没想过去改进,做完了事。直到今天玩了字符流,才重新燃起好奇心
特别说明:
字符流因为处理的是字符,所以如果文件中包含所用字符集中没有的字符时(典型的是y上面两点的字符),那么复制完后将会得到一个损坏的文件,因此字符流只适用于对文本文件的处理,而对于多媒体文件就不适用。
由于一时找不到大点的文本文件,所以以下测试文件均为多媒体文件,目的只是测试流的性能,特此说明!
FileInputStream/FileOutputStream 和 对应Reader/Writer 性能比较:
字节流与字符流,顾名思义,前者是以字节为基础的,即一个byte,后者是以字符为基础,即两个byte(一个char),就速度来说,理论上后者要比前者快2倍,我们来测试下:
所用测试文件为“E:\KuGou\my all.mp3”,大小为8.47MB
package cn.netjava.test;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class FileCopy {
//原始文件
private File file = new File("E:\\KuGou\\my all.mp3");
//复制品
private File copy = new File("E:\\copy.mp3");
public void startCopy(){
try{
FileInputStream fin = new FileInputStream(file);
FileOutputStream fout = new FileOutputStream(copy);
int i = 0;
//记录下开始时间
long start = System.currentTimeMillis();
while(true){
//采用一读一写模式
i = breader.read();
if(i==-1){
break;
}
bwriter.write(i);
}
//记录下结束时间
long end = System.currentTimeMillis();
//总耗时
long total = end - start;
System.out.println("总耗时: "+total+"ms");
//关闭流
reader.close();
writer.flush();
writer.close();
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String args[]){
FileCopy f = new FileCopy();
f.startCopy();
}
}
运行后结果为“108351ms”,汗...复制一个8M多的音乐文件竟然用了100多秒,改进下
换成InputStreamReader和OutputSrtreamReader
FileInputStream fin = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fin);
FileOutputStream fout = new FileOutputStream(copy);
OutputStreamWriter writer = new OutputStreamWriter(fout);
while(true){
//采用一读一写模式
i = reader.read();
if(i==-1){
break;
}
writer.write(i);
}
再次运行,结果为“3436ms”,耗时由100多秒缩减到不到5秒,这可不是单纯的“2倍”啊
由此再进一步,和BufferedReader/BufferedWriter比较一下
InputStreamReader/OutputStreamWriter 和 BufferedReader/BufferedWriter 性能比较
见识到InputStreamReader的强大后又发现了BufferedReader,Buffer是缓冲的意思,IT中凡是加了“缓冲”的都是优化过的,来测试看看
测试文件为“E:\fairy tail\妖精的尾巴[01].rmvb”,大小为135MB
//原始文件
private File file = new File("E:\\fairy tail\\妖精的尾巴[01].rmvb");
//复制品
private File copy = new File("E:\\copy.rmvb");
测试结果为“48437ms”
接下来换成BufferedReader/BufferedWriter
FileInputStream fin = new FileInputStream(file);
InputStreamReader reader = new InputStreamReader(fin);
BufferedReader breader = new BufferedReader(reader);
FileOutputStream fout = new FileOutputStream(copy);
OutputStreamWriter writer = new OutputStreamWriter(fout);
BufferedWriter bwriter = new BufferedWriter(writer);
while(true){
//采用一读一写模式
i = breader.read();
if(i==-1){
break;
}
bwriter.write(i);
}
运行结果为“19438ms”,带个Buffer果然不一样,速度又快了很多
I/O中还有一些流,我没有一个个玩,有兴趣的去弄弄撒,木哈哈~