Java I/O - 重复使用InputStream对象

8
有没有办法通过更改其内容来重用inputStream?(不使用new语句)。
例如,我已经非常接近我的要求,但还不够。

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

但是,我希望使用相同的inputStream执行相同的操作(我不关心InputStream的哪种实现)。

我考虑了mark() / reset() API,但仍然需要更改要读取的内容。

避免创建新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){//
    }

向量!我们已经进入了21世纪! - user5547025
1
考虑使用 ArrayList 而不是 Vector,你将在性能上获得胜利。 - Andrew Tobilko
@AndrewTobilko 你确定吗?https://en.wikipedia.org/wiki/Java_performance#Escape_analysis_and_lock_coarsening 特别引用了 Java 6+ 中 Vector 不会锁定除非必要的例子。当然,这依赖于逃逸分析检测到不需要锁定;使用 ArrayList 意味着永远不会进行锁定(除非显式执行),因此您可以更好地控制性能。 - Andy Turner
我改成了List,这样大家都更开心了...但这不是我的问题的重点。这只是一个示例代码,为了解释我的观点... - fabriziomieli
1
@DisplayName 向量太20世纪了。;) - Peter Lawrey
2个回答

7

1
你可以创建自己的实现(子类)InputStream,以允许你所需的内容。我怀疑这方面已经有现成的实现。
但是,我非常怀疑你会从中获得任何可衡量的性能提升,因为在例如FileInputStream中,你仍需要执行大部分逻辑,并且Java已经针对短生命周期对象进行了优化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接