我正在尝试在本地保存在线流,然后从本地节点分发流。
程序流程:
对 url 的第一个请求 url-test 创建了一个写入器线程,该线程开始使用文件名 url-file 写入文件系统。对该 url 的所有后续请求 url-test 都从本地文件系统处理。
作家线程
protected class Writer implements Runnable {
String url;
public void run() {
FileOutputStream out_file = null;
File cacheFile = new File("url-file");
byte[] buf = new byte[4096];
int count = 0;
try {
URL urlstream = new URL(url);
// cv is an object which stores url information
cv.originInputStream = urlstream.openStream();
out_file = new FileOutputStream(cacheFile);
while ((count = cv.originInputStream.read(buf)) > 0) {
out_file.write(buf, 0, count);
out_file.flush();
cv.incrementTotalBytes(count);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
现在对于下一个请求,我需要读取本地保存的文件 url-file,然后移动到其中最后保存的位置。我正在使用 cv 对象的 totalBytes 属性,它为我提供了编写器线程保存的总字节数。
FileInputStream in = new FileInputStream("url-file");
response.setHeader("Content-Disposition", "inline; filename="
+ localFile.getName());
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Expires", "-1");
OutputStream out = response.getOutputStream();
// Copy the contents of the file to the output stream
byte[] buf = new byte[4096];
int count = 0;
FileChannel inc = in.getChannel();
ByteBuffer b = ByteBuffer.allocate(4096);
inc.position(cv.getTotalBytes());
while ((count = inc.read(b)) >= 0) {
out.write(b.array(), 0, count);
b.clear();
}
我没有看到任何输出,在文件中寻找的最佳方法是什么,该文件正在被另一个线程更新。
编辑:我希望编写器线程继续写入文件,并且任何请求的响应都应该从那个时间实例开始。简而言之,在文件通道中设置位置时,我的编写器线程仍在写入文件。即使我将文件通道位置设置为 25% 少说inc.position(totalBytes - (long) 0.25 * totalBytes)
我仍然看不到输出。