Java:InputStream读取大文件太慢了

pfl*_*flz 13 java java-native-interface inputstream large-files

我必须按字符读取53 MB的文件.当我使用ifstream在C++中完成它时,它在几毫秒内完成,但使用Java InputStream需要几分钟.Java很慢或者我错过了什么是正常的吗?

另外,我需要用Java完成程序(它使用servlet,我必须从中调用处理这些字符的函数).我想也许用C或C++编写文件处理部分,然后用Java Native Interface将这些函数与我的Java程序连接......这个想法怎么样?

任何人都可以给我任何其他提示......我真的需要更快地阅读文件.我尝试使用缓冲输入,但它仍然没有提供甚至接近C++的性能.

编辑:我的代码跨越几个文件,它非常脏,所以我给出了概要

import java.io.*;

public class tmp {
    public static void main(String args[]) {
        try{
        InputStream file = new BufferedInputStream(new FileInputStream("1.2.fasta"));
        char ch;        
        while(file.available()!=0) {
            ch = (char)file.read();
                    /* Do processing */
            }
        System.out.println("DONE");
        file.close();
        }catch(Exception e){}
    }
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*nik 14

我用183 MB文件运行此代码.它印有"Elapsed 250 ms".

final InputStream in = new BufferedInputStream(new FileInputStream("file.txt"));
final long start = System.currentTimeMillis();
int cnt = 0;
final byte[] buf = new byte[1000];
while (in.read(buf) != -1) cnt++;
in.close();
System.out.println("Elapsed " + (System.currentTimeMillis() - start) + " ms");
Run Code Online (Sandbox Code Playgroud)

  • @MarkoTopolnik除了调用InputStream.available()5300万次,即5300万次冗余系统调用之外,没有任何证据证明Java正在"陷入困境".当他使用BufferedInputStream时,实际读取文件的系统调用数是53/8.192亿,因此调用available()是一个巨大的开销. (3认同)
  • @EJP好的,所以我们可能会谈论OS X上的糟糕实现.在我读完你的结果后,我仔细检查了我的.它是真实的. (2认同)