是否存在缓冲的ObjectInputStream?

时间:2010-07-29 17:16:54

标签: java performance serialization buffer

我正在从一个大小为350KB的文件中反序列化一个对象,并且它需要相当长的时间。我的计算机科学TA告诉我,有一种方法可以使用Buffered阅读器和ObjectInputStream来大大提高性能。但是我在Google上找不到任何相关内容。

2 个答案:

答案 0 :(得分:19)

您使用装饰来缓冲输入流。喜欢这个

   InputStream in = ...; // your underlying stream (e.g. FileInputStream)
   ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in));

这将确保每次调用ObjectInputStream都不会调用基本流in,例如操作系统的文件读取系统调用。相反,每次调用都会转到缓冲的输入流,它会获取并缓存数据块(默认为8K),并从中读取。这更快,因为从流中读取现在是java中的本地方法调用,并且较少遇到系统调用的方法调用开销。缓存一致性和JIT优化也可以在提高性能方面发挥作用。

答案 1 :(得分:2)

不,但你可以使用 ObjectInputStream(InputStream in)构造函数

通过将BufferedInputStream作为参数传递给上面的构造函数来创建缓冲对象的intput流。

以下是从文件中读取序列化对象的示例:

InputStream file = null;
try {
   file = new FileInputStream("Out.test");
   InputStream buffer = new BufferedInputStream(file);
   ObjectInputStream in = new ObjectInputStream(buffer);
   vector = (Vector)in.readObject();
} catch (Exception e) {
   e.printStackTrace();
} finally{
   if(file != null ) {
       file.close();
   }
}

结帐以下链接:

http://java.sun.com/docs/books/performance/1st_edition/html/JPIOPerformance.fm.html