java - 读取大型对象文本文件的最快方法

标签 java file-handling

我将 40,000 多个对象存储到一个文本文件中。我的问题 是从文本文件中读取所有对象的速度太慢。 1,000 个对象文本文件甚至需要 4349 毫秒。

这是从文本文件中读取对象。

long startR = System.currentTimeMillis();

try{
    ois = new ObjectInputStream(new FileInputStream(f));
    code_from_file.clear();
    Codes obj = new Codes();

    while( (obj = (Codes) ois.readObject()) != null){   
        if(obj instanceof Codes){
            code_from_file.add(obj);
        }
    }

}catch (EOFException ex){ 

} catch (ClassNotFoundException ex) {
    ex.printStackTrace();
} catch (FileNotFoundException ex) {
    ex.printStackTrace();
} catch (IOException ex) {
    ex.printStackTrace();
} finally{
    try {
        if (ois != null){
            ois.close();
        }
    } catch (IOException ex){
        ex.printStackTrace();
    }
}

long endR = System.currentTimeMillis();
System.out.println("Read code from file : " + (endR - startR) + "ms");  

有没有更快的方法解决这个问题?

最佳答案

一个简单的优化尝试是为您的输入流处理添加缓冲。在您编写它时,每次读取都可能会击中您的磁盘。如果您进行较少的物理读取(在较大的 block 中),您可能会看到性能提升。

int bufferSize = 16 * 1024;
ois = new ObjectInputStream(new BufferedInputStream(new FileInputStream(f), bufferSize));

当通过 ObjectInputStream 读取字节时,它们实际上是从 BufferedInputStream 的缓冲区中读取到内存中的。当此缓冲区变空(已全部读取)时,BufferedInputStream 将在从 FileInputStream 的一次大读取中重新填充缓冲区。

您可以试验不同的缓冲区大小,以确定 I/O 操作数与内存开销之间的适当平衡。

关于java - 读取大型对象文本文件的最快方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33227624/

相关文章:

c++ - 在简单的文件处理程序中获得异常输出

c - 如何使用 fwrite() 函数一次在文件中写入结构成员?

java - 如何在 Liferay 6.0.6 中的 JSF portlet 中上传文件

java - 访问者模式还是多态?

Java - 从Panel1更改为Panel2

linux - 有什么方法可以减少 linux 作业中的 I/O 等待时间?

java - 在 Servlet 中获取真实的客户端 IP

java - 如何在 springMVC Web 应用程序中将对象列表存储到 session 中

c++ - 打印 char 指针数组

python-3.x - 在python中将字符串写入文本文件