0

我有一个连接到文件夹的简单类,我想删除所有创建的常规文件,但是当我读取同名文件时(同一个文件被插入文件夹不止一次或两次),我得到了错误

Exception in thread "main" java.lang.RuntimeException: java.nio.file.FileSystemException: c:\Temp\reader\msg.xml: The process cannot access the file because it is being used by another process.

    at com.project.test.Reader.lambda$0(Reader.java:38)
    at com.project.test.Reader$$Lambda$1/1418481495.accept(Unknown Source)
    at java.util.ArrayList$ArrayListSpliterator.forEachRemaining(ArrayList.java:1374)
    at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580)
    at com.project.test.Reader.main(Reader.java:28)
Caused by: java.nio.file.FileSystemException: c:\Temp\reader\msg.xml: The process cannot access the file because it is being used by another process.

    at sun.nio.fs.WindowsException.translateToIOException(WindowsException.java:86)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:97)
    at sun.nio.fs.WindowsException.rethrowAsIOException(WindowsException.java:102)
    at sun.nio.fs.WindowsFileSystemProvider.implDelete(WindowsFileSystemProvider.java:269)
    at sun.nio.fs.AbstractFileSystemProvider.delete(AbstractFileSystemProvider.java:103)
    at java.nio.file.Files.delete(Files.java:1126)
    at com.project.test.Reader.lambda$0(Reader.java:35)
    ... 4 more

这是我的读者课:

package com.project.test;

import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardWatchEventKinds;
import java.nio.file.WatchEvent;
import java.nio.file.WatchKey;
import java.nio.file.WatchService;
import java.util.concurrent.TimeUnit;
import java.util.stream.Stream;

public class Reader {

    public static void main(String[] args) {
        Path path = Paths.get("c:\\Temp\\reader\\");
        WatchService watchService;

        try {
            watchService = path.getFileSystem().newWatchService();
            path.register(watchService, StandardWatchEventKinds.ENTRY_CREATE);
            WatchKey watchKey = null;
            while (true) {
                watchKey = watchService.poll(5, TimeUnit.SECONDS);
                if (watchKey != null) {
                    try(Stream<WatchEvent<?>> events = watchKey.pollEvents().stream()) {
                        events.forEach(event -> {
                            if (event.kind() == StandardWatchEventKinds.ENTRY_CREATE) {
                                @SuppressWarnings("unchecked")
                                Path name = ((WatchEvent<Path>) event).context();
                                Path file = path.resolve(name);
                                try {
                                    if (Files.isRegularFile(file)) {
                                        Files.delete(file);
                                    }
                                } catch (Exception e) {
                                    throw new RuntimeException(e);
                                }
                            }
                        });
                    }
                    watchKey.reset();
                }
            }
        } catch (IOException | InterruptedException e) {
            throw new RuntimeException(e);
        }
    }

}

你不知道哪里不对吗?我希望这应该错过文件上的一些“关闭”,但路径只是文件上的目标,不应该被关闭,应该是吗?感谢所有提示。

4

1 回答 1

0

如果您阅读 WatchService 的javadoc,它会说实现依赖于操作系统,即。对于某些操作系统,将文件添加到文件夹时可能会生成多个事件:

例如,当监视目录中的文件被修改时,在某些实现中可能会导致单个 ENTRY_MODIFY 事件,但在其他实现中可能会导致多个事件。

我的预感是这也是你的情况。

以下是一些类似的讨论:

Java 7 WatchService - 忽略同一事件的多次出现

将新文件添加到监视文件夹时,Java NIO 监视服务创建了“ENTRY_CREATE”和“ENTRY_MODIFY”

我要做的是将要删除的文件的路径存储在并发集合中,并且仅在当前路径不在该集合中时才尝试删除。

于 2017-05-19T08:25:21.960 回答