java - 减少Java的运行时间

原文 标签 java multithreading file search

我有一种从给定路径获取文件列表的方法。但是,如果我给D或C,大约需要20分钟才能获得所有文件列表。 Windows文件搜索约1.5分钟。我搜索了多线程vs,但是找不到有用的解决方案。

private static List<File> getFiles(String path) {

    File[] arrayOfFile1;
    File root = new File(path);

    File[] list = root.listFiles();

    if (list == null)
        return null;

    int j = (arrayOfFile1 = list).length;
    for (int i = 0; i < j; ++i) {
        File f = arrayOfFile1[i];

        if ((f.isDirectory()) && (!(f.getName().equals(".svn")))) {
            getFiles(f.getAbsolutePath());
        } else if (!(f.getName().equals(".svn"))) {
            sourceFiles.add(f.getAbsoluteFile());
        }
    }
    return sourceFiles;
}

最佳答案

如果使用Java 7,请使用FileVisitor

// "final" is necessary for below
final List<File> sourceFiles = new ArrayList<>();

Files.walkFileTree(Paths.get(path), new FileVisitor<Path>()
{
    @Override
    public FileVisitResult preVisitDirectory(final Path dir,
        final BasicFileAttributes attrs)
        throws IOException
    {
        return ".svn".equals(dir.getFileName())
            ? FileVisitResult.SKIP_SUBTREE
            : FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFile(final Path file,
        final BasicFileAttributes attrs)
        throws IOException
    {
        sourceFiles.add(file.getAbsolutePath().toFile());
        return FileVisitResult.CONTINUE;
    }

    @Override
    public FileVisitResult visitFileFailed(final Path file,
        final IOException exc)
        throws IOException
    {
        throw exc;
    }

    @Override
    public FileVisitResult postVisitDirectory(final Path dir,
        final IOException exc)
        throws IOException
    {
        return FileVisitResult.CONTINUE;
    }
});

关于java - 减少Java的运行时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22390488/

相关文章:

java - 这是使用ThreadPoolExecutor的正确方法吗?

c++ - 使用 asio 和 C++11 在接受或接收时优雅地停止线程以进行阻塞或非阻塞

c - 如何一次读取一行文件并将每一行传递给C语言中的结构?

java - 将int值存储到文本文件中并读取它?

java - 在ArrayList中移动元素

java - 子线程如何在Java中向主线程(方法)发送连续消息?

java - ObjectMapper必须使用JSON文件未提供的参数来调用Constructor

c - 当某个进程打开文件时, unlink() 会做什么?

java - MimePartBody.getDisposition()为嵌入式零件返回null

java - 在 Apache ServiceMix 中为 war 启用 CORS