我有加密的视频文件,在解密时我已经定义了Byte byte[] input = new byte[1024];
大小,将其写入输出文件中。
在这里,我想在输出文件中首先写入1024个字节,同时如果要播放该视频文件,我可以播放该输出文件而无需等待整个文件写入视频流。
当写入第一个1024字节时,视频文件将开始播放,直到写入整个文件。
答案 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,无论读者离作者有多远。