使用apache fileutil.copyfile复制文件

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

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

亲切的问候


因为在复制操作之前没有显式锁定整个文件,所以默认的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 Writern", 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("..testtest.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 '..testtest.txt'引发。


这是如何使用Java缓存文件的摘录,更多内容可以在这里找到。

在Java中缓存文件


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

  • 用于缓存文件的算法
  • 用于保存缓存内容的数据结构
  • 用于存储缓存文件的缓存API
  • 用于缓存文件的算法


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

  • 使用完全限定的文件路径作为密钥从缓存中获取值。
  • 如果找不到密钥,请读取文件内容并将其放入缓存。
  • 如果找到密钥,请检查缓存的内容的时间戳是否与文件时间戳相匹配。
  • 如果时间戳相同,则返回缓存的内容。
  • 如果时间戳不相等,请通过读取文件并将其放入缓存中来刷新缓存。

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

    也许这会帮助你。

    链接地址: http://www.djcxy.com/p/12403.html

    上一篇: Copying files using apache fileutil.copyfile

    下一篇: Aptana UI themes