JAVA进阶 —— File

目录

一、概述

 二、File 构造方法

三、File 常见成员方法

1.  判断与获取

2. 创建与删除

3. 获取并遍历

四、 综合练习

1.  练习一 : 创建文件

2.  练习二 :单个文件夹查找文件

3.  练习三 :遍历硬盘查找文件

4.  练习四 :删除文件夹

 5.  练习五 :统计文件夹大小

6.  练习六 :统计各种文件数量


一、概述

  • File对象就表示一个路径,可以使文件的路径,也可以是文件夹的路径。
  • 这个路径可以是存在的,也可以是不存在的。

 扩展知识: 路径:

  • 绝对路径:带盘符的。
  • 相对路径:不带盘符的,默认到当前项目下去找。

 二、File 构造方法

方法名称 说明
public File ( String pathname ) 根据文件路径创建文件对象
public File ( String parent,String child ) 根据父路径名字符串和子路径名字符串创建文件对象
public File ( File parent,String child ) 根据父路径对应文件对象和子路径名字符串创建文件对象
public class FileDemo01 {
	public static void main(String[] args) {
		// 1.根据字符串表示的路径
		// 变成File对象
		String str = "C:\\Users\\alienware\\Desktop\\a.txt";
		File f1 = new File(str);
		System.out.println(f1); // C:\Users\alienware\Desktop\a.txt
		// 将字符串变成File对象 就可以使用File对象方法

		// 2.根据父路径和子路径名称创建文件对象
		// 父路径:C:\Users\alienware\Desktop
		// 子路径:a.txt

		String parent = "C:\\Users\\alienware\\Desktop";
		String child = "a.txt";
		File f2 = new File(parent, child);
		System.out.println(f2); // C:\Users\alienware\Desktop\a.txt

		// \:转义字符
		File f3 = new File(parent + "\\" + child);

		// 3.把一个File表示的路径和String表示路径进行拼接
		File parent2 = new File("C:\\Users\\alienware\\Desktop");
		String child2 = "a.txt";
		File f4 = new File(parent2, child2);
		System.out.println(f4);
	}
}

三、File 常见成员方法

1.  判断与获取

方法名称 说明
public boolean isDirectory ( ) 判断此路径名表示的File是否为文件夹
public boolean isFile ( ) 判断此路径名表示的File是否为文件
public boolean exists ( ) 判断此路径名表示的File是否存在
public long length ( ) 返回文件的大小(字节数量)
public string getAbsolutePath ( ) 返回文件的绝对路径
public string getPath ( ) 返回定义文件时使用的路径
public string getName ( ) 返回文件的名称,带后缀
public long lastModified ( ) 返回文件的最后修改时间(时间毫秒值)

判断:

public class FileDemo02 {
	public static void main(String[] args) {
		//1.对文件的路径进行判断
		File f1 = new File("D:\\aaa\\a.txt");
		System.out.println(f1.isDirectory()); //false
		System.out.println(f1.isFile());  //true
		System.out.println(f1.exists());  //true
		
		//2.对文件夹的路径进行判断
		File f2 = new File("D:\\aaa\\bbb");
		System.out.println(f1.isDirectory()); //true
		System.out.println(f1.isFile());  //false
		System.out.println(f1.exists());  //true
		
		//3.对不存在的路径进行判断
		File f3 = new File("D:\\aaa\\c.txt");
		System.out.println(f1.isDirectory()); //false
		System.out.println(f1.isFile());  //false
		System.out.println(f1.exists());  //false
	}
}

获取:

public class FileDemo03 {
	public static void main(String[] args) {
		// 1.length 返回文件大小
		// 细节: 方法只能返回文件大小,单位是字节
		// 方法无法获取文件夹大小
		// 如果想要获取文件夹大小,需要将文件夹内所有文件大小进行累加
		File f1 = new File("D:\\aaa\\a.txt"); // 文件中有四个字
		long len = f1.length();
		System.out.println(len); // 12 (个字节)

		File f2 = new File("D:\\aaa\\bbb");
		long len2 = f2.length();
		System.out.println(len2); // 0

		// 2.getAbsolutePath 返回文件绝对路径
		File f3 = new File("D:\\aaa\\a.txt");
		String path1 = f3.getAbsolutePath();
		System.out.println(path1); // D:\aaa\a.txt

		// 当前路径下
		File f4 = new File("java02\\a.txt");
		String path2 = f4.getAbsolutePath();
		System.out.println(path2); // C:\Users\123456\eclipse-workspace\java02\java02\a.txt

		// 3.getPath 返回定义文件时使用的路径
		File f5 = new File("D:\\aaa\\a.txt");
		String path3 = f5.getPath();
		System.out.println(path3); // D:\aaa\a.txt

		// 当前路径下
		File f6 = new File("java02\\a.txt");
		String path4 = f6.getPath();
		System.out.println(path4); // java02\a.txt

		// 4.getName 获取文件名
		// a :真正文件名
		// txt : 文件扩展名
		File f7 = new File("D:\\aaa\\a.txt");
		String name = f7.getName();
		System.out.println(name); // a.txt

		// 5.lastModified 返回文件最后修改时间
		File f8 = new File("D:\\aaa\\a.txt");
		long time = f8.lastModified();
		System.out.println(time); // 1667380952425 (毫秒值)
	}
}

