Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java7中递归读取文件?_Java_File Io_Java 7 - Fatal编程技术网

如何在Java7中递归读取文件?

如何在Java7中递归读取文件?,java,file-io,java-7,Java,File Io,Java 7,我知道用Java处理文件目录的ApacheCommons IO库。但是,本文讨论了Java7中的本机支持 是否有人有使用Java 7递归列出/读取目录中文件的经验?使用 (我没有使用它的经验,但我只是在文档中找到了它,它看起来使用起来很简单。)。基本上,您实现了一个访问者,它可以在进入、退出目录和遇到文件时调用。支持确定文件是否为符号链接,以及跟随符号链接的选项(如果愿意)。快速阅读JavaPaths是什么可能很有用 在我的系统(Linux/Fedora)上,它运行良好;然而,我只是在测试它的功

我知道用Java处理文件目录的ApacheCommons IO库。但是,本文讨论了Java7中的本机支持

是否有人有使用Java 7递归列出/读取目录中文件的经验?

使用

(我没有使用它的经验,但我只是在文档中找到了它,它看起来使用起来很简单。)

。基本上,您实现了一个访问者,它可以在进入、退出目录和遇到文件时调用。支持确定文件是否为符号链接,以及跟随符号链接的选项(如果愿意)。快速阅读Java
Path
s是什么可能很有用


在我的系统(Linux/Fedora)上,它运行良好;然而,我只是在测试它的功能,并玩弄它。我没有强调测试它的性能或任何其他有意义的测量(除了“它工作”)。

@EdwinBuck…是的。我不确定您的评论试图解决什么问题。
Files.walkFileTree
返回一个
路径
,而路径本身不做任何事情。
FileVisitor
可以“漫游”路径
并“发现”路径
中的文件,可能会跳过不感兴趣的文件或子目录。您的解决方案是所需解决方案的一部分(因为它提供了
路径
部分),但是如果没有访问者,您将永远看不到
文件
@EdwinBuck
文件。walkFileTree
实际上返回“起始文件”,即您传递给它的路径。此外,如果没有
FileVisitor
,它是不可用的,因此如果不实现执行实际工作的
FileVisitor
,就不可能“使用
Files.walkFileTree
”。我链接到的文档中都非常清楚地说明了这一点。我认为这让我的答案足够了。仅链接的答案是重定向,devinb比我更能描述这些问题。你的答案足以找到答案,但实际上没有什么比devinb(修改后的)引用更好的了“我会带你去一个API信息亭,他们会为你提供答案和更多!“@EdwinBuck当一个人问“附近有人钓鱼吗?”时,我宁愿让他去钓鱼学校,也不愿给他一条鱼和一条海豚。”
import static java.nio.file.FileVisitResult.*;

public static class PrintFiles
    extends SimpleFileVisitor<Path> {

    // Print information about
    // each type of file.
    @Override
    public FileVisitResult visitFile(Path file,
                                   BasicFileAttributes attr) {
        if (attr.isSymbolicLink()) {
            System.out.format("Symbolic link: %s ", file);
        } else if (attr.isRegularFile()) {
            System.out.format("Regular file: %s ", file);
        } else {
            System.out.format("Other: %s ", file);
        }
        System.out.println("(" + attr.size() + "bytes)");
        return CONTINUE;
    }

    // Print each directory visited.
    @Override
    public FileVisitResult postVisitDirectory(Path dir,
                                          IOException exc) {
        System.out.format("Directory: %s%n", dir);
        return CONTINUE;
    }

    // If there is some error accessing
    // the file, let the user know.
    // If you don't override this method
    // and an error occurs, an IOException 
    // is thrown.
    @Override
    public FileVisitResult visitFileFailed(Path file,
                                       IOException exc) {
        System.err.println(exc);
        return CONTINUE;
    }
}
/*
 * Copyright (c) 2009, Oracle and/or its affiliates. All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 *
 *   - Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *
 *   - Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *
 *   - Neither the name of Oracle or the names of its
 *     contributors may be used to endorse or promote products derived
 *     from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
 * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 */

import java.io.*;
import java.nio.file.*;
import java.nio.file.attribute.*;
import static java.nio.file.FileVisitResult.*;
import static java.nio.file.FileVisitOption.*;
import java.util.*;

/**
 * Sample code that finds files that
 * match the specified glob pattern.
 * For more information on what
 * constitutes a glob pattern, see
 * http://docs.oracle.com/javase/javatutorials/tutorial/essential/io/fileOps.html#glob
 *
 * The file or directories that match
 * the pattern are printed to
 * standard out.  The number of
 * matches is also printed.
 *
 * When executing this application,
 * you must put the glob pattern
 * in quotes, so the shell will not
 * expand any wild cards:
 *     java Find . -name "*.java"
 */

public class Find {

    /**
     * A {@code FileVisitor} that finds
     * all files that match the
     * specified pattern.
     */
    public static class Finder
        extends SimpleFileVisitor<Path> {

        private final PathMatcher matcher;
        private int numMatches = 0;

        Finder(String pattern) {
            matcher =
                FileSystems.getDefault()
                    .getPathMatcher("glob:" + pattern);
        }

        // Compares the glob pattern against
        // the file or directory name.
        void find(Path file) {
            Path name = file.getFileName();
            if (name != null && matcher.matches(name)) {
                numMatches++;
                System.out.println(file);
            }
        }

        // Prints the total number of
        // matches to standard out.
        void done() {
            System.out.println("Matched: "
                + numMatches);
        }

        // Invoke the pattern matching
        // method on each file.
        @Override
        public FileVisitResult
            visitFile(Path file,
                BasicFileAttributes attrs) {
            find(file);
            return CONTINUE;
        }

        // Invoke the pattern matching
        // method on each directory.
        @Override
        public FileVisitResult
            preVisitDirectory(Path dir,
                BasicFileAttributes attrs) {
            find(dir);
            return CONTINUE;
        }

        @Override
        public FileVisitResult
            visitFileFailed(Path file,
                IOException exc) {
            System.err.println(exc);
            return CONTINUE;
        }
    }

    static void usage() {
        System.err.println("java Find <path>" +
            " -name \"<glob_pattern>\"");
        System.exit(-1);
    }

    public static void main(String[] args)
        throws IOException {

        if (args.length < 3 
            || !args[1].equals("-name"))
            usage();

        Path startingDir = Paths.get(args[0]);
        String pattern = args[2];

        Finder finder = new Finder(pattern);
        Files.walkFileTree(startingDir, finder);
        finder.done();
    }
}