【问题标题】:Does a Buffered ObjectInputStream exist?缓冲的 ObjectInputStream 是否存在?
【发布时间】:2011-03-22 20:53:59
【问题描述】:

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

【问题讨论】:

    标签: java performance serialization buffer


    【解决方案1】:

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

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

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

    【讨论】:

    • ObjectInputStream 至少在部分时间使用 1k 缓冲区,所以这个建议不会像这里建议的那样有戏剧性的效果。
    • @EJP 这个解决方案是否足够有效地读取对象以及BufferedReader 中的readLine() 方法之类的行?
    【解决方案2】:

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

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

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

    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

    【讨论】:

    • file 声明行之后可能需要一个try {,以及一个} finally { file.close(); } 而不是in.close();
    • 这段代码肯定不会编译,因为在finally 块中,file 没有被声明。
    • @uckelman 现在代码应该可以编译了。早些时候我已经输入了参考代码,但没有测试/编译相同。
    • 上述链接已失效,但参考了《Java Platform Performance: Strategies and Tactics》一书。
    猜你喜欢
    • 1970-01-01
    • 2011-02-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-17
    • 2021-03-31
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    相关资源
    最近更新 更多