当前位置: 代码迷 >> J2SE >> 请问读50m的文件 1秒,读500M的文件要95秒
  详细解决方案

请问读50m的文件 1秒,读500M的文件要95秒

热度:9134   发布时间:2013-02-25 00:00:00.0
请教读50m的文件 1秒,读500M的文件要95秒?
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));
    }
}

------最佳解决方案--------------------------------------------------------
如果你直接用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();
        }
    }