在Java中的DataInputStream中来回移动

在Java中的DataInputStream中来回移动,java,datainputstream,Java,Datainputstream,我正在使用DataInputStream读取视频文件。然后,我使用字节数组为每一帧逐个读取数据,然后连续显示它们。我的问题是,如果我想再次看到以前的画面,或者是未来的画面,该怎么办?是否可以在流中后退一步,或者是否有任何其他方法可以?作为一个“简单”的解决方案,您可以使用。然而,我不会依赖于此,而是编写自己的缓冲策略。为什么不将最后一帧缓存在内存中?我会使用内存映射的方法来实现这一点。如果您知道每个帧的大小,并且它是固定的,那么就没有理由跳过(向前/向后)并简单地映射到该帧(或帧序列).使用缓冲

我正在使用DataInputStream读取视频文件。然后,我使用字节数组为每一帧逐个读取数据,然后连续显示它们。我的问题是,如果我想再次看到以前的画面,或者是未来的画面,该怎么办?是否可以在流中后退一步,或者是否有任何其他方法可以?

作为一个“简单”的解决方案,您可以使用。然而,我不会依赖于此,而是编写自己的缓冲策略。为什么不将最后一帧缓存在内存中?

我会使用内存映射的方法来实现这一点。如果您知道每个帧的大小,并且它是固定的,那么就没有理由跳过(向前/向后)并简单地映射到该帧(或帧序列).

使用缓冲区保存数据为什么不维护已处理帧数据的堆栈?我是说缓冲区?我可以存储数据..但我有点希望避免这种情况,因为存储所有帧的字节数组所需的总磁盘空间将是巨大的..这就是为什么查询..准确地说。流接口的全部要点是单向、顺序访问(即名称)。@Nim这就是我不知道的,是的,帧的大小是恒定的,如果流是以数组的形式,我可以向后/向前移动,但我认为不是(或者是吗?)。请告诉我怎么做。我当然知道每个帧使用的字节数组的确切长度。@Paragoel,内存映射文件正是这样,它允许您将文件中的一个块“映射”到内存中,并像数组一样访问该块。假设每个帧是1024字节,要“读取”前10帧,您需要从偏移量0处的文件映射一个10*1024字节的块,然后从偏移量10240处读取下一个10字节,等等。您应该首先阅读内存映射文件访问,我想这会很有启发性……哦,好的,我想我应该先读一读,然后再回来,如果它仍然不能解决它..我应该能够访问我到现在为止访问过的任何帧,而不仅仅是前一帧,这就是为什么我认为缓存前一帧是无用的。但是看起来PushbackInputStream很有前途。@Paragoel,它要求您拥有所有要向后推的字节。也就是说,如果你想要回帧10帧,你需要保留所有的数据,以便将其推回到流中。因此,我想我将不得不以艰难的方式来做,要么将所有内容存储在内存中,要么花时间重新计算。@Parag Goel:根据你的输入,你应该将
InputStream
与“帧缓冲区”分开。这意味着,
InputStream
对您的应用程序是透明的,它只处理一个帧缓冲区,如果尚未加载下一帧,它将加载下一帧,但可以跳到已加载的前一帧。@MoritzPetersen是的,这看起来是这种情况下的最佳解决方案,感谢您的提示。:-)