本人有一万多个txt文件放在一个文件夹里面,平均每个文件大小为2M左右。现在写了个循环一次读取所有文件并处理,出现的现象是开始几十个甚至几百个文件读取很快,但是后面的文件平均1秒才能读一个。请问是什么问题?为什么前快后慢?是文件的索引相关问题还是读取时的缓存方面有问题?查找了一些资料,对于java缓存方面的原理还不是很理解,请大家帮忙解答一下,谢谢

解决方案 »

  1.   

    文件流有关闭吗,建议把这么多文件先合并成大文件再进行读取。
    如果是txt文件,可以直接用shell脚本的cat进行合并#!/bin/sh
    #Folder_A文件所在目录
    Folder_A="/home/source"  
    target="/home/target.txt"
    for file_a in ${Folder_A}/*; do
        temp_file=`basename $file_a`  
        echo $temp_file 
        targetFile="$Folder_A/$temp_file"
    echo $targetFile
    cat $targetFile >> $target
    done
      

  2.   

    可以尝试使用nio包下面的类进行处理:
    Charset charset = Charset.forName("UTF-8");
    try(DirectoryStream<Path> entries = Files.newDirectoryStream(new File("").toPath())){
    for(Path entry : entries){
    //Files.readAllLines(entry, charset);
    }
    }
    java核心技术卷二(第九版)流与文件 第一章有一段介绍:旧的File类有一个方法,可以用来获取由一个目录中的所有文件构成的数组,但是当目录中包含大量文件时,这个方法的性能会非常低。
      

  3.   

    是linux系统还是windows系统,最好你的代码也能贴一下。合并可以减少读写,但是我的需求不能合并,请问您知道后面越来越慢是什么原因么?