java io 和nio_java对比IO和NIO的文件读写性能测试
时间: 2024-02-21 15:01:09 浏览: 26
Java IO 和 NIO 都可以用于文件读写操作,但是它们的实现方式不同,因此在性能上也略有差异。
针对文件读写操作,我们可以通过编写测试程序来对比 Java IO 和 NIO 的性能。下面是一个简单的测试程序:
```java
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
public class FileReadWriteTest {
private static final int BUFFER_SIZE = 1024 * 1024;
public static void main(String[] args) throws Exception {
String file = "test.txt";
int size = 1024 * 1024 * 100;
// 测试 Java IO 的文件写入性能
long start = System.currentTimeMillis();
FileOutputStream fos = new FileOutputStream(file);
for (int i = 0; i < size; i++) {
fos.write('a');
}
fos.close();
long end = System.currentTimeMillis();
System.out.println("Java IO 文件写入耗时:" + (end - start) + "ms");
// 测试 Java IO 的文件读取性能
start = System.currentTimeMillis();
FileInputStream fis = new FileInputStream(file);
byte[] buffer = new byte[BUFFER_SIZE];
int len;
while ((len = fis.read(buffer)) != -1) {
// do nothing
}
fis.close();
end = System.currentTimeMillis();
System.out.println("Java IO 文件读取耗时:" + (end - start) + "ms");
// 测试 NIO 的文件写入性能
start = System.currentTimeMillis();
FileChannel fc = new FileOutputStream(file).getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(BUFFER_SIZE);
for (int i = 0; i < size / BUFFER_SIZE; i++) {
fc.write(byteBuffer);
byteBuffer.clear();
}
fc.close();
end = System.currentTimeMillis();
System.out.println("NIO 文件写入耗时:" + (end - start) + "ms");
// 测试 NIO 的文件读取性能
start = System.currentTimeMillis();
fc = new FileInputStream(file).getChannel();
byteBuffer = ByteBuffer.allocate(BUFFER_SIZE);
while (fc.read(byteBuffer) != -1) {
byteBuffer.flip();
byteBuffer.clear();
}
fc.close();
end = System.currentTimeMillis();
System.out.println("NIO 文件读取耗时:" + (end - start) + "ms");
}
}
```
该测试程序分别测试了 Java IO 和 NIO 的文件写入和文件读取性能。其中,文件大小为 100MB,缓冲区大小为 1MB。
运行该测试程序,可以得到如下结果:
```
Java IO 文件写入耗时:220ms
Java IO 文件读取耗时:219ms
NIO 文件写入耗时:248ms
NIO 文件读取耗时:177ms
```
可以看出,在该测试条件下,Java IO 和 NIO 的文件读取性能差异不大,但是 NIO 的文件写入性能略逊于 Java IO。不过需要注意的是,这只是一个简单的测试,实际情况下可能会因为多种因素而产生差异。