2. 创建与删除

方法名称 说明
public boolean createNewFile ( ) 创建一个新的空的文件
public boolean mkdir ( ) 创建单级文件夹
public boolean mkdirs ( ) 创建多级文件夹
public boolean delete ( ) 删除文件、空文件夹

注意:delete()方法默认只能删除文件和空文件夹,delete方法直接删除不走回收站

public class FileDemo04 {
	public static void main(String[] args) throws IOException {
		// 1. createNewFile 创建新的空的文件
		// 细节1:如果当前路径表示文件时不存在的,则创建成功,返回true; 否则,返回false
		// 细节2:如果父路径不存在,那么方法会有异常
		// 细节3:创建的一定是文件,如果路径不包含后缀名,则是一个没有后缀的文件
		File f1 = new File("D:\\aaa\\c.txt");
		boolean b1 = f1.createNewFile();
		System.out.println(b1);

		// 2.mkidr 创建单级文件夹(目录)
		// 细节1:windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false
		// 细节2:只能创建单级文件夹,无法创建多级文件夹
		File f2 = new File("D:\\aaa\\ddd");
		boolean b2 = f2.mkdir();
		System.out.println(b2); // false

		// 3.mkidrs 创建多级文件夹
		// 细节: 既可以创建单级文件夹,也可以创建多级文件夹
		File f3 = new File("D:\\aaa\\aaa\\bbb\\ccc");
		boolean b3 = f3.mkdirs();
		System.out.println(b3); // true

		// 4.delete 删除文件、空文件夹
		// 细节: 如果删除的是文件,则直接删除,不走回收站
		// 如果删除的是空文件夹,则直接删除,不走回收站
		// 如果删除的是有内容的文件夹,则删除失败
		File f4 = new File("D:\\aaa\\a.txt");
		boolean b4 = f4.delete();
		System.out.println(b4);
	}
}

3. 获取并遍历

方法名称 说明
public File [ ]  listFiles ( ) 获取当前该路径下所有内容

注意:

  • 当调用者File表示的路径不存在时,返回null。
  • 当调用者File表示的路径是文件时,返回null。
  • 当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组。
  • 当调用者File表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回。
  • 当调用者File表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件。
  • 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null。
public class FileDemo05 {
	public static void main(String[] args) {
		//1.创建file对象
		File f = new File("D:\\aaa");
		
		//2.调用方法
		//作用:获取文件夹中所有内容,把所有的内容存放到数组并返回
		File[] files = f.listFiles();
		for (File file : files) {
			//file依次表示文件夹中的每一个文件或者文件夹
			System.out.println(file);
		}
	}
}

四、 综合练习

1.  练习一 : 创建文件

需求:在当前模块下的aaa文件夹中创建一个a.txt文件。(不需要考虑子文件夹)

public class FileTest {
	public static void main(String[] args) throws IOException {
		// 1.创建a.txt父级路径
		File file = new File("java02\\aaa");
		// 2.创建父级路径
		// 如果aaa是存在的,那么此时创建失败
		// 如果aaa是不存在的,那么此时创建成功
		file.mkdirs();
		// 3.拼接父级路径和子级路径
		File src = new File(file, "a.txt");
		boolean b = src.createNewFile();
		if (b) {
			System.out.println("创建成功");
		} else {
			System.out.println("创建失败");
		}
	}
}

2.  练习二 :单个文件夹查找文件

需求:定义一个方法找某一个文件夹中。是否有以avi结尾的电影。

public class FileTest {
	public static void main(String[] args) throws IOException {
		File file = new File("D:\\aaa");
		boolean b = haveAvi(file);
		System.out.println(b);
	}
	//作用: 用来找某个文件夹中,是否有以avi结尾的电影
	//形参: 要查找的文件夹
	//返回值:查找的结果
	public static boolean haveAvi(File file) {
		//1.进入文件夹,获取其中的所有的内容
		File[] files = file.listFiles();
		for (File f : files) {
			if (f.isFile() && f.getName().endsWith(".avi")) {
				return true;
			}
		}
		//循环结束,仍未找到
		return false;
	}
}

