Java SequenceInputStream基本测试失败
信不信由你,这次考试我没能通过。这是我第一次使用SequenceInputStream,我想测试它的功能。从这个测试来看,completeIs似乎只能从is2流式传输内容。要使测试通过is2和is1,需要连接Java SequenceInputStream基本测试失败,java,Java,信不信由你,这次考试我没能通过。这是我第一次使用SequenceInputStream,我想测试它的功能。从这个测试来看,completeIs似乎只能从is2流式传输内容。要使测试通过is2和is1,需要连接 public void testCombineInputStreams() throws IOException { StringBuffer strBuffer = new StringBuffer(); List<InputStream> isList = new Arra
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));
}
public void testCombineInputStreams()引发IOException{
StringBuffer strBuffer=新的StringBuffer();
List isList=new ArrayList();
字符串charSet=“UTF-8”;
String str2=“世界!”;
strBuffer.append(str2);
InputStream是2=新的ByteArrayInputStream(str2.getBytes(charSet));
isList.add(is2);
String str1=“hello”;
strBuffer.append(str1);
InputStream是1=新的ByteArrayInputStream(str1.getBytes(charSet));
isList.add(is1);
SequenceInputStream completeIs=新的SequenceInputStream(新向量(isList).elements());
字符串completeStr=strBuffer.toString();
int expectedNumBytesRead=completeStr.getBytes(charSet).length;
byte[]readStr=新字节[expectedNumBytesRead];
assertEquals(expectedNumBytesRead,completeIs.available());
completeIs.read(readStr,0,expectedNumBytesRead);
assertEquals(completeStr,新字符串(readStr,charSet));
}
这里有什么我错过的吗 第一件事:将
列表
转换为枚举
的方法不好(它将整个列表复制到一个新数组中,然后将该数组包装在向量中
)
最好使用
SequenceInputStream completeIs = new SequenceInputStream(Collections.enumeration(isList));
它将迭代器
包装在枚举
中
问题是:
completeIs.available()
从所有封闭的InputStream
s返回可用字节总数
然而,根据该报告:
[返回]可从当前基础输入流读取(或跳过)的字节数的估计值
completeIs.read(readStr,0,expectedNumBytesRead)
从所有封闭的InputStream
s读取所有字节
然而,根据该报告:
SequenceInputStream的读取方法尝试从当前子流读取数据。如果无法读取任何字符(因为子流已到达流的末尾,它将调用当前子流的close方法,开始从下一个子流读取
要从
InputStream
(无论是SequenceInputStream
还是其他变体)完全读取数据,您总是需要在循环中读取,直到read()
方法返回-1
什么SequenceInputStream
?我在代码中没有看到SequenceInputStream
。什么是completeIs
?当你从未使用过它时,isList
的意义是什么?@Andreas感谢你指出这个细节(我现在编辑了代码)。这是我这边的一个复制粘贴错误。我编辑了问题中的代码,我忘了添加你要添加的那一行mentioned@MrBuggy啊,我现在明白了。我已经相应地更新了我的答案