Java Copy File,但请确保没有其他应用程序写入它

时间:2015-07-07 09:05:56

标签: java

我遇到以下情况:A(外部)文件服务器在目录中创建文件。我的应用程序尝试索引这些文件中的一些信息并将它们移动到另一个文件夹,这应该几乎立即发生。什么是确保没有其他应用程序读/写此文件的最佳方式(java)?

4 个答案:

答案 0 :(得分:1)

使用Files.createTempDirectory创建临时目录,然后将文件移动到目录并进行操作。您必须在操作结束时删除目录;例如Runtime.addShutdownHook

答案 1 :(得分:1)

我会假设最坏的情况:你无法控制服务器。

将文件原子移动到临时目录。处理它。最后将文件移动到目的地。

使用此助手类:

import java.io.File;
import java.io.IOException;
import java.nio.file.AtomicMoveNotSupportedException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;

public class FileHelper
{
    public static File capture(String prefixForTmpDir, File fileToMove )
            throws AtomicMoveNotSupportedException, IOException
    {
        Path tmpDir = Files.createTempDirectory( prefixForTmpDir );
        Path tmpFile = new File( tmpDir.toFile(), "file.tmp").toPath() ;
        Files.move(fileToMove.toPath(), tmpFile, StandardCopyOption.ATOMIC_MOVE );
        return tmpFile.toFile();
    }

    public static void completeMove( File captured, File dest )
            throws AtomicMoveNotSupportedException, IOException
    {
        Files.move( captured.toPath(), dest.toPath(), StandardCopyOption.ATOMIC_MOVE );
        File tmpDir = new File( captured.getParent() );
        tmpDir.delete();
    }
}

在您的应用中,假设fil1是您要处理的文件而fil2是您希望移动它的位置,那么您需要:

final String TMP_DIR = "/tmp or C:\\TMP or some dir where your app can write";
File captured = null;
try
{
    captured = FileHelper.capture( TMP_DIR, fil1 );
    processFile( captured );
    FileHelper.completeMove( captured, fil2 );
}
catch ( AtomicMoveNotSupportedException ex )
{
    if ( captured == null )
    {
        // File could not be moved to temp dir, possibly server is writing to it.
        // will need to retry again
    }
    else
    {
        assert false;
        // File could be moved to temp dir. But then could not be moved out of it.
        // Should not happen.
    }
}

答案 2 :(得分:0)

加密您的数据,这样其他任何应用程序都无法理解它。

  

创建readonly文件。

File file = new File("c:/file.txt");
//mark this file as read only, since jdk 1.2
file.setReadOnly();

答案 3 :(得分:0)

如果您不控制文件服务器,那么可能唯一的一般方法是将文件移动到文件服务器上的某个临时私有目录,然后编制索引并移动到最终位置。

请注意,您将负责任何清理工作,如果您需要任何交易属性(例如在索引文件时幸存重置),您将独自完成。