`
MouseLearnJava
  • 浏览: 467159 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Java递归搜索指定目录下具有某个后缀名的所有文件

阅读更多

本文简单记录一下一个简单功能:递归搜索指定目录下具有某个后缀名的所有文件。

在JDK 1.7之前,我会使用类似如下的办法:

package my.utils.algorithm.files;

import java.io.File;
import java.util.ArrayList;
import java.util.List;

public class FileFinder {

	public static void main(String[] args) {
		FileFinder finder = new FileFinder();

		List<String> filenameList = new ArrayList<String>();

		finder.findFiles(".java" , "D:\\workspace\\AlgorithmUtils\\src", filenameList);

		/**
		 * 打印出结果
		 */
		for (String filename : filenameList) {
			System.out.println(filename);
		}
	}

	/**
	 * 寻找指定目录下,具有指定后缀名的所有文件。
	 * 
	 * @param filenameSuffix : 文件后缀名
	 * @param currentDirUsed : 当前使用的文件目录
	 * @param currentFilenameList :当前文件名称的列表
	 */
	public void findFiles(String filenameSuffix, String currentDirUsed,
			List<String> currentFilenameList) {
		File dir = new File(currentDirUsed);
		if (!dir.exists() || !dir.isDirectory()) {
			return;
		}

		for (File file : dir.listFiles()) {
			if (file.isDirectory()) {
				/**
				 * 如果目录则递归继续遍历
				 */
				findFiles(filenameSuffix,file.getAbsolutePath(), currentFilenameList);
			} else {
				/**
				 * 如果不是目录。
				 * 那么判断文件后缀名是否符合。
				 */
				if (file.getAbsolutePath().endsWith(filenameSuffix)) {
					currentFilenameList.add(file.getAbsolutePath());
				}
			}
		}
	}
	
}


输出结果:
D:\workspace\AlgorithmUtils\src\my\eclipse\serial\MyEclipseGen.java
D:\workspace\AlgorithmUtils\src\my\utils\algorithm\files\FileFinder.java
D:\workspace\AlgorithmUtils\src\my\utils\algorithm\files\FileUtils.java
D:\workspace\AlgorithmUtils\src\my\utils\algorithm\files\FileVisitorUtil.java
D:\workspace\AlgorithmUtils\src\my\utils\algorithm\sudoku\Main.java
D:\workspace\AlgorithmUtils\src\my\utils\algorithm\sudoku\SudokuPuzzleGenerator.java

如果使用的是JDK 1.7,那么Files.walkFileTree会是一个很好的选择。这个类位于java.nio.file包下,这个包是JDK 1.7中新增的。

样例代码如:
package my.utils.algorithm.files;

import java.io.IOException;
import java.nio.file.FileVisitResult;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.SimpleFileVisitor;
import java.nio.file.attribute.BasicFileAttributes;
import java.util.ArrayList;
import java.util.List;

public class FileVisitorUtil {
	public static void main(String[] args) throws IOException {
		
		Path startingDir = Paths.get("D:\\workspace\\AlgorithmUtils\\src");
		
		FindFileVisitor findJavaVisitor = new FindFileVisitor(".java");
		
		Files.walkFileTree(startingDir, findJavaVisitor);

		for (String name : findJavaVisitor.getFilenameList()) {
			System.out.println(name);
		}
	}
}

class FindFileVisitor extends SimpleFileVisitor<Path> {

	private List<String> filenameList = new ArrayList<String>();

	private String fileSuffix = null;

	public FindFileVisitor(String fileSuffix) {
		this.fileSuffix = fileSuffix;
	}

	@Override
	public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) {

		if (file.toString().endsWith(fileSuffix)) {
			filenameList.add(file.toString());
		}
		return FileVisitResult.CONTINUE;
	}

	public List<String> getFilenameList() {
		return filenameList;
	}

	public void setFilenameList(List<String> filenameList) {
		this.filenameList = filenameList;
	}


}


输出结果:
D:\workspace\AlgorithmUtils\src\my\eclipse\serial\MyEclipseGen.java
D:\workspace\AlgorithmUtils\src\my\utils\algorithm\files\FileFinder.java
D:\workspace\AlgorithmUtils\src\my\utils\algorithm\files\FileUtils.java
D:\workspace\AlgorithmUtils\src\my\utils\algorithm\files\FileVisitorUtil.java
D:\workspace\AlgorithmUtils\src\my\utils\algorithm\sudoku\Main.java
D:\workspace\AlgorithmUtils\src\my\utils\algorithm\sudoku\SudokuPuzzleGenerator.java
5
2
分享到:
评论

相关推荐

    计算某文件夹下的文件数,依据某个后缀名计算文件数,去掉某个后缀名计算文件数

    标题和描述中提到的"计算某文件夹下的文件数,依据某个后缀名或多个后缀名计算文件数,去掉某个后缀名计算文件数"就是这样的一个场景。下面我们将详细讨论如何实现这个功能。 首先,我们需要遍历指定文件夹及其子...

    Java实现的模糊匹配某文件夹下的文件并删除功能示例

    使用 `File` 类的 `listFiles()` 方法可以获取给定路径下所有文件和子文件夹的数组。这使得我们能够遍历文件夹中的每一个文件或子文件夹。 3. **删除文件**: 删除文件的操作由 `deleteFile()` 方法完成。`File` ...

    JAVA获取同一路径下所有子类或接口实现类

    在Java编程中,有时我们需要获取特定路径下所有实现了某个接口或者继承了某个类的子类。这个场景在大型项目中尤为常见,例如进行组件扫描、依赖注入或是单元测试时。在给定的代码示例中,它展示了如何通过Java来实现...

    快速的全盘查找文件源码

    例如,如果我们在寻找特定扩展名的文件,只需检查文件名的后缀即可。 搜索算法的效率直接影响查找速度。最简单的线性搜索(遍历所有文件)在大量文件时可能效率低下。更高效的算法如二分查找、哈希表或Trie树可以...

    Day36 Java的file类

    ##### 需求3:输出指定目录下的所有文件信息 如果需要列出当前项目根目录下的所有文件信息(只考虑当前目录,不考虑子目录),可以使用`listFiles()`方法。 ```java File dir = new File("C:\\"); File[] files = ...

    数据结构与算法java中文

    - 在某些情况下,虽然某个操作的最坏时间复杂度较高,但一系列操作的平均时间复杂度却较低。 #### 三、线性表 **3.1 线性表及抽象数据类型** - **定义**:线性表是一种基本的数据结构,每个元素有一个直接前驱和...

    word_match:该程序在给定的 2D 字母网格中搜索单词,如果匹配则返回 true

    5. **递归**:DFS算法通常采用递归实现,当在某个方向上找到单词的一部分时,继续向下搜索,直到找到整个单词或无法匹配为止。 6. **回溯**:在搜索过程中,如果发现当前路径无法匹配单词,需要回溯到上一步,尝试...

    Make 使用与makefile的编写

    - 默认情况下,make查找名为 `Makefile` 或 `makefile` 的文件。 - 可以通过 `-f` 参数指定其他文件名。 ##### 3.3 包含其他的Makefile文件 - 使用 `include` 指令可以引入其他文件。 - 示例: ``` include ...

    freemarker总结

    options:该参数可以省略,指定包含时的选项,包含encoding和parse两个选项,其中encoding指定包含页面时所用的解码集,而parse指定被包含文件是否作为FTL文件来解析,如果省略了parse选项值,则该选项默认是true. ...

Global site tag (gtag.js) - Google Analytics