这是一个java 的文件监控目录下的变化,发生变化进行处理。

public void run() {
WatchService watchService;
try {
watchService = FileSystems.getDefault().newWatchService();
Paths.get(watchedPath).register(watchService,

StandardWatchEventKinds.ENTRY_CREATE);
while(true)

{
WatchKey key=watchService.take();

for(WatchEvent<?> event:key.pollEvents())

{
WatchEvent ev = cast(event);
Path name = ev.context();
if(ftpUser == null || ftpUser.equals("")){ //本地local
FtpUtil.copyFile(name.toFile(),localPath,watchedPath);
}else{
// FtpUtil.uploadFile(name.toFile(), localPath, "ftp.properties",watchedPath); //ftp
FtpUtil.uploadFile(name.toFile(), localPath, ftpUser,watchedPath); //ftp
}
}

boolean reset = key.reset();
if (!reset)
break;
}
} catch (IOException e) {
e.printStackTrace();
}
catch (InterruptedException e) {
e.printStackTrace();
}

}

/**
* 复制单个文件
* @param oldPath String 原文件路径 如:c:/fqf.txt
* @param newPath String 复制后路径 如:f:/fqf.txt
* @return boolean
*/
public static void copyFile(File newFile, String newPath,String oldPath) {
InputStream inStream = null;
FileOutputStream fs = null;

    try { 
        int bytesum = 0;
        int byteread = 0;
        String filePath = oldPath +"\\"+newFile;
        File oldfile = new File(filePath);
        if (oldfile.exists()) { // 文件存在时
            inStream = new FileInputStream(filePath); // 读入原文件
            fs = new FileOutputStream(newPath+"\\"+newFile);
            byte[] buffer = new byte[1444];
            int length;
            while ((byteread = inStream.read(buffer)) != -1) {
                bytesum += byteread; // 字节数 文件大小
                fs.write(buffer, 0, byteread);
            }
            System.out.println("aaa");
        }

    } catch (Exception e) {
        System.out.println("复制单个文件操作出错");
        e.printStackTrace();
    }finally{
        try {
            if(null!=fs){
                fs.close();
            }
            if(null!=inStream){
                inStream.close();
            } 
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } 
        System.out.println("bbb");
    }
}

java.io.FileNotFoundException: D:\text1\新建文本文档 (2).txt (另一个程序正在使用此文件,进程无法访问。)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.(FileInputStream.java:138)
at java.io.FileInputStream.(FileInputStream.java:97)
at com.rihang.util.FtpUtil.copyFile(FtpUtil.java:143)
at com.rihang.publicserviceproduct.FileWatcherThread.run(FileWatcherThread.java:68)

上边是代码和异常,我要做的是,当监控的目录下多了一个文件的时候就将该文件copy 到其他目录下。现在第一次没问题。第二次在放如监控目录下一个文件时就提示这个异常。但是我如果在inStream = new FileInputStream(filePath); 这行打个断点停顿下就没这个问题了。在线求解。

3个回答

请问你这个解决了吗?

你好,请问你的问题解决了吗

原因其实就是WatchEvent.Kind占用了文件,因为你同时在监控该文件夹下的所有文件更新、复制、修改等活动,它会占用该文件的以读取文件信息
,比如文件的创建日期,修改日期等等,那么刷新一下就可以了
if (!key.reset()) {//必须刷新才能读取文件,否则失败报错
break;
}

    在读取文件之前运行这段代码就可以了
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问