任何方法来提高文件读取性能,都比缓冲读取器更好

任何方法来提高文件读取性能,都比缓冲读取器更好,第1张

任何方法来提高文件读取性能,都比缓冲读取器更好

由于OP渴望了解如何使用NIO来完成此 *** 作。

由于文件很小,很难看到差异,但是可以测量。

public static void main(String... args) throws IOException {    PrintWriter pw = new PrintWriter("abc.log");    for (int i = 0; i < 100 * 1000; i++) {        pw.println("0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789");    }    pw.close();    long start2 = System.nanoTime();    int count2 = 0;    BufferedReader br = new BufferedReader(new FileReader("abc.log"));    while (br.readLine() != null) count2++;    br.close();    long time2 = System.nanoTime() - start2;    System.out.printf("IO: Took %,d ms to read %,d lines%n", time2 / 1000 / 1000, count2);    long start = System.nanoTime();    FileChannel fc = new FileInputStream("abc.log").getChannel();    ByteBuffer bb = ByteBuffer.allocateDirect((int) fc.size());    fc.read(bb);    fc.close();    bb.flip();    CharBuffer cb = ByteBuffer.allocateDirect(bb.remaining() * 2).order(ByteOrder.nativeOrder()).asCharBuffer();    CharsetDeprer cd = Charset.forName("UTF-8").newDeprer();    cd.depre(bb, cb, true);    cb.flip();    StringBuilder sb = new StringBuilder();    int count = 0;    while (cb.remaining() > 0) {        char ch = cb.get();        if (isEndOfLine(cb, ch)) { // process sb count++; sb.setLength(0);        } else { sb.append(ch);        }    }    long time = System.nanoTime() - start;    System.out.printf("NIO as UTF-8: Took %,d ms to read %,d lines%n", time / 1000 / 1000, count);    long start3 = System.nanoTime();    FileChannel fc2 = new FileInputStream("abc.log").getChannel();    MappedByteBuffer bb2 = fc2.map(FileChannel.MapMode.READ_ONLY, 0, fc2.size());    bb.flip();    StringBuilder sb3 = new StringBuilder();    int count3 = 0;    while (bb2.remaining() > 0) {        char ch = (char) bb2.get();        if (isEndOfLine(bb2, ch)) { // process sb count3++; sb3.setLength(0);        } else { sb3.append(ch);        }    }    fc2.close();    long time3 = System.nanoTime() - start3;    System.out.printf("NIO as ISO-8859-1: Took %,d ms to read %,d lines%n", time3 / 1000 / 1000, count3);}private static boolean isEndOfLine(CharBuffer cb, char ch) {    if (ch == 'r') {        if (cb.remaining() >= 1 && cb.get() == 'n') { return true;        }        cb.position(cb.position() - 1);        return true;    } else if (ch == 'n') {        return true;    }    return false;}private static boolean isEndOfLine(ByteBuffer bb, char ch) {    if (ch == 'r') {        if (bb.remaining() >= 1 && bb.get() == 'n') { return true;        }        bb.position(bb.position() - 1);        return true;    } else if (ch == 'n') {        return true;    }    return false;}

打印每一行的长度为102字节,因此文件约为10 MB。

IO: Took 112 ms to read 100,000 linesNIO as UTF-8: Took 207 ms to read 100,000 linesNIO as ISO-8859-1: Took 87 ms to read 100,000 lines

如前所述,使用NIO节省35毫秒的额外复杂性不太值得。

顺便说一句:如果您有硬盘驱动器,并且文件不在内存中,则仅驱动器的速度至关重要。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5587357.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-15
下一篇 2022-12-15

发表评论

登录后才能评论

评论列表(0条)

保存