3.  练习三 :遍历硬盘查找文件

需求:找到电脑中所有以avi结尾的电影。(需要考虑子文件夹)

public class FileTest {
	public static void main(String[] args) throws IOException {
		File src = new File("C:\\");
		findAvi(src);
	}

	public static void findAvi() {
		// 获取本地所有的盘符
		File[] arr = File.listRoots();
		for (File f : arr) {
			findAvi(f);
		}
	}

	public static void findAvi(File file) {
		// 1.进入文件夹
		File[] files = file.listFiles();
		// 2.遍历数组 得到file中每一个文件或文件夹
		if (files != null) {
			for (File f : files) { // files 可能为空指针
				if (f.isFile()) {
					// 3.判断: 是文件,执行业务逻辑
					String name = f.getName();
					if (name.endsWith(".avi")) {
						System.out.println(f);
					}
				} else {
					// 4.判断: 是文件夹,就可以递归
					// 细节: 再次调用方法,参数必须是file的次一级
					findAvi(f);
				}
			}
		}
	}
}

4.  练习四 :删除文件夹

需求:删除一个多级文件夹。

public class FileTest {
	public static void main(String[] args) {
		// 如果我们想要删除一个含有内容的文件夹?
		// 1.先删除文件夹里面的所有的内容
		// 2.再删除文件夹自己

		File file = new File("D:\\aaa\\src");
		delete(file);
		// delete 只能删除文件和空的文件夹
	}

	// 作用:删除src文件夹
	// 参数 : 要删除的文件夹
	public static void delete(File src) {
		// 1.先删除文件夹内所有文件
		File[] files = src.listFiles();
		for (File file : files) {
			if (file.isFile()) {
				file.delete();
			} else {
				delete(file);
			}
		}
		// 2.再删除文件夹自己
		src.delete();
	}
}

 5.  练习五 :统计文件夹大小

需求:统计一个文件夹的总大小。

public class FileTest {
	public static void main(String[] args) {
		
		File file = new File("D:\\aaa\\src");
		long len = getLen(file);
		System.out.println(len);
		
	}
	//作用:统计一个文件夹的大小
	//形参: 要统计的文件夹
	//返回值: 文件夹大小
	public static long getLen(File src) {
		long  len = 0;
		File[] files= src.listFiles();
		for(File file : files) {
			if (file.isFile()) {
				len = len + file.length();
			}else {
				len = len + getLen(file);
			}
		}
		return len;
	}
}

6.  练习六 :统计各种文件数量

需求:需求:统计一个文件夹中每种文件的个数并打印。(考虑子文件夹)

打印格式如下:

  • txt:3个
  • doc:4个
  • jpg:6个
public class FileTest {
	public static void main(String[] args) {
		// 统计 : 计数器思想
		File file = new File("D:\\aaa\\src");
		Map<String, Integer> hm = getCount(file);
		System.out.println(hm);

	}

	// 作用:统计一个文件夹中每种文件的个数
	// 形参: 要统计的文件夹
	// 返回值: 以用来统计的map集合(键:后缀名 值:次数)
	public static Map<String, Integer> getCount(File src) {
		// 定义集合用来统计
		HashMap<String, Integer> hm = new HashMap<>();
		// 进入src文件夹
		File[] files = src.listFiles();
		// 遍历
		for (File file : files) {
			if (file.isFile()) {
				String name = file.getName();
				String[] arr = name.split("\\.");
				if (arr.length >= 2) {
					String endName = arr[arr.length - 1];
					if (hm.containsKey(endName)) {
						// 存在
						int count = hm.get(endName);
						count++;
						hm.put(endName, count);
					} else {
						// 不存在
						hm.put(endName, 1);
					}
				}
			} else {
				// sonMap开麦女士子文件中每一种文件的个数
				Map<String, Integer> sonMap = getCount(file);
				Set<Map.Entry<String, Integer>> entries = sonMap.entrySet();
				for (Map.Entry<String, Integer> entry : entries) {
					String key = entry.getKey();
					int value = entry.getValue();
					if (hm.containsKey(key)) {
						// 存在
						int count = hm.get(key);
						count = count + value;
						hm.put(key, count);
					} else {
						// 不存在
						hm.put(key, value);
					}
				}

			}
		}
		return hm;
	}
}

猜你喜欢

转载自blog.csdn.net/hdakj22/article/details/129474797