7

我正在使用 apache util 将文件复制到使用fileutil.copyFile(src, dest)

我正在复制的文件由外部供应商每 2 秒更新一次,我真的不想锁定它(我的应用程序在 Windows 中运行——这会导致各种问题)。我希望有人可以帮助我建议在不锁定源文件的情况下复制甚至读取文件的最安全方法是什么?

亲切的问候

4

3 回答 3

2

因为您没有在复制操作之前明确锁定整个文件,所以默认的 os 文件锁定机制正在工作。

我运行了一个快速测试程序来查看当您在外部进程每 2 秒写入文件时复制源文件时在 Windows 机器上会发生什么。

写入文件的进程从未遇到过问题。

public static void main(String[] args) {
    File f = new File("..\\test.txt");
    long startTime = System.currentTimeMillis();
    long elapsedTime = 0;
    while (elapsedTime < 1000 * 60) {
        try {
            FileUtils.writeStringToFile(f, System.currentTimeMillis()+" : Data Write\r\n", true);
            Thread.sleep(2000);
        } catch (IOException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex){
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
        elapsedTime = System.currentTimeMillis() - startTime;
    }
}

如果在源文件更改长度之前没有完成复制,复制文件的进程将抛出异常。看来,此异常更像是文件的复制版本不完整的警告。当我同步时间以防止在写入文件的同时读取文件时,不会引发此异常。

public static void main(String[] args) {
    File f = new File("..\\test.txt");
    long startTime = System.currentTimeMillis();
    long elapsedTime = 0;
    while (elapsedTime < 1000 * 60) {
        try {
            FileUtils.copyFile(f, new File("..\\test\\test.txt"));
            Thread.sleep(2000);
        } catch (IOException ex) {
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        } catch (InterruptedException ex){
            Logger.getLogger(App.class.getName()).log(Level.SEVERE, null, ex);
        }
        elapsedTime = System.currentTimeMillis() - startTime;
    }
}

基于这个测试,我不会担心写作过程会发生什么。java.io.IOException: Failed to copy full contents from '..\test.txt' to '..\test\test.txt'当被抛出时,我会做一些事情来处理这个案子。

于 2013-03-26T18:29:34.667 回答
1

这是How to Cache a File in Java的摘录,更多内容可以在此处找到。

在 Java 中缓存文件


从磁盘读取文件可能会很慢,尤其是当应用程序多次读取同一个文件时。缓存通过将经常访问的文件保存在内存中来解决这个问题。这允许应用程序从快速本地内存而不是慢速硬盘驱动器读取内容。在 Java 中缓存文件的设计包括三个要素:

  1. 缓存文件的算法
  2. 用于保存缓存内容的数据结构
  3. 用于存储缓存文件的缓存 API

缓存文件的算法


缓存文件的通用算法必须考虑文件修改,并由以下步骤组成:

  1. 使用完全限定的文件路径作为键从缓存中获取值。
  2. 如果未找到密钥,则读取文件内容并将其放入缓存中。
  3. 如果找到密钥,则检查缓存内容的时间戳是否与文件时间戳匹配。
  4. 如果时间戳相等,则返回缓存的内容。
  5. 如果时间戳不相等,则通过读取文件并将其放入缓存来刷新缓存。
于 2013-03-28T20:51:22.983 回答
0

看看http://docs.oracle.com/javase/6/docs/api/java/io/RandomAccessFile.html

也许这会对你有所帮助。

于 2013-03-15T11:27:06.553 回答