文件寻找动态增加的文件

时间:2011-04-07 05:55:34

标签: java multithreading servlets io filechannel

我正在尝试在本地保存在线流,然后从本地节点分发流。

计划流程:

首次请求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)我仍然看不到输出。

1 个答案:

答案 0 :(得分:1)

在我看来,cv包含文件中的总字节数。每次将数据附加到文件时都会对cv进行更新调用。

第二个代码段似乎使用相同的值(“filesize”)作为文件通道中的标记。据我所知,你总是在文件的最后一个字节上设置标记,并尝试从那个位置开始阅读,显然,你会立即看到EOF。

重新考虑计算响应起始位置的方法。它不应该是文件的最后一个字节。