信不信由你,这项测试无法通过我的测验。这是我第一次使用SequenceInputStream,我想测试其功能。通过此测试,似乎completeIs仅从is2流式传输内容。为了使测试通过,必须将is2&is1连接起来。
public void testCombineInputStreams() throws IOException {
StringBuffer strBuffer = new StringBuffer();
List<InputStream> isList = new ArrayList();
String charSet = "UTF-8";
String str2 = "world!";
strBuffer.append(str2);
InputStream is2 = new ByteArrayInputStream(str2.getBytes(charSet));
isList.add(is2);
String str1 = "hello";
strBuffer.append(str1);
InputStream is1 = new ByteArrayInputStream(str1.getBytes(charSet));
isList.add(is1);
SequenceInputStream completeIs = new SequenceInputStream(new Vector(isList).elements());
String completeStr = strBuffer.toString();
int expectedNumBytesRead = completeStr.getBytes(charSet).length;
byte[] readStr = new byte[expectedNumBytesRead];
assertEquals(expectedNumBytesRead, completeIs.available());
completeIs.read(readStr, 0, expectedNumBytesRead);
assertEquals(completeStr, new String(readStr, charSet));
}
在这里我想念什么吗?
答案 0 :(得分:2)
第一件事:将List
转换为Enumeration
的方式很糟糕(它将整个列表复制到一个新数组中,然后将其包装在Vector
中。)< / p>
最好使用
SequenceInputStream completeIs = new SequenceInputStream(Collections.enumeration(isList));
将Iterator
包裹在Enumeration
中。
问题:
您希望completeIs.available()
返回所有封闭的InputStream
中可用字节的总数。
但是,根据JavaDoc:
[返回]从当前基础输入流中读取(或跳过)的字节数的估计值 [..]
您希望completeIs.read(readStr, 0, expectedNumBytesRead)
从所有封闭的InputStream
中读取所有字节。
但是,根据JavaDoc:
SequenceInputStream的读取方法尝试从当前子流读取数据。如果无法读取任何字符(因为子流已到达流的末尾,它将调用当前子流的close方法,并且)从下一个子流开始读取。 >
要从InputStream
(无论是SequenceInputStream
还是其他变体)中完全读取数据,您始终需要循环读取,直到{{1} }方法返回read()