黑马程序员---文件对象

------- Java、.NetAndroid培训期待与您交流!------- 

一、概述

        流只能操作数据。
        File对象操作被封装成文件的数据。

        1、用来将文件或者文件夹封装成对象。
        2、方便对文件和文件夹的属性信息进行操作。
        3File对象可以作为参数传递给流的构造方法,是文件和目录路径的抽象表现形式。

二、方法

File类常见方法:
1、创建。
        boolean createNewFile();在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立就创建文件。而且文件已经存在,会覆盖。 需要抛IOException

        boolean mkdir();创建文件夹。
        boolean mkdirs();创建多级文件夹。
2、删除。
        boolean delete();删除失败返回false。如果文件正在被使用,则删除不了返回false
        void deleteOnExit();在程序退出时删除指定文件。

3、判断。
        boolean exists();文件是否存在.
        boolean isFile();是文件吗
        boolean isDirectory();是目录吗
        boolean isHidden();是隐藏文件吗
        boolean isAbsolute();是绝对路径吗
        boolean canExcute();是可执行文件吗?

4、获取信息。
        String getName(); //获取文件名
        String getPath(); //获取相对路径
        String getParent(); //返回此抽象路径名父目录的路径名
        File getAbsoluteFile(); //返回此抽象路径名的绝对路径名,并封装成File类型
        String getAbsolutePath(); //获取绝对路径的字符串形式
        long lastModified(); //返回此抽象路径名表示的文件最后一次被修改的时间
        long length(); //获取长度

5、修改
        boolean rename(); //给文件重命名,也可以将文件改名后移动到其他盘符或文件夹中。
                如果被移动到的文件夹中已有同名文件,重命名不成功,且不会移动。

6File.separator(); //跨平台目录分隔符。
      File[] listRoots(); //获取机器的有效盘符。
      String[] list(); //返回该目录下的所有文件和文件夹(含隐藏),包括其路径表现形式。
      Sring[] list(FilenameFilter filter); //返回某一目录下指定类型的文件,FilenameFilter是一个接口类,过滤文件名。
      File[] listFiles(); //将返回的文件和文件夹封装成File对象,这样可以对File对象操作,如获取长度、父目录、相对路径等。

三、示例

示例1:文件名过滤:列出给定目录的所有.java文件

        public void showFileName(File dir)
        {
                String[] filenames = dir.list(new FilenameFilter()//匿名内部类
                {
                        public boolean accept(File dir,String name)//复写唯一方法,作用:提取某File对象中符合条件的内容,相当于过滤。
                        {
                                return name.endsWith(".java");//列出所有.java文件
                        }
                });
        }

示例2:列出指定目录下的所有文件和文件夹(带层次递归)

        因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。在列出过程中出现的还是目录的话,还可以再次调用本功能。也就是函数自身调用自身。这种表现形式或者编程手法,称为递归。

        递归要注意:
        1、一定要限定条件。
        2、要注意递归的次数,尽量避免内存溢出。

//递归方法
class DiGui extends Template<String>
{
	private String getLevel(int level)
	{
		StringBuilder sb = new StringBuilder();
		sb.append("|--");
		for (int i=0; i<level; i++)
			sb.insert(0,"   ");
		//System.out.println(sb.toString());
		return sb.toString();
	}
	public void showDir(File dir, List<String> list, int level)
	{
		list.add(getLevel(level)+dir.getName());
		level++;
		File[] files = dir.listFiles();
		
		for (File file : files)
		{
			if (file.isDirectory())
				showDir(file,list,level);
			else
				list.add(getLevel(level)+file.getName());
		}
		/*
		for(int x=0; x<files.length; x++)
		{
			if(files[x].isDirectory())
				showDir(files[x],list,level);
			else
				list.add(getLevel(level)+files[x].getName());
		}
		*/
	}
	public void writeFile(List<String> list, PrintWriter out)
	{
		for (String s : list)
		{
			out.println(s);
		}
		out.close();
	}
}
//模版设计模式
abstract class Template<T>
{
	public void getRuntime(File dir, List<T> list, int level)
	{
		long start = System.currentTimeMillis();
		showDir(dir,list,level);
		long end = System.currentTimeMillis();
		System.out.println(end-start);
	}
	public abstract void showDir(File dir, List<T> list, int level);
}

示例3:删除一个带内容的目录。
        原理:在window中,删除目录从里面往外删除的。既然是从里往外删除,就需要用到递归。

        public static void removeDir(File dir){
                File[] files = dir.listFiles();
  
                for(int x=0; x<files.length; x++)
                {
                        if(files[x].isDirectory( ))//若是目录继续递归
                                removeDir(files[x]);
                        else
                               System.out.println(files[x].toString()+":-file-:"+files[x].delete());
                }

                System.out.println(dir+"::dir::"+dir.delete());
        }

        总结:File对象比较简单,记住其方法即可。该章中涉及到了递归,在很多算法中也会用到递归,理解其意义,并注意递归的约束条件:一定要限定递归条件,否则可能后续递归将无法执行,或者会出现死循环。其次要注意递归次数,因为内存有限,若递归次数太多,则可能出现内存溢出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值