![](/img/trans.png)
[英]Renaming a file throwing Exception in thread “main” 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.