-
2021-02-12 23:31:45
不使用FileFilter
public class PDFFinder {
public static void main(String[] args){
File directory = new File("c:\temp");
List pdfFiles = getAllPDFFiles(directory);
}
private static List getAllPDFFiles(File directory){
List files = new ArrayList();
if(!directory.isDirectory()){
return Collections.emptyList();
}
File[] listFiles = directory.listFiles();
for(File file : listFiles){
if(file.isFile() && file.getName().endsWith("pdf")){
files.add(file);
}
else {
files.addAll(getAllPDFFiles(file));
}
}
return files;
}
}
使用FileFilter
public class PDFFinder {
public static void main(String[] args){
File directory = new File("c:\temp");
List pdfFiles = getAllPDFFiles(directory);
}
private static List getAllPDFFiles(File directory){
List files = new ArrayList();
if(!directory.isDirectory()){
return Collections.emptyList();
}
File[] listFiles = directory.listFiles(new FileFilter(){
@Override
public boolean accept(File pathname){
if(pathname.isFile() && pathname.getName().endsWith("pdf")){
return true;
}
else { //include folders
return true;
}
}
});
File file = null;
for(int i = 0; i < listFiles.length; i++){
file = listFiles[i];
if(file.isFile()){
files.add(file);
}
else {
files.addAll(getAllPDFFiles(file));
}
}
return files;
}
}
文件排序
需求:文件夹在前,文件在后,并按照A-Z排列
Collections.sort(pdfFiles, new Comparator(){
@Override
public int compare(File obj1, File obj2){
if(obj1.isDirectory() && obj2.isFile()){
return 1;
}
else if(obj1.isFile() && obj2.isDirectory()){
return -1;
}
else{
return obj1.getName().compareTo(obj2.getName());
}
}
})
更多相关内容 -
Java文件夹遍历的两种方法
2021-03-13 06:22:50分别使用Java老IO和新IO实现文件夹遍历本文是原创文章,转载请注明出处哦。老IO遍历新IO遍历例如下面图片所示的文件目录结构: 老IO遍历使用Java老IO的API遍历文件夹及其子文件夹下的内容,主要用到递归算法,代码...分别使用Java老IO和新IO实现文件夹遍历
本文是原创文章,转载请注明出处哦。
老IO遍历
新IO遍历
例如下面图片所示的文件目录结构:
老IO遍历
使用Java老IO的API遍历文件夹及其子文件夹下的内容,主要用到递归算法,代码如下:
public static void oldIo(String pathStr) {
File file = new File(pathStr);
if (file.isDirectory()) {
System.out.println("Directory:" + file.getName());
for (String subFileStr : file.list()) {
oldIo(pathStr + "/" + subFileStr);
}
} else {
System.out.println("File:" + file.getName() + "|size:" + file.length());
}
}
新IO遍历
使用Java7新增的NIO.2的API遍历,代码如下:
public static void newIo(String pathStr) throws Exception {
Path root = Paths.get(pathStr);
Files.walkFileTree(root, new SimpleFileVisitor() {
@Override
public FileVisitResult preVisitDirectory(Path dir, BasicFileAttributes attrs) throws IOException {
System.out.println("Directory:" + dir.getFileName());
return super.preVisitDirectory(dir, attrs);
}
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
System.out.println("File:" + file.getFileName() + "|size:" + attrs.size());
return super.visitFile(file, attrs);
}
});
}
测试验证
编写main方法运行
public static void main(String[] args) throws Exception {
String pathStr = "F:/test";
System.out.println("===老IO遍历===");
oldIo(pathStr);
System.out.println("===新IO遍历===");
newIo(pathStr);
}
运行结果: =====老IO遍历===== Directory:test Directory:d1 Directory:d3 Directory:d5 File:f7.txt|size:0 File:f6.txt|size:0 Directory:d4 File:f3.txt|size:38 File:f4.txt|size:62 Directory:d2 File:f5.txt|size:0 File:f1.txt|size:40 File:f2.txt|size:0 =====新IO遍历===== Directory:test Directory:d1 Directory:d3 Directory:d5 File:f7.txt|size:0 File:f6.txt|size:0 Directory:d4 File:f3.txt|size:38 File:f4.txt|size:62 Directory:d2 File:f5.txt|size:0 File:f1.txt|size:40 File:f2.txt|size:0
-
JAVA实现遍历文件夹下的所有文件(递归调用和非递归调用)
2020-08-31 14:17:47本篇文章主要介绍了JAVA 遍历文件夹下的所有文件(递归调用和非递归调用) ,具有一定的参考价值,有兴趣的可以了解一下。 -
Java 文件夹遍历方法比较
2020-12-02 22:51:24// 测试量:44613个文件 34293个非文件夹 // 第一次测试耗时:6529 // 第二次测试耗时:6584 // 第一次测试耗时:6611 // 平均 6574 public static List<String> bl01_Dg(String path) { List<String> ...- 遍历方法1:递归遍历方法测试
缺点:遍历速度慢、遍历的文件的数量太多可能导致栈溢出
// 测试量:44613个文件 34293个非文件夹 // 第一次测试耗时:6529 // 第二次测试耗时:6584 // 第一次测试耗时:6611 // 平均 6574 public static List<String> bl01_Dg(String path) { List<String> result = new ArrayList<>(); File rootFile = new File(path); File[] files = rootFile.listFiles(); for (File file : files) { boolean flag = true; if (file.isDirectory()) { result.addAll(bl01_Dg(file.getAbsolutePath())); } else { result.add(file.getAbsolutePath()); } } return result; }
- 遍历方法2:链表代替递归的遍历方法测试
以链表增长代替递归
优点:使用的堆,不会导致栈溢出
缺点:比递归还慢// 测试量:44613个文件 34293个非文件夹 // 第一次测试耗时:7415 // 第二次测试耗时:7360 // 第一次测试耗时:7441 // 平均 7405 public static void bl02_LinkList(String dirPath) { TimeInterval time = DateUtil.timer(); List<String> result = new ArrayList<>(); List<File> list = new LinkedList<File>(); File dir = new File(dirPath); File[] file; list.add(dir); File tmp = null; //循环遍历链表 while (!list.isEmpty()) { //把链表的第一个记录删除 tmp = list.remove(0); File finalTmp = tmp; te(finalTmp, result, list); } System.out.println(time.interval()); // return result; System.out.println(result.size()); } public static void te(File tmp, List<String> result, List<File> list) { File[] file; //如果删除的目录是一个路径的话 if (tmp.isDirectory()) { //列出这个目录下的文件到数组中 file = tmp.listFiles(); if (file == null) { return; } //遍历文件数组 for (int i = 0; i < file.length; i++) { if (file[i].isDirectory()) { list.add(file[i]); } else { result.add(file[i].getAbsolutePath()); } } } else { result.add(tmp.getAbsolutePath()); } }
- 遍历方法3:递归多线程遍历
网上查的方法,一个线程来控制其他线程的遍历
优点:3-4倍提升遍历速率
缺点:仍然会导致栈溢出,小数据量遍历ok// 测试量:44613个文件 34293个非文件夹 // 第一次测试耗时:2150 // 第二次测试耗时:2877 // 第一次测试耗时:2223 // 平均 2416 class FileSearcher2 implements Runnable { final ThreadPoolExecutor executorService; final ExecutorCompletionService completionService; final File folder; //任务启动时间 final long startTime; long currentTime; long elapsedTime; public FileSearcher2(File folder) { this.folder = folder; this.startTime = System.currentTimeMillis(); this.currentTime = System.currentTimeMillis(); // 遍历线程池对象 executorService = (ThreadPoolExecutor) Executors.newFixedThreadPool(Runtime.getRuntime().availableProcessors() + 1); completionService = new ExecutorCompletionService(executorService); } @Override public void run() { //遍历用户目录下所有文件,但查找到指定文件 //当前线程负责纷发需要检索目录 final AtomicInteger searchCount = new AtomicInteger(); completionService.submit(new FileSearchWorker(completionService, executorService, folder, searchCount)); try { Future<SearchResult> result; int resultCount = 0; int fileCount = 0; final long l = System.currentTimeMillis(); while (null != (result = completionService.take())) { SearchResult searchResult = result.get(); fileCount += searchResult.totalCount; resultCount += searchResult.result.size(); //当原子计数器为0时,代表当前检索任务完成 if (0 == searchCount.get()) { executorService.shutdownNow(); break; } } System.out.println("最终结果-耗时:" + (System.currentTimeMillis() - l) + " 当前共扫描文件:" + fileCount + "个" + ",搜索结果:" + resultCount + "个"); } catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); } System.out.println("扫描任务完成!"); } } class FileSearchWorker implements Callable<SearchResult> { final ExecutorCompletionService completionService; final ThreadPoolExecutor executorService; final AtomicInteger searchCount; final File folder; int fileCount; public FileSearchWorker(ExecutorCompletionService completionService, ThreadPoolExecutor executorService, File folder, AtomicInteger searchCount) { this.completionService = completionService; this.executorService = executorService; this.searchCount = searchCount; this.folder = folder; } @Override public SearchResult call() { //当前扫描计数 this.searchCount.incrementAndGet(); //开始扫描 final List<File> result = new ArrayList<>(); startSearch(folder, result); //在所有工作目录队列内,移除当前工作目录,当工作目录为空则,代表所有的遍历任务完成,这里或许有更好的设计 // 只是因为CompletionService需要一个任务执行完成状态 this.searchCount.decrementAndGet(); return new SearchResult(result, fileCount); } /** * 正常线程检索 * * @param file */ void startSearch(File file, List<File> result) { if (file.isDirectory()) { File[] files = file.listFiles(); for (int i = 0; i < files.length; i++) { if (executorService.getActiveCount() < executorService.getCorePoolSize() && files[i].isDirectory()) { //当前线程池有未工作线程,启动新的工作任务,这个新的线程会抢占当前线程想要遍历的目录,而当前目录则跳过此目录继续遍历其他目录 //以此达到只要线程池有线程不工作,其他线程在遍历时检测到了,立即分配一个目录给其遍历的目的,尽可能提升线程间协同遍历 completionService.submit(new FileSearchWorker(completionService, executorService, files[i], searchCount)); } else { startSearch(files[i], result); } } } else { result.add(file); } fileCount++; } } class SearchResult { final List<File> result; final int totalCount; public SearchResult(List<File> result, int totalCount) { this.result = result; this.totalCount = totalCount; } }
- 遍历方法4:多线程链表代替递归的遍历方法测试
广度优先
根据遍历方法3的思想,对遍历方法2进行的改进,通过多线程遍历链表
优点:相比前四个方法遍历速率最快,文件层级较少时速率也很快
缺点:列表接收、线程池管理部分可以再优化// 测试量:44613个文件 34293个非文件夹 // 第一次测试耗时:1882 // 第二次测试耗时:1832 // 第一次测试耗时:1904 // 平均 1872 调用:new FileSearcher2(new File(path)).run(); public static void bl04_MuilTLinkList(String dirPath) { TimeInterval time = DateUtil.timer(); ExecutorService executor = Executors.newFixedThreadPool(20, new ThreadFactory() { @Override public Thread newThread(Runnable r) { Thread thread = new Thread(r); thread.setName("serverUpload_executor"); return thread; } }); List<String> result = Collections.synchronizedList(new ArrayList<>()); List<File> list = Collections.synchronizedList(new LinkedList<>()); File dir = new File(dirPath); File[] file; list.add(dir); File tmp = null; //循环遍历链表 while (!list.isEmpty() || ((ThreadPoolExecutor) executor).getActiveCount() != 0) { if (list.isEmpty()) { continue; } //把链表的第一个记录删除 tmp = list.remove(0); File finalTmp = tmp; executor.execute(new Runnable() { @Override public void run() { te2(finalTmp, result, list); } }); } executor.shutdownNow(); System.out.println(time.interval()); // return result; System.out.println(result.size()); }
- 遍历方法5:Nio Files.walkFileTree()方法
深度优先
优点:速度巨快,比上面所有都快,层级越多,相比其他方法速度越明显
缺点:jdk1.7以上提供,数据量较小时效率不高// 测试量:44613个文件 34293个非文件夹 // 第一次测试耗时:1704 // 第二次测试耗时:1662 // 第一次测试耗时:1633 // 平均 1666 public static void bl01_walk(String path) throws IOException { TimeInterval time = DateUtil.timer(); List<String> result = new ArrayList<>(); Files.walkFileTree(Paths.get(path), new SimpleFileVisitor<Path>() { @Override public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) { result.add(file.toString()); return FileVisitResult.CONTINUE; } }); System.out.println(time.interval()); System.out.println(result.size()); }
-
Java遍历文件夹下所有文件并重新命名
2020-08-24 19:32:22主要为大家详细介绍了Java遍历文件夹下所有文件并重新命名,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 -
java文件夹遍历包括子文件夹的遍历和删除
2018-04-04 00:03:31------------------------------java文件夹遍历包括子文件夹的遍历和删除-------------------------- 递归就是方法调用方法自身,递归一定有条件跳出。 如何使用递归的计算方式计算阶乘 5!= 5*4*3*2*1 .. N!= ...------------------------------java文件夹遍历包括子文件夹的遍历和删除--------------------------
递归就是方法调用方法自身,递归一定有条件跳出。
如何使用递归的计算方式计算阶乘
5!= 5*4*3*2*1
..
N!= n*(n-1)
例子:
public class FileDemo8 {
public static void main (String[] args) throws IOException {
intresult = fn(5);
System.out.println(result);
//输出结果为120
}
/**
* n!= n * (n-1)
* 递归计算阶乘
*
*/
public static int fn(int n) {
if(n >= 2 ) {
//对方法自身的调用
return n * fn(n-1);
}
return 1;
}
}
----------------------------------------
练习:利用递归打印文件夹下所有的子文件。
package cn.tx.file;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class FileDemo9 {
//判断文件夹在第几层
public static int level = 1;
public static void main (String[] args) throws IOException {
File file = new File("E:/李昆鹏/java/javaseWord文件");
//打印文件夹下所有文件包括子文件夹中的文件
printFile(file);
//输出结果
/* 2018年3月24日
java对象比较和TreeSet.docx
java文件夹遍历.docx
java文件构造器.docx
java的Array工具类.docx
java的Map介绍和添加.docx
java的Map的子类.docx
java的set集合和子类HashSet.docx
java的扑克牌测试题.docx
java的集合工具类.docx
~$va文件夹遍历.docx
~$va文件构造器.docx
~$va的Map的子类.docx
2018年3月24日前
Eclipse中debug的使用.docx
Eclipse代码自动生成.docx
Eclipse工程导入和删除.docx
Eclipse快捷键使用.docx
Eclipse的使用和异常.docx
Eclipse视图介绍.docx
java中包装类概述.docx
java中自动装箱、拆箱和包装类默认值问题.docx
java字符串判断方法.docx
java字符串概述.docx
java字符串的作业题字符串分解.docx
java字符串的特殊功能.docx
java字符串获取.docx
java异常分类和处理.docx
java权限修饰符.docx
java的Collection常用方法.docx
java的List实现类.docx
java的List集合.docx
java的StringBuffer可变字符串.docx
java的StringBuffer可变字符串的追加.docx
java的System类常用方法.docx
java的日历类.docx
java的日期类Date.docx
java的随机数.docx
java编译期的异常处理.docx
java迭代器.docx
java集合.docx
java集合中泛型的使用.docx
object的方法.docx
object的概述.docx
BAT面试题.txt
java飞机小项目
java飞机小项目总结.docx
java飞机小项目第一步建主窗口.docx
java飞机小项目第七步面向对象重构飞机类的键盘控制代码.docx
java飞机小项目第三步线程内部类实现动画.docx
java飞机小项目第九步矩形检测原理.docx
java飞机小项目第二步图形和文本绘制.docx
java飞机小项目第五步面向对象思想重构飞机类设计.docx
java飞机小项目第八步炮弹类设计_任意角度飞行.docx
java飞机小项目第六步键盘控制游戏物体原理.docx
java飞机小项目第十一步飞机死亡计时功能.docx
java飞机小项目第十步爆炸类_图片数组轮播处理 - 副本.docx
java飞机小项目第四步创建游戏物体根类的实现.docx
飞机小项目图片
imges
backdrop.jpg
boon1.jpg
boon10.jpg
boon11.jpg
boon12.jpg
boon13.jpg
boon14.jpg
boon2.jpg
boon3.jpg
boon4.jpg
boon5.jpg
boon6.jpg
boon7.jpg
boon8.jpg
boon9.jpg
bullet.jpg
plane.png
timg.jpg
简历介绍.docx
*/
}
/**
*
* 遍历文件夹下的所有文件
*
*/
public static void printFile(File file) {
//判断文件是否是文件夹
if(!file.isDirectory()){
//返回值是void的时候,方法中的return代表程序结束
return;
}
if(!file.exists()){
return;
}
level++;
//遍历文件夹内部的文件
File[] files = file.listFiles();
for(Filef : files) {
//打印缩进
for(int i = 0; i < level; i++) {
System.out.print("\t");
}
//遍历文件
//System.out.println(f);
//遍历文件名
String name = f.getName();
System.out.println(name);
//判断是否是文件夹
if(f.isDirectory()){
//调用递归打印文件夹中的文件夹
printFile(f);
}
}
level--;
}
}
-----------------------------------------------
练习: 如何删除一个文件夹下的所有文件(不包括目录)?
public class FileDemo10 {
public static void main (String[] args) throws IOException {
File file = new File("aa");
//删除文件夹下所有文件包括子文件夹中的文件(不包括文件夹)
deleteFile(file);
}
/**
*
* 遍历文件夹下的所有文件
*
*/
public static void deleteFile(File file) {
//判断文件是否是文件夹
if(!file.isDirectory()) {
//返回值是void的时候,方法中的return代表程序结束
return;
}
if(!file.exists()) {
return;
}
//遍历文件夹内部的文件
File[] files = file.listFiles();
for(File f : files) {
//判断是否是文件
if(f.isFile()) {
//删除文件
f.delete();
}else {
//如果是文件夹就调用递归来对文件夹中的文件进行删除
deleteFile(f);
}
}
}
}
---------------------------------------------------
练习:如何删除一个文件夹下所有的文件(包括目录)
public class FileDemo10 {
public static void main (String[] args) throws IOException {
File file = new File("aa");
//删除文件夹下所有文件包括子文件夹中的文件(包括文件夹)
deleteFile(file);
}
/**
*
* 遍历文件夹下的所有文件
*
*/
public static void deleteFile(File file) {
//判断文件是否是文件夹
if(!file.isDirectory()) {
//返回值是void的时候,方法中的return代表程序结束
file.delete();
return;
}
if(!file.exists()) {
return;
}
//遍历文件夹内部的文件
File[] files = file.listFiles();
for(File f : files) {
//判断是否是文件
if(!f.isFile()) {
//如果不是文件就调用递归删除
deleteFile(f);
}
//删除文件
f.delete();
}
}
}
-
Java中遍历文件夹的2种方法
2021-02-12 12:49:37java遍历文件夹的两种办法:A. 不使用递归import java.io.File;import java.util.LinkedList;public class FileSystem {public static void main(String[] args) {long a = System.currentTimeMillis();LinkedList ... -
Java 遍历文件夹
2021-01-04 17:14:09* 遍历文件夹的所有文件 */ public class Dirtest { public static void main(String[] args) { // 找到文件 相对路径 File file = new File("src"); Dirtest dirtest = new Dirtest(); d. -
java遍历删除文件夹
2021-02-12 19:58:08if (files.length == 0) { System.out.println("文件夹是空的!"); return; } else { for (File file2 : files) { if (file2.isDirectory()) { System.out.println("文件夹:" + file2.getAbsolutePath()); if(file2.... -
Java 遍历文件夹内文件
2019-04-01 01:11:36NULL 博文链接:https://dietime1943.iteye.com/blog/1405929 -
Java实现遍历删除文件夹下的目标类型文件
2022-01-20 11:11:40原因:最近公司私服仓库依赖过少,导入大量本地依赖,导致mvn-install失败,原因是每个依赖中有一个 .remote.repositories 文件,指向私服仓库文件,导致手动引入的依赖jar和pom文件无法识别解析,使用Java编写一个... -
java递归遍历文件夹下所有文件
2020-07-27 14:43:44java遍历文件夹下所有文件,java按照要求遍历文件夹下所有文件,java获取目录下的指定类型文件,java按文件类型获取文件 -
JAVA 遍历文件夹下文件并更改文件名称
2021-03-01 06:50:24周末因为一些原因,需要批量更改一些文件的名称,使其随机,就随手写了点代码。增加一个随机字母:public static void changeName(String path){File file = new File(path);File[] files = file.listFiles();... -
Java 递归遍历一个文件夹下的所有文件
2021-09-23 00:09:22public class ListFile { public static void ... getFiles("C:\\Users\\86187\\Desktop\\JAVA-testproject\\Annotation\\src\\org\\lq"); } public static void getFiles(String path) { // 1、创建File对象 .. -
java 遍历文件夹并且输出json 结构
2021-12-21 15:13:46@Test public void test0001(){ String dir = "d:\\png"; HashMap<String, Object> hashMap = traverseDir(dir); System.out.println(JSON.toJSONString(hashMap)); ... traverseDir(Str... -
java中遍历某个目录下的所有文件及文件夹中的文件
2013-12-15 12:42:40本代码简单实现,遍历某个目录下的所有文件,并列出文件路径 -
Java 递归遍历文件夹及子文件夹中文件
2021-07-05 09:53:55话不多说,直接上代码 import java.io.File; public class file { public static void main(String[] args){ ... //使用递归遍历文件夹及子文件夹中文件 public static void filesDirs(File file){ //Fil... -
Java 遍历文件夹,文件读写
2019-03-05 16:06:00遍历文件夹,输出文件夹下的所有文件和文件名: import java.io.File; public class Scaner { public static void main(String[] args) { printFiles(new File("E:\\practice\\ReadFileProperty"), 1);... -
java遍历文件夹解析XML.doc
2019-03-25 01:03:26NULL 博文链接:https://ningwuyu.iteye.com/blog/1138554 -
Java 遍历文件夹的几种方式
2021-02-12 09:18:40最近面试的时候被问及,使用非递归的方式遍历文件夹下的所有文件。由于之前没有写过,当时卡了一下,最后也没给出好的方案。从计算机的角度看,文件夹的数据结构就是多叉树(Tree),而树的遍历方式有两种:深度优先... -
Java遍历文件夹下的所以文件
2021-03-17 21:39:30利用Java递归遍历文件夹下的所以文件,然后对文件进行其他的操作。如:对文件进行重命名,对某一类文件进行重编码。可以对某一工程下的全部.java文件进行转码成utf-8等代码如下,这里只对文件进行重命名操作package ... -
按所有的文件夹在前的方式进行排序 - 处理java中使用遍历的文件下的内容
2021-03-09 08:24:59发现遍历的文件夹和文件排列的顺序是乱的(按时间排序的)于是想到了要自己去实现排序。 于是就在网上早了下代码。发现可以通过 Collections.sort于是就想到了使用自己去重写 compare来实现排序。下面是排序的代码。... -
Java实现遍历文件
2019-05-14 20:50:531.以遍历.js文件为例: public static void main(String[] args) { File f = new File("C:/"); String fileList[] = f.list(); // 调用不带参数的list()方法 for (int i = 0; i < fileList.length; i++) {... -
java 循环遍历文件夹下面的所有文件
2021-02-27 18:42:59import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.Fi... -
Java递归遍历文件夹显示为树形菜单
2022-03-31 18:01:48import java.util.List; import java.util.Map; public class TreeVo { private List<TreeVo> children; private String filename; public TreeVo(String filename){ this.filename=filename; } public ... -
【算法】2.遍历实现文件夹遍历
2022-01-20 16:28:46目录 一、解法思路 ...3.之后遍历这个数组,如果是文件就直接打印文件名,是文件夹的话再调用这个方法 4.直到这个文件夹数组的长度为0时,reterurn; 二、完整代码 package p5.分治回溯; import ja... -
Java遍历文件夹的2种方法
2021-03-03 13:07:21本文由广州疯狂软件java培训分享:A.不使用递归:import java.io.File;import java.util.LinkedList;public class FileSystem {public static void main(String[] args) {long a = System.currentTimeMillis();...