黑马程序员-IO(File文件操作)

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

 

File文件操作

流对象只能够操作文件,但是不能操作文件夹

File类的出现就弥补了流对象的缺点,因为file既能够操作文件,也能够操作文件夹

 

格式:

(1)File f1 = new File("d:\\test");

(2)File f2 = new File("abc.txt");

(3)File f3 = new File("d:\\test","abc.txt");

(4)File f1 = new File(f1,f2);

 

如果直接打印对象,输出的就是自定义的地址

例File f3 = new File("d:\\test","abc.txt");

System.out.println(f3);

输出结果为:d:\test\abc.txt

 

创建:

创建文件的方法:boolean  createNewFile():如果创建成功,会返回一个boolean值

例:

File f1 = new File("d:\\test","sdf.txt");

f1.createNewFile();//注意,只能用于创建文件,不是创建文件夹

控制台结果为:true //如果目录上原本不存在sdf.txt这个文件,创建成功就返回true

如果已存在,那么创建失败,返回false

需要注意的是:这个和输入流的创建流时的创建文件有区

别,输入流的如果已存在同名文件,那么会覆盖该文件

 

错误的创建写法:File f1 =new File("d:\\test");

f1.createNewFile("sdf.txt");

// createNewFile()是一个空参数的方法,不能传入参数

renameTo:重命名和剪切功能

分两种情况讨论:

1操作文件示例

File file = newFile(“d:\\test\\a.txt”);

file.renameTo(“d:\\test\\b.txt”);//当前目录下,renameTo起的是重命名功能

file.renameTo(“f:\\abc\\b.txt”);//在不同目录下,renameTo起的是剪切+重命名功能(d:\\test\\下的a.txt文件已经不存在了)

2操作文件夹示例

File file = newFile(d:\\test);

file.renameTo(“d:\\abc”);//对于非空的文件夹,只能作用于同一路径,起重命名的功能,不能剪切

renameTo对空的文件夹操作文件夹,可以剪切

 

反斜杠跨平台用法:File.separator

File f = newFile("ab.txt");

//将已有或没有的文件或文件夹封装成File

File f2 = newFile("d:\\test\\Day19","out.txt");

File f3 = new File("d:\\test\\Day19");

File f4 = newFile(f3,"syst.text");

//sop(f);

//sop(f2);

//sop(f4);//只打印路径,封装什么就打印什么

File f5=new File("d:"+File.separator+"test"+File.separator+"Day19");

sop(f5);;

/*File.separator是代表跨平台的反斜杠,在windows下可以识别

子linux系统下也能够识别

要注意的是File.separator后面没有跟括号

 File.separator()是错误的 */

 

删除:

删除文件的方法:boolean delete();

能够删除文件和空的文件夹(不能删除非空的文件夹)

删除的原理

从里往外删除,把最里面的一个个删除,再删上一级目录,逐级删除向上,用到递归操作

如果存在隐藏文件,则文件目录删不掉,就如同C盘中的某些文件夹,是删不删的,如果要删掉,必须把隐藏文件给删掉

删除一个非空文件夹的思路:

(1)listFile(),取得一个存有所有文件目录和文件数组

(1)for()循环输出每个文件或文件目录

(3)判断是否属于目录,如果属于目录,再判断目录是否为null,不为null,则递归调用此方法,如果属于文件,则用delete()删除

注意的细节:在递归调用删除一个文件夹里的所有文件之后,必须再删除此空目录,同理,在遍历删除完根目录下的文件和文件夹后,要删除根目录

用法示例:

 

public static void delAllFile(File file)
	{//遍历打印目录下的所有文件和文件夹
		File[] files = file.listFiles();
		for(File fis:files)
		{
			if(fis.isDirectory())//判断是否属于目录
			{
				if(fis.listFiles().length==0)//判断目录是否为空
				{
					fis.delete();//删除该目录
					System.out.println(fis.getName()+"删除成功");
				}
				else
				{
					delAllFile(fis); 目录不为空则递归调用
					fis.delete();//删除空目录
					System.out.println(fis.getName()+"删除成功");
				}
			}
			else
			{
				fis.delete();//属于文件,直接删除
				System.out.println(fis.getName()+"删除成功");
			}
		}
		file.delete();//删除根目录
	}


特殊的删除方法:void deleteOnExit();没有返回值

这个方法的用处是在使用一些临时文件的时候,在使用中不能删除,在使用完毕,退出后自动删除,其实就是标记该文件,告诉计算机,退出时删除

 

需求:剪切一个非空的目录到另外一个根目录下

代码:

public static void catFile(File source, File destination) {
		if (source.isDirectory()) {
			File[] files = source.listFiles();
			if (files != null) {
				for (File f : files) {
					File dest = new File(destination, source.getName());
					if (dest.exists() == false) {
						dest.mkdir();
					}
					catFile(new File(source, f.getName()), dest);//递归
				}
			}
		}
		if (source.renameTo(new File(destination, source.getName())) == false) {
			source.delete();
		}
	}


 

判断:

