【问题标题】:Java I/O - Reuse InputStream ObjectJava I/O - 重用 InputStream 对象
【发布时间】:2016-08-06 01:22:18
【问题描述】:

有没有办法通过改变它的内容来重用一个 inputStream? (没有新的声明)。

例如,我能够非常接近我的要求,但还不够

在下面的代码中,我使用SequenceInputStream,并且每次我向该序列添加一个新的InputStream

但我想通过使用相同的 inputStream 来做同样的事情(我不在乎 InputStream 的哪个实现)。

我想过mark()/reset() APIs,但我仍然需要更改要读取的内容。

避免创建新的InputStream 的想法是因为性能问题

     //Input Streams
    List<InputStream> inputStreams = new ArrayList<InputStream>();
    try{
        //First InputStream
        byte[] input = new byte[]{24,8,102,97};
        inputStreams.add(new ByteArrayInputStream(input));

        Enumeration<InputStream> enu = Collections.enumeration(inputStreams);
        SequenceInputStream is = new SequenceInputStream(enu);

        byte [] out = new byte[input.length];
        is.read(out);

        for (byte b : out){
            System.out.println(b);//Will print 24,8,102,97
        }

        //Second InputStream
        input = new byte[]{ 4,66};
        inputStreams.add(new ByteArrayInputStream(input));
        out = new byte[input.length];
        is.read(out);

        for (byte b : out){
            System.out.println(b);//will print 4,66
        }
        is.close();
    }catch (Exception e){//
    }

【问题讨论】:

  • Vector!我们是在 21 世纪!
  • 考虑ArrayList 而不是Vector,你会在性能上取胜
  • @AndrewTobilko 你确定吗? en.wikipedia.org/wiki/… 专门引用了 Vector 的示例,除非在 Java 6+ 中需要,否则不会锁定。当然,这依赖于检测到锁定是不必要的逃逸分析;使用ArrayList 意味着永远不会进行锁定(除非明确完成),因此您可以更好地控制性能。
  • 我更改为 List 以便每个人都更快乐......但这不是我的问题的重点。这只是一个示例代码,以解释我的观点......
  • @DisplayName Vector 是如此的 20 世纪。 ;)

标签: java inputstream


【解决方案1】:

不,您不能在输入流到达流的末尾后重新开始读取它,因为它是单向的,即仅在一个方向上移动。

但请参考以下链接,它们可能会有所帮助:

How to Cache InputStream for Multiple Use

Getting an InputStream to read more than once, regardless of markSupported()

【讨论】:

    【解决方案2】:

    您可以创建自己的InputStream 实现(子类),这将满足您的要求。我怀疑是否存在此实现。

    我非常怀疑您是否会从中获得任何可衡量的性能提升,例如,没有太多逻辑。 FileInputStream 无论如何您都不需要执行此操作,并且 Java 已针对垃圾收集短期对象进行了很好的优化。

    【讨论】:

      猜你喜欢
      • 2013-05-27
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多