Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SequenceInputStream基本测试失败_Java - Fatal编程技术网

Java SequenceInputStream基本测试失败

Java SequenceInputStream基本测试失败,java,Java,信不信由你,这次考试我没能通过。这是我第一次使用SequenceInputStream,我想测试它的功能。从这个测试来看,completeIs似乎只能从is2流式传输内容。要使测试通过is2和is1,需要连接 public void testCombineInputStreams() throws IOException { StringBuffer strBuffer = new StringBuffer(); List<InputStream> isList = new Arra

信不信由你,这次考试我没能通过。这是我第一次使用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));
}
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啊,我现在明白了。我已经相应地更新了我的答案