FileOutputStream.write() 方法一共有三种使用方式,其运行效率是 write(byte[]) 效率 > write()
import java.io.*;
public class IOtest {
public void test(String path){
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(path);
fileOutputStream = new FileOutputStream("e:\\copy1.jpg", true);
//byte[] bytes = new byte[256];
int i;
while ((i = fileInputStream.read())!= -1){
fileOutputStream.write(i);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileInputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void test2(String path){
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(path);
fileOutputStream = new FileOutputStream("e:\\copy2.jpg", true);
byte[] bytes = new byte[256];
int i;
while ((i = fileInputStream.read(bytes))> 0){
fileOutputStream.write(bytes);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileInputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void test3(String path){
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(path);
fileOutputStream = new FileOutputStream("e:\\copy2.jpg", true);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
//byte[] bytes = new byte[256];
int i;
while ((i = fileInputStream.read()) != -1){
bufferedOutputStream.write(i);
bufferedOutputStream.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileInputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
IOtest iOtest = new IOtest();
long starttime = System.currentTimeMillis();
iOtest.test("d:\\compress.jpg");
long endtime = System.currentTimeMillis();
long time = endtime -starttime;
System.out.println("fileoutputstream写入共耗时:" + time);
long starttime1 = System.currentTimeMillis();
iOtest.test2("d:\\compress1.jpg");
long endtime1 = System.currentTimeMillis();
long time1 = endtime1 -starttime1;
System.out.println("buffered写入共耗时:" + time1);
}
}
copy 文件的时候,采用 byte[] 读入跟写入时间比较:
fileoutputstream 写入共耗时:7919
buffered 写入共耗时:41
可以看到 buffered 的耗时是 fileoutputstream 耗时的千分之五,这个效率提升是非常明显了。
有人认为 bufferedOutputStream 包装下 outputStream 不是性能更好,真的是这样吗?我们更改下原来的代码:
import java.io.*;
public class IOtest {
public void test(String path){
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(path);
fileOutputStream = new FileOutputStream("e:\\copy1.jpg", true);
//byte[] bytes = new byte[256];
int i;
while ((i = fileInputStream.read())!= -1){
fileOutputStream.write(i);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileInputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void test2(String path){
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(path);
fileOutputStream = new FileOutputStream("e:\\copy2.jpg", true);
byte[] bytes = new byte[256];
int i;
while ((i = fileInputStream.read(bytes))> 0){
fileOutputStream.write(bytes);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileInputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public void test3(String path){
FileInputStream fileInputStream = null;
FileOutputStream fileOutputStream = null;
try {
fileInputStream = new FileInputStream(path);
fileOutputStream = new FileOutputStream("e:\\copy3.jpg", true);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
byte[] bytes = new byte[256];
int i;
while ((i = fileInputStream.read(bytes)) > 0){
bufferedOutputStream.write(bytes);
bufferedOutputStream.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fileInputStream.close();
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
IOtest iOtest = new IOtest();
long starttime = System.currentTimeMillis();
iOtest.test("d:\\compress.jpg");
long endtime = System.currentTimeMillis();
long time = endtime -starttime;
System.out.println("fileoutputstream写入共耗时:" + time);
long starttime1 = System.currentTimeMillis();
iOtest.test2("d:\\compress1.jpg");
long endtime1 = System.currentTimeMillis();
long time1 = endtime1 -starttime1;
System.out.println("buffered写入共耗时:" + time1);
long starttime2 = System.currentTimeMillis();
iOtest.test3("d:\\compress2.jpg");
long endtime2 = System.currentTimeMillis();
long time2 = endtime2 -starttime2;
System.out.println("bufferedOutputStream写入共耗时:" + time2);
}
}
结果如下:
fileoutputstream 写入共耗时:7742
buffered 写入共耗时:41
bufferedOutputStream 写入共耗时:57
bufferedOutputStream 的耗时跟 buffered 的使用方法几乎一样
所以我们平时在使用 fileoutputStream 流时记得使用 buffer 的方式进行读入和写出,这种效率较高,并不一定要使用 bufferedOutputStream