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