为输入流函数创建java包装器

时间:2018-01-30 07:42:46

标签: java inputstream wrapper fileinputstream

我正在尝试读取一个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 {

是包装器,但我不知道如何做到这一点。 有关如何有效执行此操作的任何建议或想法/链接。问题是关闭流但是能够将其传递给调用函数。

2 个答案:

答案 0 :(得分:1)

您应该将is.close()调用移出方法并将其关闭,例如

try {
    stream = FetchVideo.exportVideo(econnection, videoID);
    //do something with the stream
}
finally {
    if (stream != null) {
        stream .close();
    }
}

或者使用try with resource

更好
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