簡體   English   中英

未知異常? java.nio.file.FileSystemException:無效的交換

[英]Unknown Exception? java.nio.file.FileSystemException: Invalid exchange

我遇到一個從未見過的錯誤,找不到任何有關的信息。

如果我嘗試遍歷(一個嵌套子目錄中的大文件,一百萬個文件。每個目錄只有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

給我正確的文件數(大約一百萬)

它在運行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)

我正在尋找可能導致此問題或其他事情嘗試的任何幫助。 目前我還沒有任何想法,也找不到任何信息。

您必須遵循符號鏈接嗎? 可能是潛在的麻煩點。 另外,您是否嘗試過使用自己的遞歸函數在樹上行走? 您也許可以找到特定的問題文件/目錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM