`
RandomSeed
  • 浏览: 1882 次
文章分类
社区版块
存档分类
最新评论

递归算法和文件队列算法----实现多级文件夹的遍历,删除和复制操作

阅读更多
递归算法和文件队列算法,均可实现多级文件夹的遍历、删除、和复制操作。现将这些方法封装在FolderTools工具类中。此外,文件队列的实现还需要类MyQueue<E>。
代码如下:

import java.util.LinkedList;

/**
 * 队列数据结构的模拟,用来实现队列的先进先出操作,并判断是否为空
 * @author rs
 * @param <E> 队列中存储数据的类型
 * @version 1.0
 */
public class MyQueue<E> {
	/**
	 * 私有成员变量,链表集合,用来模拟队列
	 */
	private LinkedList<E> queue;
	
	/**
	 * 无参构造方法, 初始化队列中的链表对象
	 */
	public MyQueue(){
		queue = new LinkedList<E>();
	}
	
	/**
	 * 入队操作, 将元素e添加到队列中
	 * @param e 要添加的元素
	 */
	public void add(E e){
		queue.addFirst(e);
	}
	
	/**
	 * 出队操作, 将队列头部的元素移除队列, 并返回该元素
	 * @return 被移除队列的元素
	 */
	public E remove(){
		return queue.removeFirst();
	}
	
	/**
	 * 判断队列是否为空
	 * @return 若为空, 返回true, 否则返回false
	 */
	public boolean isQueueEmpty(){
		return queue.isEmpty();
	}
}


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * 文件夹工具类, 实现多级(单级)文件夹的遍历, 删除, 复制等操作
 * @author rs
 * @version 1.0
 */
public final class FolderTools {
	/**
	 * 单个文件的复制操作
	 * @param sourFile 要被复制的文件对象
	 * @param destDir	复制后文件存放的目标路径
	 */
	public static void fileCopy(File sourFile, File destDir){
		if(sourFile == null || destDir == null) return;
		
		//在目标路径下创建被复制的文件
		File destFile = new File(destDir, sourFile.getName());
		//使用字节流完成任何文件的复制操作
		//创建字节输入流对象
		BufferedInputStream in = null;
		//创建字节输出流对象
		BufferedOutputStream out = null;
		try {
			in = new BufferedInputStream(new FileInputStream(sourFile));
			out = new BufferedOutputStream(new FileOutputStream(destFile));
			
			//使用字节数组开始频繁的读写操作
			byte[] by = new byte[1024];
			int len;
			while((len = in.read(by)) != -1){
				out.write(by, 0, len);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally{
			//释放资源
			closeFileResource(in, out);	
		}
	}
	
	/**
	 * 释放文件操作的资源
	 * @param in 字节输入流对象
	 * @param out 字节输出流对象
	 */
	private static void closeFileResource(InputStream in, OutputStream out){
		try {
			if(in != null){
				in.close();
			}
			if(out != null){
				out.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 使用递归算法遍历多级文件夹下的所有文件
	 * @param folder 要求遍历的文件夹
	 * @param fileList 用来存放文件夹中所有文件的列表集合
	 */
	public static void listAllFile_D(File folder, ArrayList<File> fileList){
		if(folder == null || fileList == null) return;
		
		//遍历某一级文件目录的所有文件目录, 如果是是文件,则添加到列表中, 否则继续递归遍历
		File[] files = folder.listFiles();
		for(File file : files){
			if(file.isFile()){
				fileList.add(file);
			}else{
				listAllFile_D(file,fileList);
			}
		}
	}
	
	/**
	 * 使用文件队列算法遍历多级文件夹下的所有文件
	 * @param folder 要求遍历的文件夹
	 * @return 返回存放所有文件的列表集合
	 */
	public static List<File> listAllFile_Q(File folder){
		if(folder == null) return null;
		
		//创建文件的列表集合, 用来存放文件, 并作为返回值返回
		ArrayList<File> fileList = new ArrayList<File>();
		//创建文件队列, 用来存放各级文件目录
		MyQueue<File> fileQueue = new MyQueue<File>();
		//首先把第一级文件目录添加到文件队列中
		fileQueue.add(folder);
		//遍历文件队列
		while(!fileQueue.isQueueEmpty()){
			//从文件队列中取出一个文件目录
			File dir = fileQueue.remove();
			//遍历该级文件目录
			File[] files = dir.listFiles();
			for(File file : files){
				if(file.isFile()){
					//如果是文件, 则添加到文件列表中
					fileList.add(file);
				}else{
					//如果是文件夹, 则添加到文件队列中
					fileQueue.add(file);
				}
			}
		}
		//返回文件列表
		return fileList;
	}
	
	/**
	 * 使用递归算法删除多级文件夹
	 * @param folder 要被删除的文件夹
	 */
	public static void deleteFolder_D(File folder){
		if(folder == null) return;
		
		//遍历文件目录
		File[] files = folder.listFiles();
		
		for(File file : files){
			if(file.isFile()){
				//如果是文件, 直接删除
				file.delete();
			}else{
				//如果是文件夹, 则递归删除
				deleteFolder_D(file);
			}
		}
		folder.delete();
	}
	
	/**
	 * 使用文件队列算法删除多级文件夹
	 * @param folder 要被删除的文件夹
	 */
	public static void deleteFolder_Q(File folder){
		if(folder == null) return;
		
		//创建文件队列, 将第一级文件夹添加到文件队列中
		MyQueue<File> fileQueue = new MyQueue<File>();
		fileQueue.add(folder);
		//遍历文件队列
		while(!(fileQueue.isQueueEmpty())){
			//从文件队列中取出一个文件夹
			File dir = fileQueue.remove();
			//遍历文件目录
			File[] files = dir.listFiles();
			//如果该目录为空,直接删除, 否则重新添加到队列中
			if(files.length == 0){
				dir.delete();//目录为空时,直接删除文件夹
			}else{
				fileQueue.add(dir);//不为空时,再次添加到队列中,并继续遍历
				for(File file : files){
					if(file.isFile()){
						file.delete();
					}else{
						fileQueue.add(file);
					}
				}
			}	
		}
	}
	
	/**
	 * 使用递归算法复制文件夹
	 * @param sourFolder 要被复制的文件夹
	 * @param destDir	复制后存放的目标路径
	 */
	public static void copyFolder_D(File sourFolder, File destDir){
		if(sourFolder == null || destDir == null) return;
		
		//创建目标路径下的单级文件夹
		File destfolder = new File(destDir, sourFolder.getName());
		destfolder.mkdir();
		
		//遍历某一级文件夹下的每一个文件目录, 如果是文件,则复制,如果是文件夹,则继续调用copyFolder()方法
		File[] files = sourFolder.listFiles();
		for(File file : files){
			if(file.isFile()){
				fileCopy(file, destfolder);
			}else{
				copyFolder_D(file, destfolder);
			}
		}
	}
	
	/**
	 * 使用文件队列算法复制多级文件夹
	 * @param sourFolder 要被复制的文件夹
	 * @param destDir 复制后存放的目标路径
	 */
	public static void copyFolder_Q(File sourFolder, File destDir){
		if(sourFolder == null || destDir == null) return;
		
		// 创建文件队列
		MyQueue<File> fileQueue = new MyQueue<File>();
		// 将被复制的文件添加到文件队列中
		fileQueue.add(sourFolder);

		// 获取要被复制文件夹的路径中除去文件夹名称之外的字符串
		// 如文件夹路径"E:\MyJavaStudy\JavaFileTest", 处理之后获得的字符串为"E:\MyJavaStudy\"
		int length = sourFolder.getAbsolutePath().length() - sourFolder.getName().length();
		String s = sourFolder.getAbsolutePath().substring(0, length);

		// 遍历文件队列
		while (!fileQueue.isQueueEmpty()) {
			// 从文件队列中拿出一个文件夹
			File dir = fileQueue.remove();

			// 确定目标文件夹的路径
			// 目标文件夹路径的字符串形式为      destPath的文件路径名 + dir的路径全名减去字符串s
			File path = new File(destDir.getAbsolutePath().concat(dir.getAbsolutePath().substring(s.length())));
			// 创建目标文件夹路径
			path.mkdirs();

			// 遍历文件夹, 获取所有的文件及文件夹
			File[] files = dir.listFiles();
			for (File file : files) {
				// 如果是文件,直接将文件复制到目标文件夹路径中
				if (file.isFile()) {
					fileCopy(file, path);// 将文件file复制到路径path下
				} else {
					// 如果是文件夹,则将该文件夹加入到文件队列中
					fileQueue.add(file);
				}
			}
		}
	}	
}



分享到:
评论

相关推荐

    遍历多级树状json获得父子节点值

    遍历多级树状JSON的基本思路是使用递归算法。递归是一种函数或过程调用自身的技术,非常适合处理具有层级关系的问题。以下是一个简单的递归函数模板,用于遍历树状JSON并获取指定的父子节点值: ```python def ...

    不用递归实现的无限级树型菜单

    这个文件中可能包含了前面提到的非递归算法实现,以及与`jquery.js`的交互逻辑。 至于`TreeImages`文件夹,它很可能包含了树型菜单的图标和其他视觉元素,如展开/折叠箭头,用于增强用户体验。 总的来说,这个解决...

    数据结构 算法实现(初学者使用)

    数据结构主要包括数组、链表、栈、队列、树、图等,而算法则涉及排序、查找、图遍历等一系列操作。对于初学者,了解这些基本概念并能动手实现是学习的重点。 描述中的“紧扣教材,适合刚学数据结构的人使用”进一步...

    数据结构算法实现(严蔚敏版配套实现程序)

    C语言实现通常涉及结构体定义,如单链表和双链表,以及插入、删除、遍历等操作。例如,ch01可能包含了链表的基本操作实现。 2. **栈与队列**:栈是后进先出(LIFO)的数据结构,而队列则是先进先出(FIFO)的。...

    数据结构与算法分析+C+++描述+第三版》答案

    根据提供的文件信息,我们可以推断出这是一本关于《数据结构与算法分析》(使用 C++ 实现)的书籍答案手册。以下是对该文件中提到的关键知识点进行详细解析: ### 数据结构与算法分析 #### 一、引言 在计算机科学...

    西北师范大学专升本招生.docx

    - 完全二叉树的顺序存储可以提高空间效率,二叉树的遍历算法有递归和非递归实现。 - 平衡二叉树如AVL树,通过平衡调整保持高效查找性能。 5. 图: - 图数据结构用于表示节点间的关系,包括邻接矩阵、邻接表等...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar )

    1113.6.3 文件出错标志和文件结束标志置 0 函数 206 13.7 C库文件 208 13.8 本章小结 第1篇 基本知识 第1章 C++的初步知识 *1.1 从C到C++ *1.2 最简单的C++程序 1.3 C++程序的构成和书写形式 1.4 C++...

    谭浩强C语言程序设计,C++程序设计,严蔚敏数据结构,高一凡数据结构算法分析与实现.rar

    1113.6.3 文件出错标志和文件结束标志置 0 函数 206 13.7 C库文件 208 13.8 本章小结 第1篇 基本知识 第1章 C++的初步知识 *1.1 从C到C++ *1.2 最简单的C++程序 1.3 C++程序的构成和书写形式 1.4 C++...

    最热门的Java 算法面试题汇总

    40. **红黑树**:红黑树是一种自平衡二叉查找树,保证了插入、删除和查找操作的时间复杂度为O(log n),同时允许节点是红色或黑色,以保持平衡。 掌握以上知识点,对于Java算法面试会有很大帮助,不仅可以提升解决...

    数据结构及应用算法教程(修订版)课件及答案

    数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便进行各种操作,如搜索、插入、删除等。严蔚敏和陈文博编著的《数据结构及应用算法教程(修订版)》是华中师范大学计算机专业...

    常用算法程序集(C语言描述)源代码.rar

    5. **递归算法**: - 通过函数调用自身来解决问题,例如计算阶乘、汉诺塔问题等。 6. **字符串处理**: - KMP算法:用于字符串匹配,避免了不必要的回溯。 - Rabin-Karp算法:使用滚动哈希值进行字符串匹配,...

    2005年苏州大学数据结构与操作系统考研试题.pdf

    - **递归与非递归实现**:遍历可以通过递归方式实现,也可以通过栈辅助实现非递归版本。 ##### 题目三:哈希表 **题目描述**:设计并实现一个哈希表,支持插入、查找和删除操作。 **解析**: - **哈希表的基本原理...

    数据结构与算法分析–C++描述(第3版)

    图的遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS),还有最小生成树(Prim或Kruskal算法)和最短路径问题(Dijkstra或Floyd-Warshall算法)。 7. **排序和查找**:排序算法包括冒泡排序、选择排序、插入...

    苏州大学2005计算机考研试题-----数据结构与操作系统

    链表的操作包括插入、删除,可能会考察单链表、双链表及其操作的实现。 3. **栈**:后进先出(LIFO)结构,常用于表达式求值、递归等问题。问题可能涉及栈的特性、运算符优先级和括号匹配。 4. **队列**:先进先出...

    数据结构与算法分析—描述

    指针可以用来创建动态数据结构,如链表、树等,并且在算法实现中起着重要作用,如在排序和查找算法中的指针交换和遍历。 总的来说,数据结构与算法分析是提升程序性能和解决复杂问题的基础。通过学习C语言中的数据...

    数据结构经典程序解析(含代码)

    数据结构是计算机科学中的核心概念,它涉及到如何有效地组织和管理数据,以便于高效地进行存储、检索、更新和删除等操作。这份“数据结构经典程序解析(含代码)”的内部资料,对于深入理解数据结构及其应用至关重要。...

    上海交大数据结构课件PDF-PPT

    8. **文件结构**:文件结构是如何在磁盘上组织大量数据,包括顺序文件、索引文件、直接文件和多级索引文件等,以及文件的读写操作。 9. **动态内存管理**:讨论如何在程序运行时动态分配和释放内存,包括堆的概念、...

    C语言学习路线详细描述规划.docx

    - **递归算法**:理解并编写递归算法,如阶乘、斐波那契数列。 13. **高级话题**: - **动态内存管理**:学习内存泄漏检测和内存分配策略。 - **位字段和数据对齐**:理解位字段的使用和数据对齐的重要性。 - *...

    数据结构-浙江大学-陈越.zip

    5. **文件结构**:如何在磁盘等外部存储介质上组织数据,包括顺序文件、索引文件、直接文件和多级索引。 6. **排序和查找**:快速排序、归并排序、冒泡排序、插入排序、选择排序、二分查找、线性查找等算法,以及...

Global site tag (gtag.js) - Google Analytics