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
意味着永远不会执行锁定(除非明确执行),因此您可以更好地控制性能。我改为列表,这样每个人都会更快乐……但这不是我问题的重点。为了解释我的观点,这只是一个示例代码…@DisplayNameVector
是20世纪的产物