Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/96.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java I/O-重用InputStream对象_Java_Inputstream - Fatal编程技术网

Java I/O-重用InputStream对象

Java I/O-重用InputStream对象,java,inputstream,Java,Inputstream,是否通过更改输入流的内容来重用输入流?(无新声明)。 例如,我能做一些非常接近我要求的事情,但还不够 在下面的代码中,我使用的是一个SequenceInputStream,每次我向该序列添加一个新的InputStream。 但是我想通过使用相同的inputStream来做同样的事情(我不关心inputStream的哪个实现) 我考虑了mark()/reset()api,但是我仍然需要更改要读取的内容 避免新的InputStream创建的想法是因为性能问题 //Input Streams

是否通过更改输入流的内容来重用输入流?(无新声明)。

例如,我能做一些非常接近我要求的事情,但还不够 在下面的代码中,我使用的是一个
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){//
    }
//输入流
List inputStreams=new ArrayList();
试一试{
//第一输入流
字节[]输入=新字节[]{24,8102,97};
add(newbytearrayinputstream(input));
枚举enu=集合。枚举(inputStreams);
SequenceInputStream is=新SequenceInputStream(enu);
byte[]out=新字节[input.length];
是读出来的;
for(字节b:输出){
System.out.println(b);//将打印24,8102,97
}
//第二输入流
输入=新字节[]{4,66};
add(newbytearrayinputstream(input));
out=新字节[input.length];
是读出来的;
for(字节b:输出){
System.out.println(b);//将打印4,66
}
is.close();
}捕获(例外e){//
}

否,输入流到达流的末尾后,无法重新开始读取,因为它是单向的,即仅单向移动

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


您可以创建自己的
InputStream
实现(子类),以满足您的需要。我怀疑目前是否有这种做法


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

Vector
!我们在21世纪!考虑<代码> AlayList而不是<代码> vector <代码>,您将在performance@AndrewTobilko你确定吗?特别引用了
Vector
不锁定的示例,除非在Java 6+中有必要。当然,这取决于逃逸分析检测到锁定是不必要的;使用
ArrayList
意味着永远不会执行锁定(除非明确执行),因此您可以更好地控制性能。我改为列表,这样每个人都会更快乐……但这不是我问题的重点。为了解释我的观点,这只是一个示例代码…@DisplayName
Vector
是20世纪的产物