java之File类

java之File类
一.File类

File类是java.io包下代表与平台无关的文件和目录,也就是说,如果希望在程序中操作文件和目录,都可以通过File类来完成。不管是文件还是目录都是使用File来操作的,File能新建、删除、重命名文件和目录,File不能访问文件内容本身。如果需要访问文件内容本身,则需要使用输入/输出流。

二.File类的构造方法

构造方法 说明
public File(String pathname) 根据一个路径得到file对象
public File(String parent, String child) 根据一个目录和一个子文件/目录得到file对象
public File(File parent,String child) 根据父File对象和一个子文件/目录得到File对象

1.File可以使用文件路径字符串来创建File实例,该文件路径字符串既可以是绝对路径,也可以是相对路径。

  • 路径以盘符开始:绝对路径C:\a.txt
  • 路径不以盘符开始:相对路径 a.txt

2.构造函数只是创建了一个File对象,并没有对文件做读取的操作,因此,即使文件是错误的,也可成功的创建对象。

3.构造方法具体说明:
构造方法一: public File(String pathname)
通过给定的字符串路径(一般是文件的绝对路径)转为抽象路径名来创建File实例

//把e:\\demo\\a.txt封装成一个File对象。
File file = new File("E:\\demo\\a.txt");

构造方法二:public File(String parent, String child)
从父路径名字符串和子路径名字符串(一般是相对父路径名的相对路径)创建新的File类。

  • 如果子路径为null,会抛出NullPointerException空指针异常。
  • 父路径为null时,会以子路径作为绝对路径创建实例。
  • 当父路径不为null时,会以父路径作为目录,子路径作为父路径下的目录或者文件名,最后得到的实例对象的路径就是父路径和子路径的组合。
//把e:\\demo\\a.txt封装成一个File对象。
File file1 = new File("E:\\demo","a.txt");

构造方法三: public File(File parent,String child)
通过父路径实例对象和子路径字符串创建新的File实例,等同于把父路径字符串创建File实例。

   		//public File(File parent,String child)
		File file2 = new File("e:\\demo");
		File file3 = new File(file2,"a.txt");

三.使用File类的创建功能

方法 说明
public boolean createNewFile() 创建文件
public boolean mkdir() 创建单级文件夹,即此抽象路径名指定的目录。如果存在这样的文件夹就不创建了
public boolean mkdirs() 创建多级文件夹,如果父文件夹不存在,会帮你创建多级文件夹

方法一:创建单级文件夹 boolean mkdir()
试图创建一个File对象所对应的目录,如果创建成功,则返回true;否则返回false。调用该方法时File对象必须对应一个路径,而不是一个文件。

		//需求:在E盘目录下创建一个文件夹demo
		File file = new File("E:\\demo");
		System.out.println(file.mkdir());

注意:这个方法只能创建单级文件夹,示例如下:

		//下面这种做法是错误的
		//在E盘目录test下创建aaa目录
//		File file4 = new File("e:\\test\\aaa");
//		System.out.println(file4.mkdir());
		
		//正确做法
		File file5 = new File("e:\\test");
		File file6 = new File("e:\\test\\aaa");
		System.out.println(file5.mkdir());
		System.out.println(file6.mkdir());

方法二:创建文件public boolean createNewFile()
当此File对象所对应的文件不存在时,该方法将新建一个该File对象所指定的新文件,如果创建成功则返回true;否则返回false。

		//需求:我要在E盘目录demo下创建一个文件e.txt
		File file2 = new File("E:\\demo\\a.txt");
		System.out.println(file2.createNewFile());

注意:要想在某个目录下创建内容,该目录必须存在

		File file3 = new File("e:\\test\\b.txt");
		System.out.println(file3.createNewFile());

方法三:创建l多级文件夹 public boolean mkdirs()
创建此抽象路径名指定的目录,包括所有必需但不存在的父目录

		File file7 = new File("e:\\aaa\\bbb\\ccc\\ddd");
		System.out.println(file7.mkdirs());
		
		File file8 = new File("e:\\liuyi\\a.txt");
		System.out.println(file8.mkdirs());

