Java文件读取方式和效率性能对比

Java文件读取方式和效率性能对比
摘要由CSDN通过智能技术生成

场景描述

  • 文件大小 8.67G的json文件,一共670万行。
  • 服务器内存:2g。(只能读取一定缓冲数据,然后处理后继续读取,不能一次性加载到内存)
  • 读取文件的内容出来,并未做业务处理。
读取方式和性能对比
  • 使用org.pache.commons.io.FileUtils.lineIterator,按行读,耗时:79.10s
  • 使用RandomAccessFile读取文件,耗时【测试缓冲区在40k性能较好】:
    • 缓冲区1k,耗时101.10s
    • 缓冲区10k,耗时28.13s
    • 缓冲区20k,耗时24.08s
    • 缓冲区30k,耗时23.29s
    • 缓冲区40k,耗时23.1s
  • 使用BufferedInputStream读取文件,耗时【测试在缓冲区为40k性能最好】:
    • 缓冲区1k,耗时:75.7s
    • 缓冲区10K,耗时:27.10s
    • 缓冲区20k,耗时:22.19s
    • 缓冲区30k,耗时:21.55s
    • 缓冲区40k,耗时: 20.17s
    • 缓冲区50k,耗时:20.44s
    • 缓冲区60k,耗时:21.24s
    • 缓冲区100k,耗时:27.8s
    • 缓冲区1M,耗时:30s
  • 使用Scanner读文件,FileOutputStream写文件,耗时:206.78s
  • 使用NIO,FileChannel读写文件,耗时【测试在每次读取35-40k性能最好】:
    • NIO每次读取10k,耗时:26.03s (内存大约占用100m)
    • NIO每次读取20k,耗时:22.03s (内存大约占用100m)
    • NIO每次读取30k,耗时:23.03s (内存大约占用100m)
    • NIO每次读取35k,耗时:19.88ss (内存大约占用100m)
    • NIO每次读取40k,耗时:19.75s (内存大约占用100m)
    • NIO每次读取50k,耗时:26.75s (内存大约占用100m)
    • NIO每次读取100k,耗时:21.3s (内存大约占用100m)
    • NIO每次读取0.5M,耗时:23.48s (内存大约占用200-300m)
    • NIO每次读取5M,耗时:28.97s (内存大约占用800-1200m)
    • NIO每次读取10M,耗时:30.06s (内存大约占用800-1200m)
    • NIO每次读取20M,耗时:26.10s (内存大约占用800-1300m)
    • NIO每次读取30M,耗时:40.10s (内存大约占用2000-2600m)

为什么scnner读取效率最慢

  • 基本来说,缓冲区读取比scanner快了至少10倍
  • bufferReader缓冲区大小为8KB,Scanner的缓冲区大小为1Kb.
  • bufferReader知识简单的读取字符序列。而Scanner对输入数据要做正则解析。

代码示例

  • org.pache.commons.io.FileUtils.lineIterator
	    public static void main(String[] args) throws IOException {
   
        String path = "D:\\模拟数据\\1.txt";
        LineIterator it = FileUtils.lineIterator(new File(path), "UTF-8");
        Integer counter = 1;
        long startTime = System.currentTimeMillis();
        while (it.hasNext()) {
   
            System.out.println("_-------------" + counter++);
            String line = it.nextLine();
        }
        long endTime = System.currentTimeMillis();
        System.out.println("耗费时间:" + (endTime-startTime
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 要计算文件的MD5值,Java提供了MessageDigest类,它可以实现高性能的MD5计算。 首先,我们需要使用FileInputStream类读取文件的内容。为了提高性能,我们可以使用BufferedInputStream对FileInputStream进行包装,以减少IO操作的次数。然后,我们可以使用MessageDigest.getInstance("MD5")获取MD5算法实例。 接下来,我们可以通过循环读取文件的块来计算MD5值。可以使用byte数组作为缓冲区,从输入流中读取数据,并将其传递给MessageDigest的update方法。使用update方法可以逐步更新MD5值,而不是一次性处理整个文件。这样可以有效地减少内存消耗,特别是对于大文件。 在读取完整个文件后,我们可以使用digest方法获取最终的MD5值。这个方法会返回一个byte数组,表示计算得到的MD5摘要。我们可以将这个byte数组转换为十六进制字符串,以便更方便地查看和比较。 最后,记得要关闭输入流,释放资源。 通过以上步骤,我们可以使用Java性能地计算文件的MD5值。当然,为了进一步优化性能,可以考虑使用多线程并行计算,以提高计算速度。同时,也可以考虑使用NIO相关的类来进行文件读取,以获得更好的性能。 ### 回答2: 在Java中,计算文件的MD5值可以通过使用Java自带的java.security.MessageDigest类来实现。这个类提供了一种计算消息摘要的功能,其中包括计算MD5值。 要计算文件的MD5值,可以按照以下步骤进行: 1. 使用java.io包中的File类来打开文件,并将文件转换为输入流(InputStream)。 2. 创建一个MessageDigest对象,使用MD5算法初始化。 3. 以字节流的形式读取文件的内容,通过循环将读取的字节更新到MessageDigest对象中。 4. 在读取完整个文件后,使用digest()方法来计算MD5值。 5. 将计算得到的MD5值转换为十六进制字符串表示。 6. 关闭文件的输入流。 使用上述方法可以计算文件的MD5值,但是若要实现高性能的计算过程,可以考虑以下优化措施: 1. 使用缓冲区:在读取文件时,使用缓冲流(BufferedInputStream)来进行读取,可以减少频繁的I/O操作,提高性能。 2. 多线程计算:将文件分成多个部分,使用多线程同时计算各个部分的MD5值,再将计算得到的结果合并。 3. 批量计算:将多个文件的计算任务合并为一个批量计算任务,通过并行处理多个文件的MD5值计算,提高效率。 4. 使用文件系统的并发访问特性:对于多个文件的计算任务,可以将这些文件放在不同的磁盘上,利用磁盘的并发访问特性,在进行文件IO操作时减少等待时间,提高计算速度。 综上所述,通过合理地结合使用缓冲区、多线程计算、批量计算和并发访问等技术手段,可以在Java中高性能地计算文件的MD5值。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值