最近在做个两台机器通过socket传目录的功能,在传的过程中需要展示进度条,所以进度的展示总需要先统计文件数或文件的大小才能展现,递归的实现就不能用了。
后来是通过先把目录下所有的文件和文件夹列一遍,放到两个List中,另一端按照相应的结构创建目录,再接收传来的socket。
所以顺手又写了写递归与非递归处理目录的代码。
public void recursiveDeleteDir(String dir) {
File f = new File(dir);
if(f.isFile()) {
f.delete();
return;
}
File[] files = f.listFiles();
for(int i=0; i< files.length; i++) {
if(files[i].isDirectory()) {
if(files[i].list().length == 0) {
files[i].delete();
}else {
recursiveDeleteDir(files[i].getAbsolutePath());
}
} else {
files[i].delete();
}
}
}
public void nonRecursiveDeleteDir(String dir) {
File f = new File(dir);
if(f.isFile()) {
f.delete();
return;
}
LinkedList<File> list = new LinkedList<File>();
list.add(f);
while(list.size() > 0 ) {
File temp = list.removeFirst();
File[] files = temp.listFiles();
for(int i=0;i < files.length; i++) {
if(files[i].isDirectory()) {
if(files[i].listFiles().length == 0) {
files[i].delete();
}else {
list.add(files[i]);
}
}else {
files[i].delete();
}
}
}
}
///////////////////以下为递归拷贝//////////////////////////////
public void recursiveCopyDir(String src, String dest) {
File f = new File(src);
String[] files = f.list();
for(int i=0; i<files.length; i++) {
File temp = new File(src,files[i]);
if(temp.isDirectory()) {
File t = new File(dest,files[i]);
if(!t.exists()) {
t.mkdirs();
}
recursiveCopyDir(temp.getAbsolutePath(),new File(dest,files[i]).getAbsolutePath());
}else {
try {
FileInputStream fis = new FileInputStream(temp);
FileOutputStream fos = new FileOutputStream(new File(dest,files[i]));
byte[] b = new byte[1024];
int x = -1;
while( (x = fis.read(b)) != -1) {
fos.write(b);
}
fos.flush();
fis.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public void nonRecursiveCopyDir(String src, String dest) {
File f = new File(src);
LinkedList<File> list = new LinkedList<File>();
list.add(new File(src));
while(list.size() > 0) {
File removed = list.removeFirst();
File[] fik = removed.listFiles();
for(int i=0; i< fik.length; i++) {
String subpath = fik[i].getAbsolutePath().substring(src.length());
File destFile = new File(dest +subpath);
if(fik[i].isDirectory()) {
if(!destFile.exists()) {
destFile.mkdirs();
}
list.add(fik[i]);
}else {
try {
FileInputStream fis = new FileInputStream(fik[i]);
FileOutputStream fos = new FileOutputStream(destFile);
byte[] b = new byte[1024];
int x = -1;
while( (x = fis.read(b)) != -1) {
fos.write(b);
}
fos.flush();
fis.close();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
String[] files = f.list();
for(int i=0; i<files.length; i++) {
File temp = new File(src,files[i]);
if(temp.isDirectory()) {
File t = new File(dest,files[i]);
if(!t.exists()) {
t.mkdirs();
}
recursiveCopyDir(temp.getAbsolutePath(),new File(dest,files[i]).getAbsolutePath());
}else {
}
}
}
////////////////////////////////以下用于递归和非递归显示目录内容/////////////////////
public void recursiveDir(String dir) {
File f = new File(dir);
File[] files = f.listFiles();
for(File x : files) {
if (x.isDirectory()) {
recursiveDir(x.getAbsolutePath());
} else {
System.out.println(x.getAbsolutePath());
}
}
}
public void nonRecursiveDir(String dir) {
File f = new File(dir);
LinkedList<File> list = new LinkedList<File>();
list.add(f);
while(list.size() > 0) {
File file = list.removeFirst();
File[] files = file.listFiles();
for(File x : files) {
if (x.isDirectory()) {
list.add(x);
} else {
System.out.println(x.getAbsolutePath());
}
}
}
}
分享到:
相关推荐
空间复杂度方面,非递归实现主要取决于分区操作和栈的使用,而递归实现则依赖于递归深度,一般情况下都是O(log n)。 在实际编程中,可以根据具体需求选择非递归或递归实现。非递归版本更适合内存有限或者递归深度...
二叉树是一种重要的数据结构,它由节点组成,每个节点有两个子节点,分别称为左子节点和右子节点。在计算机科学中,二叉树遍历是访问...理解递归和非递归遍历的原理及其在二叉树操作中的应用,是提升编程能力的关键。
根据给定的信息,本文将详细解释二叉树的遍历方法,包括递归与非递归方式下的前序、中序、后序遍历,并简要介绍层次遍历的概念。 ### 二叉树简介 二叉树是一种常用的数据结构,其中每个节点最多有两个子节点,通常...
下面我们将深入探讨这两个算法的递归与非递归实现及其原理。 **快速排序** 快速排序是一种基于分治思想的排序算法,由C.A.R. Hoare在1960年提出。其基本步骤如下: 1. **选择枢轴元素(Pivot Selection)**:从待...
非递归实现的基本思想是将递归调用转化为循环,并使用数据结构(如堆栈)存储中间结果,避免了递归带来的调用栈溢出问题。 非递归实现的步骤大致如下: 1. 初始化一个堆栈,用于保存待处理的阿克曼函数参数对`(m, ...
这个问题通常用于展示递归和非递归算法的应用,这两种方法各有优缺点,适合不同的场景。 首先,我们要理解迷宫问题的基本设定。一个迷宫通常被表示为二维网格,其中每个单元格可以是通路(表示为1或true)或墙壁...
这个过程既可以用递归方式实现,也可以用非递归方式实现。 首先,让我们来看看递归版本的合并排序。递归算法的核心在于它的自相似性,即一个问题的解可以通过解决规模更小的相同问题得到。在合并排序中,我们首先将...
在本主题中,我们将深入探讨二叉树的三种主要遍历方法:中序遍历、前序遍历和后序遍历,以及如何通过递归和非递归的方式实现这些遍历。 首先,让我们理解递归遍历的概念。递归是一种解决问题的方法,它将问题分解为...
**递归与非递归的比较**: - **效率**:非递归通常比递归更高效,特别是在处理大量文件时,因为递归会导致更多的函数调用和堆栈操作。 - **内存使用**:递归可能消耗更多内存,因为它需要存储每个递归调用的信息,而...
非递归的先中後序, 计算出深度 结点数 /* 运行结果: ------------------------ 请先序输入二叉树(如:ab三个空格表示a为根节点,b为左子树的二叉树) ab c 先序递归遍历二叉树: a b c 先序非递归遍历二叉树: a b ...
- 非递归实现(使用栈):与前序遍历类似,但处理顺序不同。首先将根节点压入栈,然后进入循环。如果当前节点不为空,就将其压入栈并转向其左子节点;否则,从栈中弹出一个节点,访问它,然后如果它有右子节点,则...
本篇文章将详细介绍这三种遍历方法,并通过C语言实现递归和非递归版本。 1. 前序遍历(根-左-右) 在前序遍历中,我们首先访问根节点,然后遍历左子树,最后遍历右子树。递归实现非常直观,代码如下: ```c void...
本话题将深入探讨如何使用链式栈实现递归和非递归的迷宫路径求解方法,结合Java编程语言,以及深度优先搜索(DFS)策略。 首先,我们要理解链式栈是一种基于链表的数据结构,它支持栈的基本操作——压入(push)和...
以上就是关于VC++中递归与非递归算法遍历磁盘文件的基本介绍。学习这两种方法能帮助你更好地理解和操作文件系统,特别是在处理大量文件时。无论选择哪种方法,都要确保考虑到性能和内存消耗,并根据实际需求进行优化...
非递归算法解决了这个问题,提供了一个不同于传统递归解决方案的方法。对于n个圆盘的情况,非递归算法的核心在于通过交替执行两个步骤来移动圆盘: 1. **步骤1**:根据圆盘数量的奇偶性,按顺时针方向将圆盘1从当前...
本节将详细介绍二叉树的递归和非递归遍历方法,包括先序、中序、后序和层序遍历。 1. 先序遍历: 先序遍历的顺序是:根节点 -> 左子树 -> 右子树。递归实现中,我们首先访问根节点,然后递归地对左子树进行先序...
本文将深入探讨如何使用MIPS(Microprocessor without Interlocked Pipeline Stages,无互锁流水线级微处理器)架构来实现插入排序算法,包括递归和非递归两种方式,并结合实验报告来分析其性能和指令条数。...
在实际应用中,我们可以通过递归和非递归两种方法来实现这些遍历。 一、递归遍历 递归是一种函数调用自身的技术,对于二叉树遍历来说,递归方法简洁明了。 1. 前序遍历(根->左->右): - 首先访问根节点。 - ...
通过以上分析,我们可以看到,阿克曼函数的非递归实现主要涉及堆栈操作、递归转换以及对计算复杂性的理解。这个话题对于学习数据结构和算法的学生来说,是一个挑战性的实践项目,有助于提升他们的编程技能和对复杂...