我在这里试图实现的是通过使用apachecommons打印InputStream的内容来获得更多的调试输出。在这个过程中,我似乎在改变流本身。
InputStream is = getClass().getResourceAsStream("file.txt");
IOUtils.copy(is, System.out); //Happily Prints out contents of file.txt
IOUtils.copy(is, System.out); //Doesn't print anything
为什么使用IOUT复制流会改变流?我试着克隆流,然后把它打印出来,但仍然没有成功。我尝试了从apachecommons克隆CloseShieldInputStream。
InputStream is = getClass().getResourceAsStream("file.txt");
CloseShieldInputStream csis = new CloseShieldInputStream(is);
IOUtils.copy(csis, System.out);//Happily Prints out contents of file.txt
IOUtils.copy(is, System.out);//Still Doesn't print anything
有人能解释为什么他们称这些方法为"复制",即使源流丢失了内容吗?如何打印流而不担心内容丢失?
编辑:
这段代码(除了初始化流的地方)在第三方库中非常深入,流在经过几个方法后传递。很难弄清楚流是在哪里初始化的,并在那里显示它,然后重新初始化。我拼命地试图显示这个流,并且仍然保持它不变。
System.out
流未被更改。现在发生的情况是,一旦is
的内容被读取,它们就已经被消耗掉了,您无法再读取它们。要解决此问题,您需要在第二次调用之前重新初始化is
。