SequenceInputStream基本测试失败

时间:2018-11-21 20:52:59

标签: java

信不信由你,这项测试无法通过我的测验。这是我第一次使用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));
}

在这里我想念什么吗?

1 个答案:

答案 0 :(得分:2)

第一件事:将List转换为Enumeration的方式很糟糕(它将整个列表复制到一个新数组中,然后将其包装在Vector中。)< / p>

最好使用

SequenceInputStream completeIs = new SequenceInputStream(Collections.enumeration(isList));

Iterator包裹在Enumeration中。


问题:

  1. 您希望completeIs.available()返回所有封闭的InputStream中可用字节的总数。

    但是,根据JavaDoc

      

    [返回]从当前基础输入流中读取(或跳过)的字节数的估计值 [..]

  2. 您希望completeIs.read(readStr, 0, expectedNumBytesRead)从所有封闭的InputStream中读取所有字节。

    但是,根据JavaDoc

      

    SequenceInputStream的读取方法尝试从当前子流读取数据。如果无法读取任何字符(因为子流已到达流的末尾,它将调用当前子流的close方法,并且)从下一个子流开始读取。 >

要从InputStream(无论是SequenceInputStream还是其他变体)中完全读取数据,您始终需要循环读取,直到{{1} }方法返回read()