首页 > 编程语言 >java如何高效地读取一个超大文件?(四种方式分析对比)

java如何高效地读取一个超大文件?(四种方式分析对比)

时间:2022-11-29 15:00:32浏览次数:46  
标签:java 读取 方式 超大 inputStream new sc path

读取大文件的四种方式

本地压缩了一个文件夹,大概500M左右。虽然不是很大但是,相对还可以。

方法1:Guava读取

String path = "G:\\java书籍及工具.zip";
Files.readLines(new File(path), Charsets.UTF_8);

使用guava读取比较简单,一行代码就搞定了。

下面去jdk的bin目录找到javaVisualVM工具,然后双击运行即可。

时间消耗:20秒

堆内存:最高2.5G

CPU消耗:最高50%

 

方式2:Apache Commons IO普通方式

String path = "G:\\java书籍及工具.zip";
FileUtils.readLines(new File(path), Charsets.UTF_8);

这种方式也比较简单,同样是一行代码。下面运行,也分析一波:

时间消耗:17秒

CPU消耗:最高50%,平稳运行25%左右

这种方式和上面那种基本上消耗差不多

 

方式3:java文件流

FileInputStream inputStream = null;
Scanner sc = null;
try {
    inputStream = new FileInputStream(path);
    sc = new Scanner(inputStream, "UTF-8");
    while (sc.hasNextLine()) {
        String line = sc.nextLine();
        //System.out.println(line);
    }
    if (sc.ioException() != null) {
        throw sc.ioException();
    }
} finally {
    if (inputStream != null) {
        inputStream.close();
    }
    if (sc != null) {
        sc.close();
    }
}

这种方式其实就是java中最常见的方式,然后我们运行分析一波:

时间消耗:32秒,增加了一倍

堆内存:最高1G,少了一半

CPU消耗:平稳运行25%左右

这种方式确实很优秀,但是时间上开销更大。

 

方式4:Apache Commons IO流

LineIterator it = FileUtils.lineIterator(new File(path), "UTF-8");
try {
    while (it.hasNext()) {
        String line = it.nextLine();
    }
} finally {
    LineIterator.closeQuietly(it);
}

这种方式代码看起来比较简单,所以直接运行一波吧:

时间消耗:16秒,最低

堆内存:最高650M,少了一半

 

通过分析对比,发现,Apache Commons IO流是最高效的一种方式。

标签:java,读取,方式,超大,inputStream,new,sc,path
From: https://www.cnblogs.com/mask-xiexie/p/16935372.html

相关文章

  • java基础多线程之共享数据
    java基础巩固笔记5-多线程之共享数据线程范围内共享数据ThreadLocal类多线程访问共享数据几种方式本文主要总结线程共享数据的相关知识,主要......
  • Java 注解和反射(六)获取泛型,注解信息
    反射操作泛型**Java采用泛型擦出的机制来引入泛型,Java中的泛型仅仅是给编译器javac使用的,确保数据的安全性和免除强制类型转换问题,但是,一旦编译完成,所有和泛型有关的类......
  • JAVA面试题--Dubbo
    Dubbo1.Dubbo是什么?2.为什么要用Dubbo?3.Dubbo和Dubbox有什么区别?4.dubbo都支持什么协议,推荐用哪种?5.Dubbo需要Web容器吗?6.Dubbo内置了哪几种服务容器?7.Dubbo......
  • JAVA面试题--Java高并发
    Java高并发1.什么是进程2.什么是线程3.进程间如何通讯4.线程间如何通讯5.同步和异步有何不同,在什么情况下分别使用它们?举例说明6.进程调度算法7.Java中Unsafe类详......
  • Java加载js
    Android 中可以通过webview来实现和js的交互,在程序中调用js代码,只需要将webview控件的支持js的属性设置为trueAndroid(Java)与JavaScript(HTML)交互有四种情况:1)Android(Java)调......
  • 用 Java 对 hbase 进行CRUD增删改查操作
    本文以HBase0.90.2为例,介绍如何在Windows系统,EclipseIDE集成环境下,使用Java语言,进行HBase客户端编程,包含建立表、删除表、插入记录、删除记录、各种方式下的查询操作等。......
  • JAVA面试题--Java基础
    Java基础1.说下面向对象四大特性2.Java语言有哪些特点3.什么是Java程序的主类?应用程序和小程序的主类有何不同?4.访问修饰符public,private,protected,以及不写(默认)时......
  • JAVA格式化数字字符串,如手机号,银行卡号的格式化
     格式化手机号码为335Stringmobile="13123456789";Stringregex="(\\d{3})(\\d{3})(\\d{5})";StringformatedMobile=mobile.replaceAll(regex,"$1$2$3")......
  • JAVA面试题--Java虚拟机
    Java虚拟机1.说一下JVM的内存结构?2.栈帧里面包含哪些东西?3.程序计数器有什么作用?4.字符串常量存放在哪个区域?5.你熟悉哪些垃圾收集算法?6.Java里有哪些引用类型?7.JV......
  • JAVA面试题--Java集合
    Java集合1.常见的集合有哪些?2.常见的集合底层实现3.HashMap与HashTable的区别?4.ConcurrentHashMap和Hashtable的区别?5.ConcurrentHashMap实现原理6.ArrayList和Ve......