我试图通过 Java 库 Restlet 流式传输文件。但是文件在流式传输时被写入。在这里它应该如何工作。
我创建了一个视频和一个音频文件,然后将这两个文件合并为一个,这一步需要相当长的时间。因此,在创建新文件时,我想将文件流式传输到浏览器,这样我就可以观看视频而无需等待 10 分钟。
目前我可以使用 FileInputStream 读取文件块,但我不知道如何将文件提供给浏览器。有任何想法吗?
甚至可以使用 Restlet 提供动态文件吗?
提前谢谢,对不起我的英语不好^^
津蒂斯
[更新]
感谢 Jerome Louvel,我能够在创建 mp3 文件时播放它:
public class RestletStreamTest extends ServerResource {
private InputRepresentation inputRepresentation;
public FileInputStream fis;
@Get
public InputRepresentation readFile() throws IOException {
final File f = new File("/path/to/tile.mp3");
fis = new FileInputStream(f);
inputRepresentation = new InputRepresentation(new InputStream() {
private boolean waited = false;
@Override
public int read() throws IOException {
waited = false;
// read the next byte of the FileInputStream, when reaching the
// end of the file, wait for 2 seconds and try again, in case
// the file was not completely created yet
while (true) {
byte[] b = new byte[1];
if (fis.read(b, 0, 1) > 0) {
return b[0] + 256;
} else {
if (waited) {
return -1;
} else {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
waited = true;
}
}
}
}
}, MediaType.AUDIO_MPEG);
return inputRepresentation;
}
}
它有点生硬,但有效,稍后会完善。当我更改代码以尝试流式传输视频时,播放器会读取视频的所有字节,然后开始播放并再次读取所有字节。当我在视频结束后点击播放按钮时,什么也没有发生。Restlet 引发超时,然后视频再次开始播放。我尝试了一个 .mp4 和一个 .flv 文件,但总是得到相同的结果。
我不确定它是 Restlet 还是 palyer 的问题。我在 Firefox 中使用 VLC 播放器,并在 Chrome 中尝试了标准的 html5 播放器。但是 Chrome 播放器甚至还没有开始播放。
我错过了什么吗?还是只是播放器的问题?