四.File类的删除功能
public boolean delet()删除File类所对应的的文件或路径

  • A:如果创建的文件夹忘记写路径,那么默认在项目路径下
		//创建文件
		File file = new File("e:\\a.txt");
		System.out.println(file.createNewFile());
		
		//如果创建的文件夹忘记写路径,那么默认在项目路径下
		File file1 = new File("a.txt");
		System.out.println(file1.createNewFile());
		
		File file2 = new File("aaa\\bbb\\ccc");
		System.out.println(file2.mkdirs());

如图,在没有指定文件夹路径时,默认在项目路径下创建文件夹
java之File类

  • B:java中的删除不走回收站,所以用的时候需谨慎。
  • C:要删除文件夹,该文件夹内不可以有文件夹
public static void main(String[] args) throws IOException
	{
		//创建文件
		File file = new File("e:\\a.txt");
		System.out.println(file.createNewFile());
		
		//如果创建的文件夹忘记写路径,那么默认在项目路径下
		File file1 = new File("a.txt");
		System.out.println(file1.createNewFile());
		
		File file2 = new File("aaa\\bbb\\ccc");
		System.out.println(file2.mkdirs());
		
		//删除功能:删除a.txt这个文件
		File file3 = new File("a.txt");
		System.out.println(file3.delete());
		
		//删除功能:删除ccc这个文进夹
		File file4 = new File("aaa\\bbb\\ccc");
		System.out.println(file4.delete());
		
		//删除功能:删除aaa文件夹
//		File file5 = new File("aaa");
//		System.out.println(file5.delete());
		//出错,因为文件夹内有文件夹
		
		//先删除aaa文件夹,再删除bbb文件夹
		File file6 = new File("aaa\\bbb");
		File file7 = new File("aaa");
		System.out.println(file6.delete());
		System.out.println(file7.delete());		
	}

五.File类的重命名功能
boolean renameTo(File newName)
重命名此File对象所对应的文件或目录,如果重命名成功,则返回true;否则返回false。

  • A:如果文件名相同,就是改名
public static void main(String[] args)
   {
   	//创建一个文件对象
   	File file = new File("林青霞.jpg");
   	//修改这个文件的名称为东方不败.jpg
   	File newfile = new File("东方不败.jpg");
   	System.out.println(file.renameTo(newfile));
   }

java之File类
java之File类

  • B:如果路径名不同,就是剪切加改名(相当于从一个位置到另一个位置,并且改了名字)
	public static void main(String[] args)
   {
   	File file2 = new File("东方不败.jpg");
   	File newfile1 = new File("e:\\林青霞.jpg");
   	System.out.println(file2.renameTo(newfile1));
   }

如图: 从项目路径下剪切粘贴到E盘,并且改了名。
java之File类
六.File类的判断功能

方法 说明
public boolean isDirectory() 判断是否是目录
public boolean isFile() 判断是否是文件
public boolean exists() 判断是否存在
public boolean canRead() 判断是否可读
public boolean canWrite() 判断是否可写
public boolean isHidden() 判断是否隐藏
public static void main(String[] args)
   {
   	//创建文件对象
   	File file = new File("a.txt");
   	System.out.println(file.isDirectory());//false
   	System.out.println(file.isFile());//true
   	System.out.println(file.exists());//true
   	System.out.println(file.canRead());//true
   	System.out.println(file.canWrite());//true
   	System.out.println(file.isHidden());//false		
   }

七.File类的获取功能

方法 说明
public String getAbsolutePath() 获取此File对象对应的绝对路经
public String getPath() 获取此File对象对应的相对路径
public String getName() 获取此File对象表示的文件名或路径名
public long length() 获取文件内容的长度
public long lastModified() 获取文件的最后一次修改时间,毫秒值

绝对路径:以盘符开始的路径。
相对路径:相对于某个位置,在eclipse下是指相对于当前项目路径。

public static void main(String[] args)
	{
		//创建文件对象
		File file = new File("demo\\test.txt");
		
		System.out.println(file.getAbsolutePath());
		System.out.println(file.getPath());
		System.out.println(file.getName());
		System.out.println(file.length());
		System.out.println(file.lastModified());
		
		//1551960596595
		Date d = new Date(1551960596595L);
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:m:ss");
		String s = sdf.format(d);
		System.out.println(s);	
	}
结果:
F:\java\刘意\day19_File-2\demo\test.txt
demo\test.txt
test.txt
0
0
2019-03-07 20:9:56

八.File类的高级获取功能

