Java 在动态增加的文件中查找文件

Java 在动态增加的文件中查找文件,java,multithreading,servlets,io,filechannel,Java,Multithreading,Servlets,Io,Filechannel,我试图在本地保存在线流,然后从本地节点分发流 程序流程: 对url的第一个请求url test创建一个编写器线程,该线程开始使用文件名url file写入文件系统。对该url的所有后续请求(url测试)都是从本地文件系统处理的 写线程 protected class Writer implements Runnable { String url; public void run() { FileOutputStream out_file = null;

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

程序流程:

对url的第一个请求url test创建一个编写器线程,该线程开始使用文件名url file写入文件系统。对该url的所有后续请求(url测试)都是从本地文件系统处理的

写线程

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文件,并移动到其中最后保存的位置。我正在使用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();
        }
我没有看到任何输出,在另一个线程正在更新的文件中查找的最佳方式是什么

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();
        }

编辑:我希望writer线程继续写入文件,并且对任何请求的响应都应该从该实例开始。简而言之,在文件通道中设置位置时,我的writer线程仍在写入文件。即使我将文件通道位置设置为25%以下,比如说
inc.position(totalBytes-(long)0.25*totalBytes)
我仍然看不到输出。

在我看来,
cv
保存了文件中的总字节数。每次向文件中追加数据时,都会调用
cv

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


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

在我看来,
cv
保存了文件中的总字节数。每次向文件中追加数据时,都会调用
cv

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


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

为什么在读取之前将
inc
位置设置为末尾?如果在此期间不附加文件,后续读取将不会返回任何内容。既然您希望在后续请求中提供保存的文件,为什么不从位置0开始?因此您只提供部分文件?不喜欢整个HTML文档,而只喜欢自上次迭代以来作者附加的内容?嗨,托马斯,我想从那个时间实例开始。它就像一个活的饲料。我希望我的writer线程继续写入文件。在问题中添加了这个。是的,只是文件的一部分,从提出请求时开始。因此,您需要存储读卡器结束的位置,然后从那里继续。不要从文件的末尾开始(参见Andreas的回答)。为什么在阅读之前要将
inc
位置设置为末尾?如果在此期间不附加文件,后续读取将不会返回任何内容。既然您希望在后续请求中提供保存的文件,为什么不从位置0开始?因此您只提供部分文件?不喜欢整个HTML文档,而只喜欢自上次迭代以来作者附加的内容?嗨,托马斯,我想从那个时间实例开始。它就像一个活的饲料。我希望我的writer线程继续写入文件。在问题中添加了这个。是的,只是文件的一部分,从提出请求时开始。因此,您需要存储读卡器结束的位置,然后从那里继续。不要从文件末尾开始(请参见Andreas的回答)。嗨,Andreas,我希望writer线程继续向文件写入,任何请求的响应都应该从该时间开始。简而言之,当我在文件通道中设置位置时,我的writer线程仍在写入。我尝试将位置设置为已保存字节总数的75%,但没有输出:(嗨,Andreas,我希望writer线程继续写入文件,任何请求的响应都应该从该时间开始。简而言之,当我在文件通道中设置位置时,我的writer线程仍在写入。我尝试将位置设置为已保存字节总数的75%,但没有输出:(