import java.io.*;
import java.io.File;
import java.io.FileFilter;
import java.lang.*;
import java.util.*;
import java.io.BufferedReader;  
import java.io.File;  
import java.io.FileInputStream;  
import java.io.FileReader;  
import java.io.IOException;  
import java.io.InputStream;  
import java.io.InputStreamReader;  
import java.io.RandomAccessFile;  
import java.io.Reader; public class test
{
    public static void main(String[] args) throws Exception
    {
InputStream in = null; 
        long s = System.currentTimeMillis();
try{
byte[] tempbytes = new byte[8192];  
int byteread = 0;  
in = new FileInputStream("test.txt");  
while ((byteread = in.read(tempbytes)) != -1){  
}  
} catch (Exception e1) {  
e1.printStackTrace();  
} finally {  
if (in != null){  
try {  
in.close();  
} catch (IOException e1) {  
}  
}  
}  
        long e = System.currentTimeMillis() - s;
        System.out.println("\nTime spend: " + e + "\t Per: " + (1.0 * e / 1000));
    }
}

解决方案 »

  1.   

    你这种测试未必准确。50M的那个文件,恐怕大半内容早就在操作系统内存里面老老实实蹲着了。所以按如下步骤测试:
    重启整个电脑,不要碰那个50M的文件,然后直接运行你的class测试程序,再看看是否还是1秒?注意,50M的那个文件,必须不能是任何启动程序所已经使用的,必须保证其绝对没有被访问过。
      

  2.   

    我觉得,是内存不够了。 你设置一下-Xmx512m看看,减少内存垃圾回收的次数。
      

  3.   


    这个我测试过N次了,重启机器读是 1.5秒,第二次执行读是1秒然后重启机器,读500M,竟然95秒,我不明白,是不是JVM内存不够?
      

  4.   


    确实有可能,虽然你所编写程序的过程是流式操作,但其实Java层面在进行读取的时候仍然是需要开辟内存空间的。所以结合8楼的建议,你尝试在启动时增加两个JVM参数:
     -Xms1024m -Xmx1024m试试看。
      

  5.   

    谢谢,我还想测试过的,好像不行,我再试试
    我现在就是想把一个大的文本文件,比如2G,以最快的速度加载到缓存,别的什么事也不用做的
    最好不要给任何变量赋值、不管是C,还是JAVA都行
      

  6.   

    2G太大了,全部加载到缓存中,超出了32bit JVM的能力,要用64bit的JVM才行
      

  7.   

    谢谢
    32位JVM加载500M没问题的把?这个不是我要的效果,我希望的是50M 1.5秒,那么500M就是15秒
    C:\>java -Xms1024m -Xmx1024m test耗时: 84.227
      

  8.   

    如果你直接用C来写 64bit 应用的话,应该可以。
    但为什么要把2G全部放内存中??
    另外,我在我的电脑上完全测不出来你的效果,我觉得神了个奇的
    我还特地打开了GC日志(-XX:+PrintGCDetails),想看看有没有内存频繁回收的问题,结果1次GC都没有!这是我程序:    public static void scan(String filename) throws IOException {
            File f = new File(filename);
            FileInputStream fis = new FileInputStream(f);
            try {
                long timer = System.currentTimeMillis();
                byte[] buff = new byte[32 * 1024];
                while (fis.read(buff) >= 0) {
                    // Do nothing
                }
                timer = System.currentTimeMillis() - timer;
                System.out.printf("Readed: %,dKB\t\tSpend: %dms\t\tPerMS: %dKB\n", f.length() / 1024, timer, f.length() / 1024 / timer);
            } finally {
                fis.close();
            }
        }
    我连续测试N个文件,大致如下:
    Readed: 2,804KB Spend: 31ms PerMS: 90KB
    Readed: 51,459KB Spend: 559ms PerMS: 92KB
    Readed: 371,718KB Spend: 5361ms PerMS: 69KB
    Readed: 710,687KB Spend: 12316ms PerMS: 57KB
    Readed: 1,315,954KB Spend: 19811ms PerMS: 66KB
    Readed: 1,773,173KB Spend: 20217ms PerMS: 87KB最后一个文件 1.7G,也就20秒搞完,平均每毫秒读取87KB