我试图在读取时专门锁定文件

时间:2016-06-24 00:28:37

标签: java locking

我试图在读取时专门锁定文件。

我在Windows 7上使用Java 7.

文件被复制到一个目录,然后我想在复制后正确读取它们。这就是为什么我在读取时专门尝试锁定文件的原因。

但我的程序在中间读取文件。 有人可以帮我这个吗?谢谢!

package test;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.nio.file.FileSystem;
import java.nio.file.FileSystems;
import java.nio.file.Files;

public class FileLockMove {

    public static void main(String[] args) {
        FileSystem fs = FileSystems.getDefault();
        File dir = new File("c:/test_source/");
        while(true){
            for (File file : dir.listFiles()) {
                try (FileChannel fc = (new RandomAccessFile(file, "rw")).getChannel()){
                    FileLock lock = fc.tryLock();
                    if(lock != null){
                        System.out.println("lock is not null\t" + file.getName());
                        System.out.println("addBody: " + file.getAbsolutePath() + "\t" + file.length());
                    }else{
                        System.out.println("lock is null\t" + file.getName());
                        continue;
                    }
                } catch (Exception e) {
                    System.out.println("fail:" + file.getName()+"\t" + e.getMessage());
                }
                try {
                    Files.move(file.toPath(), fs.getPath("c:/test_dest/",file.getName()));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

最初,复制文件不是Java,但我慢慢创建了我的程序副本,以确认我可以完全锁定。

package test;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FilenameFilter;

public class FileCopySlow{
    public static void main(String[] args) {
        String source = "C:/test_orig/";
        String dst ="C:/test_source/";
        File file = new File(source);
        File[] files = file.listFiles(new FilenameFilter() {

            @Override
            public boolean accept(File dir, String name) {
                if(name.matches(".*\\.bmp")){
                    return true;
                }
                return false;
            }
        });
        for(File f: files){
            copyStream(f, dst);
        }

    }

    static void copyStream(File source,String dst){
        try(BufferedInputStream br = new BufferedInputStream(new FileInputStream(source))){
            BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(dst+source.getName()));
            byte[] buff = new byte[100];
            int len = -1;
            while((len = br.read(buff)) >-1){
                out.write(buff,0,len);
                out.flush();
                Thread.sleep(100);
            }
            out.close();
            System.out.println(source.getName() + "\tfinish");
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

0 个答案:

没有答案