时间—在文件读取方面,JavaIO优于JavaNIO

nbysray5  于 2021-06-27  发布在  Java
关注(0)|答案(1)|浏览(349)

我相信新的 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

zd287kbt

zd287kbt1#

内存Map文件(或 MappedByteBuffer )是javanio的一部分,可以帮助提高性能。
javanio中的非阻塞意味着线程不必等待下一个数据读取。它根本不一定影响完整操作(如读取和处理文件)的性能。

相关问题