zoukankan      html  css  js  c++  java
  • Java解决大文件读取的内存问题以及文件流的比较

    Java解决大文件读取的内存问题以及文件流的比较

    传统方式

    读取文件的方式一般是是从内存中读取,官方提供了几种方式,如BufferedReader, 以及InputStream 系列的,也有封装好的如Guava和Apache commons IO提供了如下快速读取文件的方式

    Files.readLines(new File(path), Charsets.UTF_8); 
    FileUtils.readLines(new File(path));
    

    其实现上都是利用了BufferedReader或者其子类LineNumberReader来读取的,另外Scanner是扫描的方式,其效率是很慢的。另外存在的问题有,如果是大文件,一次性内存里面存放不了,而且也不需要一次性需要用到文件的所有数据。

    迭代读取方式

    我们一般需要的场景是,读取一行数据到内存中,然后单独进行处理,处理完将其扔掉,不需要将其全部放入内存中,这种方式很像迭代器,Scanner 可以处理类似的情景,只需要一行一行地读取,, 其优势是可以按特定格式读取数据,处理起来方便,但是它很慢。

    inputStream = new FileInputStream(path); 
     sc = new Scanner(inputStream, UTF-8); 
     while (sc.hasNextLine()) {
      String line = sc.nextLine(); 
      // System.out.println(line); 
      } 
    

    另外一种方式是利用Apache Commons IO 流,其有个工具类FileUtils,处理格式上不如Scanner,但是效率和BufferedReader差不多,一般很推荐这一种。

    LineIterator it = FileUtils.lineIterator(file, UTF-8); 
    try {
     while (it.hasNext()) {
     String line = it.nextLine(); 
     // do something with line 
      } 
    } finally {
     LineIterator.closeQuietly(it);
    }
    

    参考

    https://www.breakyizhan.com/java/4018.html
    https://www.jianshu.com/p/7a81f603fe1d
    https://www.cnblogs.com/lovebread/archive/2009/11/23/1609122.html

  • 相关阅读:
    Android Intent Flag的介绍
    获得SD卡的剩余容量
    横竖屏判断
    自定义View
    按键事件
    android程序完全退出步骤
    环境变量的配置和虚拟机安装apk文件
    GridView网格布局
    去掉系统title
    获取手机的序列号
  • 原文地址:https://www.cnblogs.com/hulichao/p/java_io.html
Copyright © 2011-2022 走看看