练习题目代码如下:
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
/**
* Created by longforus on 8:50 PM 5/11/2016 .
* IDEA-Chapter20_28 .
* 把目录或文件作为参数传入 求其大小
*/
public class Chapter20_28 {
public static void main (String[] args) throws IOException {
System.out.println (getFormatSize (getSize (new File (args[0]))));
}
// public static long getSize (File file) {//递归求文件夹的大小
// long size = 0;
// if (file.isDirectory ()) {
// File[] files = file.listFiles ();
// for (int i = 0; i < files.length; i++) {
// size += getSize (files[i]);
// }
// } else {
// size += file.length ();
// }
// return size;
// }
public static long getSize (File file) {//迭代实现
long size = 0;
ArrayList<File> list = new ArrayList<> ();//运用了栈的原理
if (file.isDirectory ()) {
addToList (list, file);//是目录就把子目录入栈
} else {
size += file.length ();//是文件就加入总size内
}
while (! list.isEmpty ()) {//只要栈不空
File temp = list.remove (list.size () - 1);//取出栈顶处理
if (temp.isDirectory ()) {
addToList (list, temp);
} else {
size += temp.length ();
}
}
return size;
}
public static void addToList (ArrayList<File> list, File file) {//把file的内容入栈
File[] files = file.listFiles ();
for (int i = 0; i < files.length; i++) {
list.add (files[i]);
}
}
public static String getFormatSize(long size){//得到格式化字符串
double tempSize = size;
int n = 0;
String unit = "Byte";
while (tempSize > 1024) {
tempSize/=1024;
n++;
}
switch (n) {
case 1:
unit = "KByte";
break;
case 2:
unit = "MByte";
break;
case 3:
unit = "GByte";
break;
}
return String.format ("%.2f%s",tempSize,unit);
}
}
在这个例子中,递归实现确实比迭代实现要简单一些,
在自己实现迭代的时候,起先想到用树型结构,但是后面觉得空间的复杂度和遍历方面不是很理想,
后来想了一下想到了这个方法用栈来实现确实是比较理想的
应该还有更好的实现方法,原谅我还没有想到,
因为这个例子让我想了好久,才想到这个方法所以记在這里
经验还是很欠缺,脑子也不行啊