2006/8/24
file类 和
递归
File是文件名,目录名,其中主要的方法为。
1:isDirectory();是否是所给的路径是文件还是目录。
2:length();返回文件大小。
3:listFiles();返回目录中所有文件和目录。
4:exists();是否存在文件。
5:getName();得到文件名。
6:getPath();得到文件路径。
Import:
A:String args[];数组是指开始在内存申请空间。即原始空间。
题目:目录和文件的显示。
(个人想法)一般思路:
{Arrays.Sort(list,new FileNameSorter());对文件对象排序,必须规定目录比文件“小”
for( )从内存中对 文件名称;
if( ) 判断路径是文件还是目录;
else( )否则直接打印出list[i]
}
{
构造对象File确定目录。
判断原始内存长度
File=new File(args[0]);
判断文件是否存在和路径是否是文件还是目录。
}
递归~~~首先得解决超出内存的问题。OutofMemoryError异常(不能被解决) 。不需要try( )catch( )是指错误可以被解决。
比如:public class Bat
{
public static void main(String args[])
{
byte [] BT = new byte[100*1024*1024];//内存空间不够回产生益处
System.out.println(BT);
}
}
通俗的就说就是,自己调用自己。递归能解决循环问题,每调用一次,减少一次的思想。
其中还有个重点~~~利用了堆栈的原理,(这在第三例子的display()方法)。
!!!!!!!其次有两个很重要的解决方案:
1:做这次任务的关键算法,和推算出关键步骤下步的值。
2:将值传给下一级算法,然后调用关键算法。
今天必须代码:
1:公约数和2:移盘 3:打印目录
第一题目
//实现公约数既数学。12与3的公约数是12-3=9,9-3=6,6-3=3,3-3=0,公约数为3
public class YueShu
{
public static int ys(int num1,int num2)
{
if(num1 == num2 )
{
return num1;
}
return ys(abs(num1-num2),min(num1,num2));//经典的地方,递归!
}
public static int abs(int num)
{
return (num<0 ? -num : num);//判断绝对值
}
public static int min(int num1,int num2)
{
return (num1<num2 ? num1 : num2);//返回最小值
}
public static void main(String args[])
{
System.out.println(ys( 54,12));
}
}
第2题目
//意思为移木积
public class YiMoKuai
{
public static void YiFa(int n,String a,String b,String c)
{
if(n == 1)
{
System.out.println(1+a+"-->"+c);
return;
}
YiFa(n-1,a,c,b);//经典代码,递归
Move(n,a,c);
YiFa(n-1,b,a,c);
}
public static String Move(int n,String a,String c)
{
return (n+a+"-->"+c);
}
public static void main(String args[])
{
YiFa(4,"A","B","C")
//System.out.println( YiFa(4,"A","B","C"));此出不可以打印,因为void的类型没有返回值
}
}
第3题目:本人不会做,只能理解它,看了两天,还要接着看。
import java.io.File;
class MainClass
{
public static void main(String [] args)
{
String strFile = "..";//目的是为了设目录起始位置
if(args.length != 0)//判断原始内存长度是否为0
{
strFile = args[0];//使原始内存替代目录,这样的作用是为了方便人们指定目录
}
File fFile = new File(strFile);//创建目录名对象
/*display(fFile);*/
new FileWrapper(fFile,false,null).display();//调用继承类方法,最后的null是指容器空
}
/*public static void display(File f)
{
System.out.println(f.getName());
if(f.isDirectory())
{
File [] subFiles = f.listFiles();
for(int i=0;i<subFiles.length;i++)
{
display(subFiles[i]);
}
}
}*/
}
class FileWrapper extends File
{
boolean bLast = false;//设置判断值 代表最后元素没有就为false
FileWrapper parent = null;//处始化parent即文件名
public boolean isLast()//这句代码就是判断是否是最后
{
return bLast;
}
public FileWrapper getParentWrapper()//返回类型FileWrapper注意
{
return parent;//返回文件名
}
public FileWrapper(File f,boolean bLast,FileWrapper parent)//注意~boolean必须用对象的模式传
{//构造方法,参数是文件对象,
super(f.getPath());//调用父类的,继承所有的。
this.bLast = bLast;//初始化其内的变量
this.parent = parent;
}
private String makePrefix()//返回一组符号
{
StringBuffer sbf = new StringBuffer();//定义储存容器
if(parent == null)//判断文件,是否没有?
{
return "";//返回空格
}
if(bLast)//判断是不是最后一个元素
{
sbf.append("─└");
}
else
{
sbf.append("─├");
}
makeParentPrefix(parent,sbf);//不是最后元素,则再处理
sbf.reverse();//反转
return sbf.toString();//返回文件前面图
}
private void makeParentPrefix(FileWrapper parent,StringBuffer sbf)//带参数(类,容器)
{
if(parent.getParentWrapper() != null)//判断对象不为空~~~
{
if(parent.isLast())//判断是否最后文件?
{
sbf.append(" ");
}
else
{
sbf.append(" │");
}
makeParentPrefix(parent.getParentWrapper(),sbf);//用到递归!
}
}
public void display()//典型的递归想法,利用了堆栈原理
{
System.out.println(makePrefix() + /*this.*/getName());//打印
if(this.isDirectory())//是否是所给的路径是文件还是目录
{
File [] subFiles = this.listFiles();//返回目录中所有文件和目录
for(int i=0;i<subFiles.length;i++)
{
if(i < subFiles.length-1)
{
new FileWrapper(subFiles[i],false,this).display();//递归
}
else
{
new FileWrapper(subFiles[i],true,this).display();//递归
}
}
}
}
}
个人理解的思路:见笑,见笑,
一开始就要思考用什么来代替最后一个目录文件名 很重要的思想用boolean来代替为最后一个文件名 对于继承类则File的方法有些得张开和重写
在继承的类中实现两个方法,一个构造,两个返回,
第一个方法解决“树”状的打印,(树的主干)
第2个方法解决文件名的查找打印
构造方法实现File类的扩展
返回1是树状的分支
返回2是文件名