最近在做个两台机器通过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());
}
}
}
}
分享到:
相关推荐
非递归的先中後序, 计算出深度 结点数 /* 运行结果: ------------------------ 请先序输入二叉树(如:ab三个空格表示a为根节点,b为左子树的二叉树) ab c 先序递归遍历二叉树: a b c 先序非递归遍历二叉树: a b ...
二叉树遍历的非递归操作二叉树遍历的非递归操作
包含了二叉树的递归与非递归的先序、中序、后序遍历以及层次遍历和求叶子节点数所有基本的操作。
主要介绍了Python基于递归和非递归算法求两个数最大公约数、最小公倍数,涉及Python递归算法、流程循环控制进行数值运算相关操作技巧,需要的朋友可以参考下
二叉树的基本操作,包括前序、中序、后序遍历的递归和非递归算法,不得不下的资源
本例程包括单向的链表的创建,递归、非递归的方法实现链表的逆置操作,从底层分析了链表逆置的过程,分析理解程序的关键在于理解指针是存放地址值的变量,对学习C/C++编程的同学有极大的帮组。
java语言实现的二叉树的各种操作(包括递归与非递归遍历二叉树,求二叉树的高度,节点总数,叶子节点等)
数据结构源码C语言描述续,前面上传文档描述了二叉树的递归算法,本篇描述了二叉树三叉链表的非递归操作,以及测试程序:
C语言,将一个递归程序用栈改写为非递归,其中用到栈的基本操作
二叉树的基本操作,C语言编码,包括二叉树的创建,非递归先序中序和后序遍历,叶子结点的数目以及求树的高度
自己写的相当全的二叉树函数操作集合,包括二叉树的递归遍历和非递归遍历,以及计算二叉树的深度和叶子节点等
用非递归方法做的关于二叉树的 一些操作,存储结构用的是三叉链表,不过主要还是二叉树的东西。
二叉树非递归算法的实验 界面采用dos界面 实现了基本的功能操作
掌握二叉树的二叉链表存储结构;掌握二叉树的遍历规则;利用二叉树的二叉链表存储结构实现二叉树的建树操作;利用二叉树的二叉链表存储结构实现二叉树层次...设计并实现如下算法:后序递归建树,先序非递归遍历该树。
7.24③ 试利用栈的基本操作编写,按深度优先搜索策略 遍历一个强连通图的非递归形式的算法。算法中不规定具 体的存储结构,而将图Graph看成是一种抽象的数据类型。
汉诺塔(河内塔)的经典非递归算法 开天辟地的神勃拉玛(和中国的盘古差不多的神吧)在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不...
利用非递归的方式对一个二叉树进行操作 比如先序中序后序遍历
定义二叉树的存储结构,采用非递归算法实现二叉树的二叉树的先序、中序、后序和按层遍历。并实现求二叉树的深度、求总结点数、求叶子结点、查找某个结点等操作(可以采用递归)。
利用栈的基本操作实现二叉树的中序遍历非递归算法。
利用先序序列建立二叉树,数据以字符的形式传入;在建立的二叉树上完成遍历(递归遍历、非递归遍历、层序遍历)操作。