【发布时间】: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