当前位置: 首页 > 面试题库 >

避免(java.nio.file.AccessDeniedException)的Java 8 Files.walk(..)终止原因[重复]

夏意蕴
2023-03-14
问题内容

我正在使用 Java 8
Files.walk(..)来计算.mp3一个文件夹中包含的文件以及其中的所有文件夹。换句话说,我正在访问文件树的所有级别。

当我得到java.nio.file.AccessDeniedExceptionStream关闭,我不希望这种行为。我需要它忽略或打印异常并继续计数文件。以下是我使用的代码:):

   /**
     * Count files in a directory (including files in all sub
     * directories)
     * 
     * @param directory
     *        the directory to start in
     * @return the total number of files
     */
    public int countFiles(File dir) {
        if (dir.exists())
            try (Stream<Path> paths = Files.walk(Paths.get(dir.getPath()), FileVisitOption.FOLLOW_LINKS)) {
                return (int) paths.filter(path -> {

                    // i am using something different here but i changed
                    // it just for the purpose of StackOverFlow question                                
                    return path.toString().contains(".mp3");

                }).count();
            } catch (IOException ex) {
                //Main.logger.log(Level.WARNING, "", ex);
                ex.printStackTrace();
            }

        return 0;
    }

错误的StackTrace:

java.io.UncheckedIOException: java.nio.file.AccessDeniedException: C:\$Recycle.B
in\S-1-5-18
    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.jav
a: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.LongPipeline.reduce(LongPipeline.java:438)
    at java.util.stream.LongPipeline.sum(LongPipeline.java:396)
    at java.util.stream.ReferencePipeline.count(ReferencePipeline.java:526)
    at smartcontroller.SmartController$InputService$1.countFiles(SmartController.ja
va:2092)
...

类似的问题, 尽管不尽相同但我需要返回Stream


问题答案:

这是一个临时解决方案,可以改进以使用Java 8 Streams和Lambdas。

int[] count = {0};
try {
    Files.walkFileTree(
            Paths.get(dir.getPath()), 
            new HashSet<FileVisitOption>(Arrays.asList(FileVisitOption.FOLLOW_LINKS)),
            Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
                @Override
                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) 
                        throws IOException {
                    System.out.printf("Visiting file %s\n", file);
                    ++count[0];
                    return FileVisitResult.CONTINUE;
                }

                @Override
                public FileVisitResult visitFileFailed(Path file, IOException e) 
                        throws IOException {
                    System.err.printf("Visiting failed for %s\n", file);
                    return FileVisitResult.SKIP_SUBTREE;
                }

                @Override
                public FileVisitResult preVisitDirectory(Path dir,
                                                         BasicFileAttributes attrs) 
                        throws IOException {
                    System.out.printf("About to visit directory %s\n", dir);
                    return FileVisitResult.CONTINUE;
                }
            });
} catch (IOException e) {
    // handle exception
}


 类似资料:
  • 我使用的是Java8Files.Walk(..)计数文件夹中包含的文件及其内的所有文件夹。换句话说,我正在访问文件树的所有级别。 当我获得关闭时,我不希望出现这种行为。我需要它来忽略或打印异常并继续计数文件。下面是我使用的代码:): 处理Java7中文件遍历树中拒绝的访问。

  • 我正在对一个拥有7000万行和25个数字特征的训练集使用R内部的< code>H2O库来尝试一个随机森林分类模型。总文件大小为5.6 GB。 验证文件的大小为 1 GB。 我的系统上有16 GB RAM和8核CPU。 系统成功读取H2O对象中的两个文件。 然后我发出以下命令来构建模型: 但是几分钟后(没有生成任何树),我得到以下错误: "在. h2o.doSafeREST(conn = conn,

  • 问题内容: 我遇到的问题是,有时我启动的线程在调用它之前就完成了。看来这使我的程序等待不再发生的事情()。如何确保不等待线程完成? 问题答案: 如果您阅读JavaDocs for Thread,它将告诉您 永远不要在Thread对象上使用。您应该使用join()

  • IConeable 听起来是一个很不错的想法:你类型实现了 IConeable 接口然后就支持复制。如果你不想要支持复制,你就不需要实现它。但是你的类型不能在真空中存在。你支持 IConeable 的决定会影响它的子类。一旦一个类型支持 ICloneable ,它的所有子类也都必须支持 ICloneable 。它的所有成员的类型都必须支持 ICloneable 或者有其他机制去复制。最后,如果支持

  • 我使用for循环将学生详细信息添加到ArrayList。当我给第二个学生提供详细信息时,它会覆盖第一个数据。螺柱类 将数据添加到ArrayList的主类。 输出:第二个数据[2,2]后的实际输出辊数[1]。预期输出应为卷号: A1姓名: F1 L1性别:男性年龄: 11体育赛事:标枪 报名号:A2姓名:F2 L2性别:女年龄:14体育项目:100米跑 报名号:A3姓名:F3 L3性别:男性年龄:1

  • 问题内容: 我是mongodb的新手。我可以知道如何避免重复输入。在关系表中,我们使用主键来避免它。我可以知道如何使用Java在Mongodb中指定它吗? 问题答案: 在选项中使用索引。 您也可以跨多个字段执行此操作。 有关 更多详细信息和示例, 请参阅 文档中的 此部分 。 MongoDB索引可以有选择地施加一个 唯一的键约束 ,以确保不会插入任何索引键值与现有文档值匹配的文档。 如果希望从唯一