方法 说明
String[] list() 获取File对象的所有子文件名和路径名,返回String数组。
File[] listFiles() 获取File对象的所有子文件和路径,返回File数组。

public String[] list()获取指定目录下的所有文件或者文件夹的名称数组

		//指定一个目录
		File file = new File("e:\\");
		
		//public String[] list()
		String[] str = file.list();
		for(String s:str)
		{
			System.out.println(s);
		}

public File[] listFile()取指定目录下的所有文件或者文件夹的File数组

		//指定一个目录
		File file = new File("e:\\");
		
		//public File[] listFile()
		File[] fileArray = file.listFiles();
		for(File f :fileArray)
		{
			System.out.println(f.getName());
		}

九.文件过滤器
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)参数是一个接口,需要的是具体类

  • A:File类的list()方法中可以接收一个FilenameFilter参数,通过该参数可以只列出符合条件的文件.
  • B:FilenameFilter接口里包含了一个accept(File dir, String name)方法,该方法将依次对指定File的所有子目录或者文件进行迭代,如果该方法返回true,则list()方法会列出该子目录或者文件。

例题:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件名称

public static void main(String[] args)
	{
		//封装E盘目录
		File file = new File("e:\\");
		
		//获取该目录下所有文件或者文件夹的数组
		//public String[] list()
		String[] str = file.list(new FilenameFilter()
		{
			@Override
			public boolean accept(File dir, String name)
			{				
				//File的构造方法3来创建问文件对象
				File file = new File(dir,name);
				//判断是否是文件
				boolean flag = file.isFile();
				//判断是否以.jpg结尾
				boolean flag2 = name.endsWith(".jpg");
				return flag&&flag2;				
			}
		} );
		
		for(String s :str)
		{
			System.out.println(s);
		}
	}

十.递归
方法定义中调用方法本身的现象
注意事项:

  • A:递归一定要有出口,否则就是死出口
  • B:递归的次数不能太多,否则就内存溢出
  • C:构造方法不能递归使用

例题:请用代码求5的阶乘

public static void main(String[] args)
	{
		int jc = 1;
		for(int x=2;x<=5;x++)
		{
			jc *= x;
		}
		System.out.println(jc);
		System.out.println(jieCheng(5));
	}
	/*
	 * 做递归要写一个方法:
	 * 		返回值类型:int
	 * 		参数列表:int n
	 * 出口条件:
	 * if(n==1){return 1;}
	 * 规律:
	 * if(n!==1){return n*方法名(n-1);}
	 */
	public static int jieCheng(int n)
	{
		if(n == 1)
		{
			return 1;
		}
		else
		{
			return n*jieCheng(n-1);
		}
	}

例题:递归删除带内容的目录demo

public static void main(String[] args)
	{
		//封装目录
		File scrFolder = new File("demo");
		
		//递归实现
		deleteFolder(scrFolder);
	}

	
	private static void deleteFolder(File scrFolder)
	{
		//获取该目录下所有的文件或文件夹的File数组
		File[] fileArray = scrFolder.listFiles();
		//遍历该File数组,得到每一个File对象
		if(fileArray != null)
		{
		for(File file:fileArray)
		{
			//判断给File对象是否是文件夹
			if(file.isDirectory())
			{
				//是:回到B
				deleteFolder(file);
			}
			else
			{
				//否:就删除
				//删除文件
				System.out.println(file.getName()+"--"+file.delete());			
			}
		}
		//删除文件夹
		System.out.println(scrFolder.getName()+"--"+scrFolder.delete());
		}
	}

例题:把E:\JavaSE目录下所有的java结尾的文件的绝对路径输出在控制台

public static void main(String[] args)
	{
		//封装目录
		File scoFolder = new File("E:\\JavaSE");
		
		//递归功能实现
		getAllFilePaths(scoFolder);
	}

	private static void getAllFilePaths(File scoFolder)
	{
		//获取该目录下所有的文件或者文件夹的File数组
		File[] fileArray = scoFolder.listFiles();
		//遍历该File数组,得到每一个File对象
		for(File file:fileArray)
		{
			//判断该File对象是否是文件夹
			if(file.isDirectory())
			{
				getAllFilePaths(file);
			}
			else
			{
				if(file.getName().endsWith(".java"))
				{
					//输出文件的绝对路径
					System.out.println(file.getAbsolutePath());
				}
			}
			
		}
	}