【问题标题】:Java: A FileInputStream that blocks in read() while other thread downloads remainder of file?Java:一个 FileInputStream 在 read() 中阻塞,而其他线程下载文件的其余部分?
【发布时间】:2012-01-15 20:37:41
【问题描述】:

我有一个基于 FFmpeg 的视频播放应用程序,它能够播放来自任意 InputStream 的内容。

应用能够播放正在下载的视频文件非常重要。我似乎需要的是一种特殊的 FileInputStream,它将 (a) 与下载线程共享文件访问,并且 (b) 如果它到达下载部分的末尾,将安静地阻塞,直到有更多内容可用。

(a) 似乎很容易感谢 RandomAccessFile,但我对 (b) 有点困惑。我可能会破解一些可行的方法,但我想知道是否有标准的方法来实现它。仔细想一想,我觉得我可能遗漏了一些明显的东西。

有什么想法吗?你们会怎么做呢?

【问题讨论】:

  • 你有没有让这个工作?谢谢
  • 我不确定,我想是的。快速浏览一下有关应用程序的代码,我发现我创建了一个“RandomAccessFileInputStream”类,它扩展了一个普通的旧 InputStream,并包含一个以“rw”模式打开的 RandomAccessFile。这是视频播放器使用的流,它似乎能够与通过单独的文件句柄写入同一文件的下载器和平共存。
  • 好的,感谢更新!

标签: java io inputstream


【解决方案1】:

您必须轮询文件的长度。没有办法单独使用文件来阻止等待文件长度更改。您可以忙轮询,或每 10 或 100 毫秒轮询一次。

如果写入器和读取器在同一个进程中,您可以使用锁定/同步块在添加更多数据时通知读取器。

对于多个进程,您可以使用套接字来发送数据,或者至少在长度发生变化时通知以允许读取器阻塞。

【讨论】:

    【解决方案2】:

    如果您可以将数据不在文件中而是推送到 OutputStream 中(或者可能同时写入 FileOutputStream 和其他共享 PipedOutputStream),这将是最简单的解决方案:

    使用PipedOutputStreamPipedInputStream。这将允许您同时实现 A 和 B,但是您需要以某种方式在查看器端实现视频缓冲。

    基本上,您的下载程序线程会将其获得的每一位数据写入 PipedOutputStream。 write() 方法没有阻塞,因为数据被推送到管道的内部缓冲区。

    您的查看器线程将简单地来自 pipedInputStream 的 read(),正如 API 所说的:This method blocks until input data is available, the end of the stream is detected, or an exception is thrown.

    【讨论】:

    • 这是否需要一个缓冲区,最终可能需要与整个视频文件一样大?
    • 不,在从管道中读取数据后 - 它从缓冲区中删除。因此,除非您的 View 线程崩溃,否则管道缓冲区将仅包含已下载但尚未读取的数据。如果您正在谈论我提到的需要实现的缓冲,它应该是您想要向用户显示的最小块的静态大小。例如 5 秒的视频。否则,在连接缓慢的情况下观看视频将是一种可怕的体验。
    【解决方案3】:

    如果您无法控制下载过程,并且只想播放任何下载文件(即使是其他下载者),那么您可以Watch directory for changes

    需要说明的是,这种方式是跨平台跨文件系统的。以下是同一篇文章的引述:

    大多数文件系统实现都对文件更改通知提供本机支持。 Watch Service API 在可用的情况下利用此支持。但是,当文件系统不支持这种机制时,Watch Service 会轮询文件系统,等待事件发生。

    【讨论】:

      【解决方案4】:

      我相信这个问题没有真正的答案。我有一些有用的东西,但对我来说它看起来像不雅的黑客攻击。也许有时这是不可避免的。

      【讨论】:

        猜你喜欢
        • 2013-07-11
        • 1970-01-01
        • 2016-03-27
        • 2017-01-10
        • 1970-01-01
        • 2014-04-03
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        相关资源
        最近更新 更多