避免Java 8 Files.walk(..)终止原因(java.nio.file.AccessDeniedException) [英] Avoid Java 8 Files.walk(..) termination cause of ( java.nio.file.AccessDeniedException )

查看:716
本文介绍了避免Java 8 Files.walk(..)终止原因(java.nio.file.AccessDeniedException)的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述


描述

Description

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

I am using Java 8 Files.walk(..) to count .mp3 files contained inside a folder and all the folders inside it . In other words i am visiting all the levels of the file tree.

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

When i get java.nio.file.AccessDeniedException the Stream closes , i don't want this behavior . I need it to ignore or print the exception and continue counting files . Below is the code i use :) :

           /**
             * 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错误:

StackTrace of error:



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)
...




类似的问题,虽然不一样,我需要返回一个流

在Java7中的FileWalking树中解决访问被拒绝

推荐答案

答案



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

Answer

Here is a temporary solution , which can be improved to use Java 8 Streams and 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) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

这篇关于避免Java 8 Files.walk(..)终止原因(java.nio.file.AccessDeniedException)的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