如何逐字节写入并连续显示

时间:2011-11-15 12:18:57

标签: java

我有加密的视频文件,在解密时我已经定义了Byte byte[] input = new byte[1024];大小,将其写入输出文件中。 在这里,我想在输出文件中首先写入1024个字节,同时如果要播放该视频文件,我可以播放该输出文件而无需等待整个文件写入视频流。

当写入第一个1024字节时,视频文件将开始播放,直到写入整个文件。

3 个答案:

答案 0 :(得分:2)

您必须根据获取数据的位置以及保存/查看数据的位置设置输入流和输出流。通过对输出进行一些缓冲,性能也可能得到改善。你应该得到一般的想法。

public class DecryptionWotsit {
    private final BlockingDeque<Byte> queue = new LinkedBlockingDeque<Byte>();
    private final InputStream in;
    private final OutputStream out;
    public DecryptionWotsit(InputStream in, OutputStream out) {
        this.in = in;
        this.out = out;
    }

    public void go() {
        final Runnable decryptionTask = new Runnable() {
            @Override
            public void run() {
                try {
                    byte[] encrypted = new byte[1024];
                    byte[] decrypted = new byte[1024];
                    while (true) {
                        int encryptedBytes = in.read(encrypted);

                        // TODO: decrypt into decrypted, set decryptedBytes
                        int decryptedBytes = 0;

                        for (int i = 0; i < decryptedBytes; i++)
                            queue.addFirst(decrypted[i]);
                    }
                }
                catch (Exception e) {
                    // exception handling left for the reader
                    throw new RuntimeException(e);
                }
            }
        };
        final Runnable playTask = new Runnable() {
            @Override
            public void run() {
                try {
                    while (true) {
                        out.write(queue.takeLast());
                    }
                }
                catch (Exception e) {
                    throw new RuntimeException(e);
                }
            }
        };
        Executors.newSingleThreadExecutor().execute(decryptionTask);
        Executors.newSingleThreadExecutor().execute(playTask);
    }
}

答案 1 :(得分:0)

你必须在一个单独的线程中写作 由于写入文件比显示视频慢很多,因此在您退出观看视频后,期望文件写入线程运行很长时间。除非(据我所知)你打算只将 写入文件的前1024个字节。

如果您打算将整个视频写入文件,则单个1024字节缓冲区会降低您的速度。您将不得不使用更大的缓冲区,或者需要大量的这些1024字节缓冲区。 (我想1024字节的缓冲区大小是解密算法的结果?)
此外,您可能希望查看JVM可用的内存量,以确保您不会中途获取OutOfMemoryException。您可以使用-Xms-Xmx选项设置JVM可用的内存量。

答案 2 :(得分:0)

写入文件的简单方法,您还要处理的是打开文件两次(或更多次)。在一个线程中,您写入文件并更新计数器以说明您已写入多少,例如由long块保护的synchronized。在阅读线程中,您可以获得此值并重复读取到该点,直到作者完成为止。完成写入信号的一种简单方法是将大小设置为Long.MAX_VALUE,使读者读取直到EOF。要阻止读者忙于等待,可以让他们等待(),直到写入的数据大于读取的数量。

这种方法总是使用固定数量的内存,例如16 - 128K,无论读者离作者有多远。