先放一个对比试验,4种不同方式的字节读写方式实现复制图片:
1.利用字节流FileInputStream加每次单个字节复制文件 :共耗时4552毫秒
//利用字节流FileInputStream加单个字节复制文件
import java.io.*;
public class CopyCSDN2 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
File file = new File("C:\\Users\\lsb\\Desktop\\picture.png");
File file1 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
try (InputStream inputStream = new FileInputStream(file); OutputStream outputStream = new FileOutputStream(file1)) {
int len;
while ((len = inputStream.read()) != -1) {//返回收到的实际读取的字节数len
outputStream.write(len);
}
} catch (IOException e) {
System.out.println(e);
}
long end = System.currentTimeMillis();
System.out.println("finish,耗时:" + (end - start) + "毫秒");
}
}
2.利用字节流FileInputStream加字节数组复制文件 :共耗时7毫秒
//利用字节流FileInputStream加字节数组复制文件
import java.io.*;
public class CopyCSDN {
public static void main(String[] args) {
long start = System.currentTimeMillis();
File file = new File("C:\\Users\\lsb\\Desktop\\picture.png");
File file1 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
byte[] buffer = new byte[1024];// 创建1024B的字节数组
try (InputStream inputStream = new FileInputStream(file); OutputStream outputStream = new FileOutputStream(file1)) {
int len;
while ((len = inputStream.read(buffer)) != -1) {//返回收到的实际读取的字节数len
outputStream.write(buffer, 0, len);//buffer中从0开始的len个字节,排除原buffer中的数的影响
}
} catch (IOException e) {
System.out.println(e);
}
long end = System.currentTimeMillis();
System.out.println("finish,耗时:" + (end - start) + "毫秒");
}
}
//使用Bufferedoutputstream 加单个字节复制文件
import java.io.*;
public class CopyCSDN4 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
File file1 = new File("C:\\Users\\lsb\\Desktop\\picture.png");
File file2 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
try (BufferedInputStream bi = new BufferedInputStream(new FileInputStream(file1));
BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(file2));) {
int len;
while ((len = bi.read()) != -1) {
bo.write(len);
}
} catch (IOException e) {
System.out.println(e);
}
long end = System.currentTimeMillis();
System.out.println("finish,耗时:" + (end - start) + "毫秒");
}
}
4.使用BufferedOutputStream 加字节数组复制文件,共耗时:3毫秒
//使用Bufferedoutputstream 加字节数组复制文件
import java.io.*;
public class CopyCSDN3 {
public static void main(String[] args) {
long start = System.currentTimeMillis();
File file1 = new File("C:\\Users\\lsb\\Desktop\\picture.png");
File file2 = new File("C:\\Users\\lsb\\Desktop\\picturecopy.png");
try (BufferedInputStream bi = new BufferedInputStream(new FileInputStream(file1));
BufferedOutputStream bo = new BufferedOutputStream(new FileOutputStream(file2));) {
byte[] bytes = new byte[1024];//创建1024B字节数组
int len;
while ((len = bi.read(bytes)) != -1) {
bo.write(bytes, 0, len);
}
} catch (IOException e) {
System.out.println(e);
}
long end = System.currentTimeMillis();
System.out.println("finish,耗时:" + (end - start) + "毫秒");
}
}
实验结果表明:使用BufferedOutputStream 加字节数组复制文件更加高效,性能最差的是FileOutputStream加单个字节复制,耗时最长。其实设置字节数组和使用BufferedOutputStream均是利用较大的字节数组对需要读取或写入的数据进行缓存,同时使用两者相当于使用双重缓存,更加高效。