该楼层疑似违规已被系统折叠 隐藏此楼查看此楼
在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。
程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。
Java中流分两种
字节流
InputStream、OutputStream,常用子类有FileInputStream、FileOutputStream,BufferedOutputStream
字符流
Write、Reader,常用子类有FileWirter、FileReader跟BufferedReader、BufferedWriter等
--------------------------------------------------------------------------------------------------------
不同写法,应用不同的场景,同时会产生不同的效率问题,到底哪种情况,我们改用哪种写法呢?
今天我们来测试一下一个文件5种写法的效率问题:
/**
*
* ClassName: FileTest
* @Description: TODO
* @author chencl
* @date 2017-10-16
*/
public class FileTest {
static FileOutputStream out = null;
static BufferedOutputStream Buff=null;
static int count=1000;//写文件行数
static FileWriter fw = null;
static BufferedWriter bfw=null;
static DataOutputStream dos = null;
public FileTest() {
}
/**
*
* @Description: TODO 基于字节流的封装类fileOutputStream
* @param
* @return void
* @throws
* @author chencl
* @date 2017-10-16
*/
public static void testWriteByFileOut(){
try{
out = new FileOutputStream(new File("d://test1.txt"));
long begin1 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
out.write("测试java 文件操作\r\n".getBytes());
}
out.close();
long end1 = System.currentTimeMillis();
System.out.println("FileOutputStream执行耗时:" + (end1 - begin1) + " 豪秒");
}catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
/**
*
* @Description: TODO 还是基于字节流的封装类fileOutputStream,增加 buffer缓冲区
* 每写一次数据,磁盘就有一个写操作,性能很差如果加了缓冲,那么会等到缓冲满了以后才会有写操作,效率和性能都有很大提高
* @param
* @return void
* @throws
* @author chencl
* @date 2017-10-16
*/
public static void testWriteByBufferFileOut(){
try {
out = new FileOutputStream(new File("d://test2.txt"));
Buff=new BufferedOutputStream(out);
long begin2 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
Buff.write("测试java 文件操作\r\n".getBytes());
}
Buff.flush();
out.close();
Buff.close();
long end2 = System.currentTimeMillis();
System.out.println("BufferedOutputStream执行耗时:" + (end2 - begin2) + " 豪秒");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*
* @Description: TODO 基于字符流的封装类fileWriter
*
* @param
* @return void
* @throws
* @author chencl
* @date 2017-10-16
*/
public static void testWriteByFileWrite(){
try {
fw = new FileWriter("d://test3.txt");
long begin3 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
fw.write("测试java 文件操作\r\n");
}
fw.close();
long end3 = System.currentTimeMillis();
System.out.println("FileWriter执行耗时:" + (end3 - begin3) + " 豪秒");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*
* @Description: TODO 基于字符流的封装类fileWriter,增加缓冲区bufferedWriter,
* 每写一次数据,磁盘就有一个写操作,性能很差如果加了缓冲,那么会等到缓冲满了以后才会有写操作,效率和性能都有很大提高
* @param
* @return void
* @throws
* @author chencl
* @date 2017-10-16
*/
public static void testWriteByBufferedFileWrite(){
try {
fw = new FileWriter("d://test4.txt");
bfw=new BufferedWriter(fw);
long begin3 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
bfw.write("测试java 文件操作\r\n");
}
bfw.flush();
fw.close();
bfw.close();
long end3 = System.currentTimeMillis();
System.out.println("FileWriter执行耗时:" + (end3 - begin3) + " 豪秒");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/**
*
* @Description: TODO 将java基本数据类型写入数据输出流中。并可以通过数据输入流DataInputStream将数据读入。
* 核心意义在于,使数据流操作有了java的基本数据类型。
* @param
* @return void
* @throws
* @author chencl
* @date 2017-10-16
*/
public static void testWriteByDataOut(){
try {
out = new FileOutputStream(new File("d://add5.txt"));
dos = new DataOutputStream(out);
long begin4 = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
dos.write("测试java 文件操作\r\n".getBytes());
}
out.close();
dos.close();
long end4 = System.currentTimeMillis();
System.out.println("DataOutputStream执行耗时:" + (end4 - begin4) + " 豪秒");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// 相同的文件的四种不同方式写文件,看看效率.
public static void main(String[] args) {
testWriteByFileOut();
testWriteByBufferFileOut();
testWriteByFileWrite();
testWriteByBufferedFileWrite();
testWriteByDataOut();
}
if count=1000;
FileOutputStream执行耗时:15 豪秒
BufferedOutputStream执行耗时:9 豪秒
FileWriter执行耗时:9 豪秒
FileWriterBuffered执行耗时:3 豪秒
DataOutputStream执行耗时:13 豪秒
if count=100000;
FileOutputStream执行耗时:400 豪秒
BufferedOutputStream执行耗时:40 豪秒
FileWriter执行耗时:100 豪秒
FileWriterBuffered执行耗时:29 豪秒
DataOutputStream执行耗时:316 豪秒
结论:
1,但数据文件很小的写入操作,不同写法耗时的差值可以忽略不计
2,当数据文件很大的写入操作,FileWriterBuffered>BufferedOutputStream>FileWriter>DataOutputStream>FileOutputStream
3,对于文本的操作,字符流整体性能和效率比字节流要高出很多,加上buffered缓冲区,性能还会再一步提升。
原理:字节流是由字节组成的,字符流是由字符组成的.Java里字符由两个字节组成,字节流每写一次数据,磁盘就有一个写操作,性能很差,如果加了缓冲,那么会等到缓冲满了以后才会有写操作,效率和性能都有很大提高
适用场景:
字节流主要是处理二进制数据,所以针对图片,网络传输,多数采用字节流。
字符流主要是处理文本数据,所以写文件等文本操作会比较适用
ps:java代码粘贴复制就能运行