Java 是否存在缓冲ObjectInputStream?

Java 是否存在缓冲ObjectInputStream?,java,performance,serialization,buffer,Java,Performance,Serialization,Buffer,我正在从一个大小为350KB的文件中反序列化一个对象,这需要相当长的时间。我的计算机科学助教告诉我,有一种方法可以将缓冲读取器与ObjectInputStream一起使用,从而大大提高性能。然而,我在谷歌上找不到任何关于这方面的信息。您使用装饰来缓冲输入流。像这样 InputStream in = ...; // your underlying stream (e.g. FileInputStream) ObjectInputStream oin = new ObjectInputS

我正在从一个大小为350KB的文件中反序列化一个对象,这需要相当长的时间。我的计算机科学助教告诉我,有一种方法可以将缓冲读取器与ObjectInputStream一起使用,从而大大提高性能。然而,我在谷歌上找不到任何关于这方面的信息。

您使用装饰来缓冲输入流。像这样

   InputStream in = ...; // your underlying stream (e.g. FileInputStream)
   ObjectInputStream oin = new ObjectInputStream(new BufferedInputStream(in));
这将确保对ObjectInputStream的每次调用都不会调用中的基本流,例如操作系统的文件读取系统调用。相反,每个调用都会进入缓冲输入流,缓冲输入流获取和缓存数据块(默认情况下为8K),并从中读取数据。这会更快,因为在java中,从流读取现在是一个本地方法调用,并且系统调用的方法调用开销不太常见。缓存一致性和JIT优化在提高性能方面也发挥了作用。

不,但您可以使用 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();
   }
}
签出以下链接:


可能需要在
文件
声明行之后使用
try{
,最后使用
}{file.close();}
而不是.close()中的
。此代码肯定不会编译,因为在
finally
块中,
文件
没有声明。@uckelman现在代码应该编译了。早些时候,我输入了ref代码,但没有测试/编译相同的代码。上述链接不再处于活动状态,但它引用了《Java平台性能:策略和战术》一书。
ObjectInputStream
至少有一部分时间使用1k缓冲区,所以这个建议不会像这里建议的那样产生戏剧性的效果。@EJP这个解决方案对于读取对象以及
BufferedReader
中的
readLine()
方法这样的行是否足够有效?