13

我有一个大(12GB)文件,我需要使用 Java 从中提取小块数据(每个几千字节)。打开文件后,查找和读取数据非常快,但打开文件本身需要很长时间- 大约 90 秒。有没有办法加快Java中的打开文件操作?

为了澄清,我尝试了以下选项来打开和读取文件:

new FileInputStream(file); 
new RandomAccessFile(file, "r");
Files.newByteChannel(path, StandardOpenOption.READ);

这些中的每一个都产生了相似的结果。

4

2 回答 2

10

来自评论:具体来说,问题是Java的打开文件操作触发了运行病毒扫描的OS操作,解决方法是将Java添加到受信任进程列表中

于 2012-12-10T15:47:49.857 回答
1

您遇到的问题主要是由您使用的 JNI 引起的。

当您的代码在 FileInputSream(String) 的构造函数期间等待时。即验证传递路径的存在并调用方法private native void open(String)

然后FileInputSream#open(String)的 openJDK 实现如下所示:

    JNIEXPORT void JNICALL
    Java_java_io_FileInputStream_open(JNIEnv *env, jobject this, jstring path) {
        fileOpen(env, this, path, fis_fd, O_RDONLY);
    }

这将我们移动到io_util_md.c和方法

jlong winFileHandleOpen(JNIEnv *env, jstring path, int flags)

您可以在那里分析代码。


此时,您有多种选择。

  • 检查不同的JDK
  • 编写 C 代码,创建 onw JNI 方法。
  • 检查不同的文件系统。
于 2012-12-10T12:13:45.593 回答