我相信新的 nio
一揽子计划将比旧的更好 io
当涉及到读取文件内容所需的时间时打包。但是,根据我的结果, io
一揽子计划似乎表现出色 nio
包裹。这是我的测试:
import java.io.*;
import java.lang.reflect.Array;
import java.nio.ByteBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;
public class FileTestingOne {
public static void main(String[] args) {
long startTime = System.nanoTime();
File file = new File("hey2.txt");
try {
byte[] a = direct(file);
String s = new String(a);
}
catch (IOException err) {
err.printStackTrace();
}
long endTime = System.nanoTime();
long totalTime = (endTime - startTime);
System.out.println(totalTime);
}
public static ByteBuffer readFile_NIO(File file) throws IOException {
RandomAccessFile rFile = new RandomAccessFile(file.getName(), "rw");
FileChannel inChannel = rFile.getChannel();
ByteBuffer _buffer = ByteBuffer.allocate(1024);
int bytesRead = inChannel.read(_buffer);
while (bytesRead != -1) {
_buffer.flip();
while (_buffer.hasRemaining()) {
byte b = _buffer.get();
}
_buffer.clear();
bytesRead = inChannel.read(_buffer);
}
inChannel.close();
rFile.close();
return _buffer;
}
public static byte[] direct(File file) throws IOException {
byte[] buffer = Files.readAllBytes(file.toPath());
return buffer;
}
public static byte[] readFile_IO(File file) throws IOException {
byte[] _buffer = new byte[(int) file.length()];
InputStream in = null;
try {
in = new FileInputStream(file);
if ( in.read(_buffer) == -1 ) {
throw new IOException(
"EOF reached while reading file. File is probably empty");
}
}
finally {
try {
if (in != null)
in.close();
}
catch (IOException err) {
// TODO Logging
err.printStackTrace();
}
}
return _buffer;
}
}
// Small file
//7566395 -> readFile_NIO
//10790558 -> direct
//707775 -> readFile_IO
// Large file
//9228099 -> readFile_NIO
//737674 -> readFile_IO
//10903324 -> direct
// Very large file
//13700005 -> readFile_NIO
//2837188 -> readFile_IO
//11020507 -> direct
结果如下:
小文件: nio
实施:7566395NS io
实施:707775NS
直接实施:10790558NS
大文件: nio
实现:9228099ns io
实施:737674NS
直接实施:10903324NS
非常大的文件: nio
实施:13700005NS io
实施:2837188NS
直接实施:11020507NS
我想问这个问题是因为(我相信) nio
包是非阻塞的,所以它需要更快,对吗?
谢谢您,
编辑:
已将ms更改为ns
1条答案
按热度按时间zd287kbt1#
内存Map文件(或
MappedByteBuffer
)是javanio的一部分,可以帮助提高性能。javanio中的非阻塞意味着线程不必等待下一个数据读取。它根本不一定影响完整操作(如读取和处理文件)的性能。