判断执行方法:boolean canExcute();是否能够执行(前提是存在此文件),能返回ture,不存在或不能执行则返回false

boolean exist();如果存在此文件,返回ture,不存在返回false

两者区别:?

 

前面说的是针对文件的操作,创建,删除

创建文件夹的方法:

File f1 = newFile("d:\\test\\cz");//此处传入想要创建的文件夹的目录和文件夹名

f1.mkdir();//这个也是空参数方法,不用传入参数

      需要注意的是:mkdir()只能创建一级目录,这个的理解就是,只能创建一个文件夹的意思

      如果想要创建多级目录,java也提供了一个创建多级文件目录的方法

     Boolean mkdirs();创建多级目录,可以理解成是

 

isFile()判断文件对象是否属于文件,如果属于文件,则返回true,不属于则false

isDirectory()判断文件对象是否属于目录,如果属于目录,则返回true,不属于则false

在判断文件对象是否是文件或者是目录的时候,一定要先判断这个文件对象是否存在,如果连需要判断的这个文件对象都不存在,那么判断则会出错,这里的出错指的是,不判断,直接返回false

注意:isDirectory()和isFile()这个两个方法能够判断隐藏目录,就算是隐藏文件和目录,也能够做出正确的判断

 

匹配关键字:

endsWith();

用法示例:

Files.getName.endsWith(“.java”);

这个就是判断文件名是否包含“.java”这个字符串,起到的作用也就是查找java文件

 

isHidden()判断当前文件是不是隐藏文件,且仅当此抽象路径名表示的文件属于隐藏文件,那么返回true,否则false,问题?:是判断文件,而不是判断文件夹,所以,使用此方法前,必须先判断isFile()吗?

 

getPath():获取文件的路径,如果封装成相对路径,就显示相对路径,绝对路径就显示绝对路径,取决于封装方式(可以理解为传什么就返回什么)

File f1 = new File(“abc.txt”);

File f2 = new File(“d:\\cd\\abc.txt”);

System.out.println(f1.getPath());

System.out.println(f2.getPath());

两者的输出结果如下:

abc.txt

d:\\cd\\abc.txt

 

getAbsolutePath():获取文件的绝对路径,无路是封装了还是没封装,返回的都是绝对路径

示例:

File f1 = new File(“abc.txt”);

File f2 = new File(“d:\\cd\\abc.txt”);

System.out.println(f1.getAbsolutePath());

System.out.println(f2.getAbsolutePath());

两者的输出结果如下:

d:\\cd\\abc.txt

d:\\cd\\abc.txt

 

getParent():返回的是绝对路径的文件的父目录(上级目录)

示例:

      File f1 = new File("D:\\test\\cz\\MyCar.java");

      System.out.println(f1.getParent());

 

输出结果为:D:\test\cz

 

listRoots():

获取文件系统的根目录,返回值类型是一个staticFile[],是一个数组

示例:

File[] f1 = File.listRoots()

For(File f:f1)

System.out.println(f);

输出结果为:

C:\

D:\

E:\

F:\

 

 

List();遍历获取当前目录下的文件和文件夹,包括隐藏文件,返回一个String[](注意是字符串数组)

 

listFiles():遍历获取当前目录下的文件和文件夹,不包括隐藏文件 , 返回一个File[](注意是文件数组)

 

public static void main(String[] args) 
	{
		File dir = new File("d:\\test"); 
		showDir(dir);
	}
	public static void showDir(File dir)
	{
		File[] files = dir.listFiles();
		for(int i=0; i<files.length; i++)
		{
			System.out.println(files[i]);
		}
	}


 


 

输出结果:

D:\test\cz>java FileDemo3

d:\test\cz       这是一个文件夹

d:\test\Day11    这是一个文件夹

d:\test\Day19    这是一个文件夹

d:\test\GessNum.java   这是一个文件

d:\test\TestByte.class              这是一个文件

d:\test\TestByte.java                这是一个文件

d:\test\TestByte.java.bak                 这是一个文件

 

那么如何能遍历到文件夹里的文件呢

public static void main(String[] args) 
	{
		File dir = new File("d:\\test"); 
		showDir(dir);
	}
	public static void showDir(File dir)
	{
		File[] files = dir.listFiles();
		for(int i=0; i<files.length; i++)
		{
			if(files[i].isDirectory())//判断是否属于文件夹
			{
				showDir(files[i]);//如果属于文件夹,就进入文件及,递归调用,遍历
			}
			else
			System.out.println(files[i]);如果不属于文件夹,则打印
		}
	}



 

那么这个的输出会遇到文件夹会进入文件夹中遍历

递归的次数要特别地注意,内存会溢出,因为每一次的递归都是要开辟栈内存去存储上一次的结果,而且上一层的结果依赖于下一层的结果,如果递归的次数太多,在还没有计算出最低层的值得时候,栈内存就会被占满

 

 

---------------------- ASP.Net+Android+IOS开发.Net培训、期待与您交流! ----------------------

详细请查看:http://edu.csdn.net 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值