复制文件的大小为2.5G,对比一下使用FileOutputStream和BufferedOutputStream的效率
我理解,使用文件流对文件进行读写和复制,和在windows上使用鼠标点击文件复制本质上应该是一样的
使用正常的FileOutputStream复制文件:
private static void transfer() {
long t1 = System.currentTimeMillis();
File file = new File("d:\\CPMS.zip");
FileInputStream fis = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file);
fos = new FileOutputStream(new File("D:\\downloads\\" + file.getName()));
int length = 0;
byte[] b = new byte[1024];
while ((length = fis.read(b)) != -1) {
fos.write(b, 0, length);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
long t2 = System.currentTimeMillis();
System.out.println("复制文件用时:" + (t2 - t1) + " ms");
}
控制台输出
复制文件用时:22115 ms
使用BufferedOutputStream复制文件:
private static void copyFile() {
long t1 = System.currentTimeMillis();
File file = new File("D:\\CPMS.zip");
FileInputStream fis = null;
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
FileOutputStream fos = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
fos = new FileOutputStream(new File("D:\\downloads\\" + file.getName()));
bos = new BufferedOutputStream(fos);
int length = 0;
byte[] b = new byte[1024];
while ((length = fis.read(b)) != -1) {
bos.write(b, 0, length);
}
bos.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
long t2 = System.currentTimeMillis();
System.out.println("复制文件用时:" + (t2 - t1) + " ms");
}
控制台输出
复制文件用时:11974 ms
看上去时间差别挺大的,所以建议还是使用缓冲流来读写文件,提高效率