未知的例外? java.nio.file.FileSystemException:无效的交换

时间:2017-12-01 21:46:17

标签: java

我遇到了以前从未见过的错误,无法找到有关的任何信息。

如果我尝试走一个(几个嵌套子目录中的大型,100万个文件。每个目录只有1-300个文件/文件夹)文件路径,我得到以下堆栈跟踪

Exception in thread "main" java.io.UncheckedIOException: java.nio.file.FileSystemException: /PATH_HERE/: Invalid exchange
    at java.nio.file.FileTreeIterator.fetchNextIfNeeded(FileTreeIterator.java:88)
    at java.nio.file.FileTreeIterator.hasNext(FileTreeIterator.java:104)
    at java.util.Iterator.forEachRemaining(Iterator.java:115)
    at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:499)
    at my.class.NGram.run(NGram.java:90)
    at my.class.NGram.main(NGram.java:81)
Caused by: java.nio.file.FileSystemException: /PATH_HERE: Invalid exchange
    at sun.nio.fs.UnixException.translateToIOException(UnixException.java:91)
    at sun.nio.fs.UnixException.asIOException(UnixException.java:111)
    at sun.nio.fs.UnixDirectoryStream$UnixDirectoryIterator.readNextEntry(UnixDirectoryStream.java:171)
    at sun.nio.fs.UnixDirectoryStream$UnixDirectoryIterator.hasNext(UnixDirectoryStream.java:201)
    at java.nio.file.FileTreeWalker.next(FileTreeWalker.java:348)
    at java.nio.file.FileTreeIterator.fetchNextIfNeeded(FileTreeIterator.java:84)
    ... 10 more

第90行的代码看起来像

ConcurrentLinkedQueue<File> queuOfAllFiles = new ConcurrentLinkedQueue<>();
    FileVisitor<? super Path> fileVisitor = new SimpleFileVisitor<Path>()
    {
        @Override
        public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException
        {
            if (attrs != null && file != null && attrs.isRegularFile())
                queuOfAllFiles.add(file.toFile());
            return super.visitFile(file, attrs);
        }

    };
    Files.walkFileTree(dir.toPath(), EnumSet.of(FileVisitOption.FOLLOW_LINKS), Integer.MAX_VALUE, fileVisitor); //This line errors

原始代码看起来像这样,会产生相同的错误

List<File> allFiles = Files.walk(dir.toPath(), FileVisitOption.FOLLOW_LINKS)
            .filter(p -> !Files.isReadable(p))
            .map(p -> p.toFile())
            .collect(Collectors.toList());

我无法在任何地方找到任何有关此错误的信息,或者可能导致错误的原因。触摸/查看系统上所有文件的工具似乎没有问题,例如

find /PATH_HERE -type f | wc -l

给我正确数量的文件(约100万)

这是在运行Ubuntu 16.04的40 TB SSD存储,64 CPU核心和2 TB RAM的系统上运行。下面的Java版本信息。

java -version
java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

我正在寻找任何帮助,我可以了解可能导致这个或其他事情的尝试。我现在没有任何想法,也无法找到任何信息。

1 个答案:

答案 0 :(得分:-1)

您是否必须遵循符号链接?可能是一个潜在的麻烦点。 另外,您是否尝试使用自己的递归函数来走树?您可以找到特定的违规文件/目录。