Java基础:IO流之字节流缓冲区

字节流缓冲区

字节流的缓冲区与字符流的缓冲区也是大同小异的,本文不做重复叙述,如需了解,请查看 Java基础:IO流之字符流缓冲区

综合练习

使用字节流缓冲区拷贝图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class BufferedCopyPictureFile {
public static void main(String[] args) {
BufferedInputStream bufis;
BufferedOutputStream bufos;
try {
bufis = new BufferedInputStream(new FileInputStream("F:\\demo.jpg"));
bufos = new BufferedOutputStream(new FileOutputStream("F:\\demoCopy.jpg"));

byte[] b = new byte[1024];
int len = 0;
while ((len = bufis.read(b)) != -1) {
bufos.write(b, 0, len);
}
} catch (IOException e) {
throw new RuntimeException("文件拷贝出错");
}
try {
if (bufos != null)
bufos.close();
if (bufis != null)
bufis.close();
} catch (Exception e) {
throw new RuntimeException("文件拷贝出错");
}
}
}

测试基本字节流与缓冲区的效率

既然使用了字节流缓冲区,那么测试一下加缓冲区与不加缓冲区的区别,演示中复制的是同一个文件。

测试类

1
2
3
4
5
6
public static void main(String[] args) throws IOException {
long startTime = System.currentTimeMillis();
//此处调用复制方法。
long endTime = System.currentTimeMillis();
System.out.println("耗时: " + (endTime - startTime) + " 毫秒。");
}

使用基本字节流一次读写一个字节

1
2
3
4
5
6
7
8
9
10
11
12
public static void copy1() throws IOException {
FileInputStream fis = new FileInputStream("F:\\demo.jpg");
FileOutputStream fos = new FileOutputStream("F:\\demoCopy.jpg");

int len = 0;
while ((len = fis.read()) != -1) {
fos.write(len);
}

fos.close();
fis.close();
}

使用基本字节流一次读取一个字节数组

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void copy2() throws IOException {
FileInputStream fis = new FileInputStream("F:\\demo.jpg");
FileOutputStream fos = new FileOutputStream("F:\\demoCopy.jpg");

byte[] b = new byte[1024];
int len = 0;
while ((len = fis.read(b)) != -1) {
fos.write(b, 0, len);
}

fos.close();
fis.close();
}

加上缓冲区一次读取一个字节

1
2
3
4
5
6
7
8
9
10
11
12
public static void copy3() throws IOException{
BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("F:\\demo.jpg"));
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("F:\\demoCopy.jpg"));

int len = 0;
while ((len = bufis.read()) != -1) {
bufos.write(len);
}

bufos.close();
bufis.close();
}

加上缓冲区一次读取一个字节数组

1
2
3
4
5
6
7
8
9
10
11
12
13
public static void copy4() throws IOException {
BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("F:\\demo.jpg"));
BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("F:\\demoCopy.jpg"));

byte[] b = new byte[1024];
int len = 0;
while ((len = bufis.read(b)) != -1) {
bufos.write(b, 0, len);
}

bufos.close();
bufis.close();
}

测试文件大小为 11,720,762 字节。

使用四种复制方法,耗时分别为:38944 毫秒、57毫秒、370毫秒、23毫秒。

虽然测试会受测试环境等很多的因素,但是大致上的时间差距比还是很大的,所以还是可以反应问题的。

坚持原创技术分享,您的支持将鼓励我继续创作!