我正在尝试读取一个fileinputstream,然后传递给一个调用函数,然后在webserver应用程序查看器中播放。下载工作正常,但问题是如果我在同一个函数中关闭流(推荐),调用函数由于某种原因接收空流。有人建议创建一个输入流包装器,这将允许我关闭流,删除文件并仍然将流传递给调用函数。
public InputStream exportVideo(Youtube connection, String videoID) {
InputStream is = null;
....//file retrieval code above
is = new FileInputStream(ndirectory + "\\" + this.videoID.toString()
+ ".avi");
return is;
....//trace handling code below
finally{
is.close();
}
}
调用函数:
stream = FetchVideo.exportVideo(econnection, videoID);
我认为这个建议意味着有一些课程:
public class StreamConverter extends InputStream {
是包装器,但我不知道如何做到这一点。 有关如何有效执行此操作的任何建议或想法/链接。问题是关闭流但是能够将其传递给调用函数。
答案 0 :(得分:1)
您应该将is.close()
调用移出方法并将其关闭,例如
try {
stream = FetchVideo.exportVideo(econnection, videoID);
//do something with the stream
}
finally {
if (stream != null) {
stream .close();
}
}
更好
try (InputStream stream = FetchVideo.exportVideo(econnection, videoID)) {
//do something with the stream
}
答案 1 :(得分:1)
您可以使用合成来实现此InputStream。 只需覆盖所有方法,以便它们调用您的委托对象。
但我不确定这是做你想做的事的正确方法。我认为这里最好的选择是向函数添加输出流。然后,该函数将其读取的内容写入输出流,并且调用者现在负责关闭流。 (Easy way to write contents of a Java InputStream to an OutputStream)