递归算法和文件队列算法,均可实现多级文件夹的遍历、删除、和复制操作。现将这些方法封装在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并获取指定的父子节点值: ```python def ...
这个文件中可能包含了前面提到的非递归算法实现,以及与`jquery.js`的交互逻辑。 至于`TreeImages`文件夹,它很可能包含了树型菜单的图标和其他视觉元素,如展开/折叠箭头,用于增强用户体验。 总的来说,这个解决...
数据结构主要包括数组、链表、栈、队列、树、图等,而算法则涉及排序、查找、图遍历等一系列操作。对于初学者,了解这些基本概念并能动手实现是学习的重点。 描述中的“紧扣教材,适合刚学数据结构的人使用”进一步...
C语言实现通常涉及结构体定义,如单链表和双链表,以及插入、删除、遍历等操作。例如,ch01可能包含了链表的基本操作实现。 2. **栈与队列**:栈是后进先出(LIFO)的数据结构,而队列则是先进先出(FIFO)的。...
根据提供的文件信息,我们可以推断出这是一本关于《数据结构与算法分析》(使用 C++ 实现)的书籍答案手册。以下是对该文件中提到的关键知识点进行详细解析: ### 数据结构与算法分析 #### 一、引言 在计算机科学...
- 完全二叉树的顺序存储可以提高空间效率,二叉树的遍历算法有递归和非递归实现。 - 平衡二叉树如AVL树,通过平衡调整保持高效查找性能。 5. 图: - 图数据结构用于表示节点间的关系,包括邻接矩阵、邻接表等...
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++...
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++...
40. **红黑树**:红黑树是一种自平衡二叉查找树,保证了插入、删除和查找操作的时间复杂度为O(log n),同时允许节点是红色或黑色,以保持平衡。 掌握以上知识点,对于Java算法面试会有很大帮助,不仅可以提升解决...
数据结构是计算机科学中的核心课程,它探讨了如何在计算机中高效地组织和管理数据,以便进行各种操作,如搜索、插入、删除等。严蔚敏和陈文博编著的《数据结构及应用算法教程(修订版)》是华中师范大学计算机专业...
5. **递归算法**: - 通过函数调用自身来解决问题,例如计算阶乘、汉诺塔问题等。 6. **字符串处理**: - KMP算法:用于字符串匹配,避免了不必要的回溯。 - Rabin-Karp算法:使用滚动哈希值进行字符串匹配,...
- **递归与非递归实现**:遍历可以通过递归方式实现,也可以通过栈辅助实现非递归版本。 ##### 题目三:哈希表 **题目描述**:设计并实现一个哈希表,支持插入、查找和删除操作。 **解析**: - **哈希表的基本原理...
图的遍历算法包括深度优先搜索(DFS)和广度优先搜索(BFS),还有最小生成树(Prim或Kruskal算法)和最短路径问题(Dijkstra或Floyd-Warshall算法)。 7. **排序和查找**:排序算法包括冒泡排序、选择排序、插入...
链表的操作包括插入、删除,可能会考察单链表、双链表及其操作的实现。 3. **栈**:后进先出(LIFO)结构,常用于表达式求值、递归等问题。问题可能涉及栈的特性、运算符优先级和括号匹配。 4. **队列**:先进先出...
指针可以用来创建动态数据结构,如链表、树等,并且在算法实现中起着重要作用,如在排序和查找算法中的指针交换和遍历。 总的来说,数据结构与算法分析是提升程序性能和解决复杂问题的基础。通过学习C语言中的数据...
数据结构是计算机科学中的核心概念,它涉及到如何有效地组织和管理数据,以便于高效地进行存储、检索、更新和删除等操作。这份“数据结构经典程序解析(含代码)”的内部资料,对于深入理解数据结构及其应用至关重要。...
8. **文件结构**:文件结构是如何在磁盘上组织大量数据,包括顺序文件、索引文件、直接文件和多级索引文件等,以及文件的读写操作。 9. **动态内存管理**:讨论如何在程序运行时动态分配和释放内存,包括堆的概念、...
- **递归算法**:理解并编写递归算法,如阶乘、斐波那契数列。 13. **高级话题**: - **动态内存管理**:学习内存泄漏检测和内存分配策略。 - **位字段和数据对齐**:理解位字段的使用和数据对齐的重要性。 - *...
5. **文件结构**:如何在磁盘等外部存储介质上组织数据,包括顺序文件、索引文件、直接文件和多级索引。 6. **排序和查找**:快速排序、归并排序、冒泡排序、插入排序、选择排序、二分查找、线性查找等算法,以及...