我需要逐个字符读取一个 53 MB 的文件。使用 C++ 中的 ifstream 完成只需毫秒级别,但使用 Java InputStream 则需要数分钟。Java 真的会这么慢吗?或者我漏掉了什么?
此外,我必须在 Java 中完成该程序(它使用 servlet,我必须调用处理这些字符的函数)。我考虑过先用 C 或 C++ 编写文件处理部分,然后使用 Java Native Interface 将这些函数与我的 Java 程序接口。这个想法怎么样?
还有其他什么提示吗?我真的需要更快地读取文件。我尝试使用缓冲输入,但仍无法达到 C++ 的性能。
编辑:我的代码跨越多个文件,而且非常混乱,所以我提供了摘要。
此外,我必须在 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){}
}
}
BufferedInputStream
?相比BufferedReader
,你应该使用它。你的访问模式是否可以使用java.nio
来内存映射文件的部分内容?具体而言,当你说“逐个字符”时,你是否了解编码以处理那些字节序列可能跨越多个内存映射段的字符? - Mike Samuelfile.available()
。请尝试这样写:while((ch = (char)file.read()) >= 0)
,同时删除ch = (char)file.read();
。这样修改后,你的代码将能够正确读取文件并避免出现错误。 - user845279