日期:2014-05-20  浏览次数:20887 次

有什么办法可以使得BufferReader读得更快一些?谢谢
public class test
{
    public static void main(String[] args) throws Exception
    {
     File infile = new File(args[0]);
    if(infile.exists())
     {
      FileReader fr = new FileReader(infile);
       String str=" ";
      try
        {
         BufferedReader br = new BufferedReader(fr);
        while((str=br.readLine()) != null)
          {
           ;
          }
         br.close();
        }catch (FileNotFoundException e) {System.out.println("file not found");}
      fr.close();
     }
    }
}
这个程序读一个50M的文件开机后第一次执行1.5秒,然后第二次1秒,希望开机首次执行就能达到1秒,有可能吗?

------最佳解决方案--------------------
基本上没有。

第二次只需要1秒,基本上是因为该文件主体已经进入操作系统的磁盘缓存中,所以第二次读取过程就会大大加快。

如果你非想确认下这个过程,可以先用工具创建个 内存盘(RamDisk),将该文件复制到内存盘中,然后再测试你的程序,那么磁盘IO的时间会彻底被消灭掉,只需要消耗点IO通道和CPU时间而已。
------其他解决方案--------------------
50M的文件得多少字符啊,考虑一下把这个文件拆分成多个文件,然后通过配置文件确定这次要读取哪个文件,然后进行读取,这样可以提高读取单个文件的效率,但是第一次读取和第二次读取的差异还是没办法解决
------其他解决方案--------------------
对于你的程序来讲配置 -Xms -Xmx 应该是效果不太明显,因为毕竟你没把太多数据缓存到内存当中
------其他解决方案--------------------
使用FileChannel可以!!!
------其他解决方案--------------------
不过,如果你仅考虑增加文件读取速度的话,其实可以不要用Reader,因为这个还略微带了些 字符转换的CPU开销,直接用FileInputStream,每次按块读取,比如 byte[32*1024]来读取,那么全过程基本只有磁盘IO在消耗时间而已,连字符转换的时间都节省掉了。 
------其他解决方案--------------------
引用:
不过,如果你仅考虑增加文件读取速度的话,其实可以不要用Reader,因为这个还略微带了些 字符转换的CPU开销,直接用FileInputStream,每次按块读取,比如 byte[32*1024]来读取,那么全过程基本只有磁盘IO在消耗时间而已,连字符转换的时间都节省掉了。


谢谢。具体怎么做啊
后续还要判断内容的。
------其他解决方案--------------------
继续问,比如能否通过JVM的配置提升性能?比如 -Xms -Xmx 等 ?
------其他解决方案--------------------
那还有别的办法么?

------其他解决方案--------------------
引用:
使用FileChannel可以!!!

请指导一下,谢谢