变量、数组、集合等方式的弊端:无法永久化存储数据
IO可以对硬盘中的文件进行读写
File表示读写的文件在哪,也可以对文件进行创建、删除等操作
File:
他是文件和目录路径的抽象表示(目录:可以理解为文件夹)
文件和目录可以通过file封装成对象
file封装的对象仅仅是一个路径名,它可以是存在,也可以是不存在
构造方法:
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例 |
File(String parent,String child) | 从父路径名字符串和子路径名字符串创建新的File实例 |
File(File parent,String child) | 从父抽象路径名和子路径名字符串创建新的File实例 |
String s = "D:\\d\\a.text";
File f = new File(s);
剩余两个简单理解就是将两个路径合并在一起看
绝对路径:
从盘符开始:盘符:D: C: E:等
File f = new File(D:\\it\\a.text);
相对路径:
相对当前项目下的路径
File f = new File(a.text);-----表示当前项目下
File f = new File(模块名\\a.text);----表示当前模块下
看左边的目录,当filemodule和a.text齐平的情况下,属于 a.text是当前项目下,若和src齐平,则属于当前模块下
成员方法:
添加
public boolean createNewFile() | 创建一个新的空文件 注意点: 是创建文件,而不是创建文件夹(不管有没有后缀名都只能创建文件) 如果路径存在同名文件,返回false(存不了) 如果路径没有同名文件,返回true(创建成功) 若访问的路径不存在,则会报错 例如: File f = new File("D:\\aaa\\bbb"); aaa路径是不存在的 |
public boolean mkdir() | 创建一个单级文件夹(比较少用,且只能创建单级) |
public boolean mkdirs() | 创建一个多级文件夹 注意点: 可创建单级,也可创建多级 不管有没有后缀名都只能创建文件夹 a.text创建出来的都是名为a.text的文件夹 |
删除
public boolean delete() | 删除由此抽象路径名表示的文件和目录 可以删除文件,也可以删除目录即文件夹(可以是多层文件夹) 注意点: 1.删除不走回收站 2.文件、空文件夹可以直接删除 但是要删除带有内容的文件夹,只能先进入这个文件夹,把内容删除完,才能删除这个文件夹(必用递归方法) |
判断:
public boolean isDirectory() | 测试抽象路径名表示的File是否为目录(文件夹) |
public boolean isFile() | 测试抽象路径名表示的File是否为文件 |
public boolean exists() | 测试抽象路径名表示的File是否存在 |
public String getName() | 返回由此抽象路径表明的文件或目录的名称 注意: 1.如果调用的是文件,返回的是文件名和后缀名 2.如果调用的是一个文件夹,返回的是文件夹名 |
高级获取功能:
public File[ ] listFile() | 返回此抽象路径名表示的目录中的文件和目录的File对象数组 注意点: 进入文件夹,获取这个文件夹里的所有文件和文件夹的File对象 并把这些File对象偶放在一个数组中返回(包括隐藏文件) |
当调用者的路径不存在或者是一个文件时,返回null
空文件夹 length返回0
有内容的文件夹,所有文件和文件夹路径放在File数组中返回(包括隐藏内容)
需要权限才能访问的内容,返回null
File file = new File("Mo2\\aa\\bb\\cc"); if (!file.exists()){ file.mkdirs(); } File file1 = new File(file, "a.text"); file1.createNewFile(); File file2 = new File("Mo2\\aa\\a.text"); file2.createNewFile(); File file3 = new File("Mo2\\aa\\ss"); file3.mkdirs(); File file4 = new File("Mo2\\aa"); de(file4); //file4.delete();多级文件夹含文件不能直接delete //删除一个多级文件夹 } private static void de(File file4) { File[] files = file4.listFiles(); for (File file5 : files) { if (file5.isFile()){ file5.delete(); }else{ de(file5); } } file4.delete(); }
public static void main(String[] args) { //求对应每种文件后缀的数量 File mo2 = new File("Mo2"); HashMap<String, Integer> o = new HashMap<>(); getCount(o, mo2); System.out.println(o); } private static void getCount(HashMap<String, Integer> o, File mo2) { File[] files = mo2.listFiles(); 1.判断是不是文件,不是就递归 2.获取截断名(后缀名) 3.判断后缀名(键)是否已存在 for (File file : files) { if (file.isFile()) { String name = file.getName(); String[] split = name.split("\\.");//注意:有的文件叫aaa,有的叫a.a.text存在,但此处不考虑在内 if (split.length == 2) { String s = split[1]; if (o.containsKey(s)) { Integer i = o.get(s);//不能写int i = 1;不然每次进来最多就为2 i++; o.put(s, i); } else { o.put(s, 1); } } } else { getCount(o, file); } } }