File对象只能对文件进行操作,不能操作文件中的内容。
File类
1 File对象的创建
要注意的是:路径中"“要写成”\“进行转义, 路径中”/"可以直接用,但是最好的是使用File.separator,它会根据系统的不同进行转化,具有良好的移植性。
public static void main(String[] args) {// 1、创建一个File对象,指代某个具体的文件。// 路径分隔符// File f1 = new File("D:/resource/ab.txt");// File f1 = new File("D:\\resource\\ab.txt");File f1 = new File("D:" + File.separator +"resource" + File.separator + "ab.txt");System.out.println(f1.length()); // 文件大小File f2 = new File("D:/resource"); // 文件夹大小 注意不是文件夹里所有内容的大小 而是这个文件夹的大小System.out.println(f2.length()); // 文件夹本身只会记录这个文件夹的一些信息// 注意:File对象可以指代一个不存在的文件路径File f3 = new File("D:/resource/aaaa.txt");System.out.println(f3.length());System.out.println(f3.exists()); // false// 我现在要定位的文件是在模块中,应该怎么定位呢?// 绝对路径:带盘符的// File f4 = new File("D:\\code\\javasepromax\\file-io-app\\src\\itheima.txt");// 相对路径(重点):不带盘符,默认是直接去工程下寻找文件的。File f4 = new File("file-io-app\\src\\itheima.txt"); // 这里工程名是javasepromax所以相对路径这样写System.out.println(f4.length());File f5 = new File("file-io-app\\src\\com\\tx\\www\\a.txt"); // 注意包中的路径是这样的}
2 File判断和获取方法
public static void main(String[] args) throws UnsupportedEncodingException {// 1.创建文件对象,指代某个文件File f1 = new File("D:/resource/ab.txt");//File f1 = new File("D:/resource/");// 2、public boolean exists():判断当前文件对象,对应的文件路径是否存在,存在返回true.System.out.println(f1.exists());// 3、public boolean isFile() : 判断当前文件对象指代的是否是文件,是文件返回true,反之。System.out.println(f1.isFile());// 4、public boolean isDirectory() : 判断当前文件对象指代的是否是文件夹,是文件夹返回true,反之。System.out.println(f1.isDirectory());//除了判断功能还有一些获取功能:File f1 = new File("D:/resource/ab.txt");// 5.public String getName():获取文件的名称(包含后缀)System.out.println(f1.getName());// 6.public long length():获取文件的大小,返回字节个数System.out.println(f1.length());// 7.public long lastModified():获取文件的最后修改时间。long time = f1.lastModified();SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");System.out.println(sdf.format(time));// 8.public String getPath():获取创建文件对象时,使用的路径File f2 = new File("D:\\resource\\ab.txt");File f3 = new File("file-io-app\\src\\itheima.txt");System.out.println(f2.getPath());System.out.println(f3.getPath());// 9.public String getAbsolutePath():获取绝对路径System.out.println(f2.getAbsolutePath());System.out.println(f3.getAbsolutePath());}
3 创建和删除方法
public static void main(String[] args) throws Exception {// 1、public boolean createNewFile():创建一个新文件(文件内容为空),创建成功返回true,反之。File f1 = new File("D:/resource/itheima2.txt");System.out.println(f1.createNewFile());// 2、public boolean mkdir():用于创建文件夹,注意:只能创建一级文件夹File f2 = new File("D:/resource/aaa");System.out.println(f2.mkdir());// 3、public boolean mkdirs():用于创建文件夹,注意:可以创建多级文件夹File f3 = new File("D:/resource/bbb/ccc/ddd/eee/fff/ggg");System.out.println(f3.mkdirs());// 3、public boolean delete():删除文件,或者空文件,注意:不能删除非空文件夹。System.out.println(f1.delete());System.out.println(f2.delete());File f4 = new File("D:/resource");System.out.println(f4.delete());}
要注意的是:
1.mkdir(): 只能创建单级文件夹、
2.mkdirs(): 才能创建多级文件夹
3.delete(): 文件可以直接删除,但是文件夹只能删除空的文件夹,文件夹有内容删除不了。
4 遍历文件夹方法
public static void main(String[] args) {// 1、public String[] list():获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回。File f1 = new File("D:\\course\\待研发内容");String[] names = f1.list();for (String name : names) {System.out.println(name);}// 2、public File[] listFiles():(重点)获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回(重点)File[] files = f1.listFiles();for (File file : files) {System.out.println(file.getAbsolutePath());}File f = new File("D:/resource/aaa");File[] files1 = f.listFiles();System.out.println(Arrays.toString(files1));}
要注意的是:
1.当主调是文件时,或者路径不存在时,返回null
2.当主调是空文件夹时,返回一个长度为0的数组
3.当主调是一个有内容的文件夹时,将里面所有一级文件和文件夹路径放在File数组中,并把数组返回
4.当主调是一个文件夹,且里面有隐藏文件时,将里面所有文件和文件夹的路径放在FIle数组中,包含隐藏文件
5.当主调是一个文件夹,但是没有权限访问时,返回null
5 递归文件搜索案例
案例需求:在D:\判断下搜索QQ.exe这个文件,然后直接输出并运行。
1.先调用文件夹的listFiles方法,获取文件夹的一级内容,得到一个数组
2.然后再遍历数组,获取数组中的File对象
3.因为File对象可能是文件也可能是文件夹,所以接下来就需要判断
判断File对象如果是文件,就获取文件名,如果文件名是QQ.exe则打印,否则不打印
判断File对象如果是文件夹,就递归执行1,2,3步骤
所以:把1,2,3步骤写成方法,递归调用即可。
public static void main(String[] args) throws Exception {searchFile(new File("D:/") , "QQ.exe");}/*** 去目录下搜索某个文件* @param dir 目录* @param fileName 要搜索的文件名称*/public static void searchFile(File dir, String fileName) throws Exception {// 1、把非法的情况都拦截住if (dir == null || !dir.exists() || dir.isFile()) {return; // 代表无法搜索}// 2、dir不是null,存在,一定是目录对象。// 获取当前目录下的全部一级文件对象。File[] files = dir.listFiles();// 3、判断当前目录下是否存在一级文件对象,以及是否可以拿到一级文件对象。if (files == null || files.length == 0) return;// 4、遍历全部一级文件对象。for (File f : files) {// 5、判断文件是否是文件,还是文件夹if (f.isFile()) {// 是文件,判断这个文件名是否是我们要找的if (f.getName().contains(fileName)) {System.out.println("找到了:" + f.getAbsolutePath());Runtime runtime = Runtime.getRuntime();runtime.exec(f.getAbsolutePath()); // 启动QQ}// 是文件夹,继续重复这个过程(递归)} else searchFile(f, fileName);}}
字符集
ASCII码表能存储常用的字符,有英文字母、标点符号、数字以及一些特殊字符,这些字符一共也不到128个,所以用1个字节来存储1字符就够。
为了在计算机中存储中文,也编了一个中国人用的字符集叫做GBK字符集,这里面包含2万多个汉字字符,GBK中一个汉字采用两个字节来存储,为了能够显示英文字母,GBK字符集也兼容了ASCII字符集,在GBK字符集中一个字母还是采用一个字节来存储。但是如果一个文件中既有中文,也有英文,那计算机怎么知道哪几个字节表示一个汉字,哪几个字节表示一个字母呢?
当读取文件中的字符时,通过识别读取到的第1位是0还是1来判断是字母还是汉字
如果读取到第1位是0,就认为是一个字母,此时往后读1个字节。
如果读取到第1位是1,就认为是一个汉字,此时往后读2个字节。
为了解决各个国家字符集互不兼容的问题,由国际化标准组织牵头,设计了一套全世界通用的字符集,叫做Unicode字符集。在Unicode字符集中包含了世界上所有国家的文字,采用一个字符4个字节的编码方案。针对上面的存储问题,当前一共设计了三种编码方案。分别是UTF-32、UTF-16、UTF-8; 其中比较常用的编码方案是UTF-8:
1.UTF-8是一种可变长的编码方案,共分为4个长度区
2.英文字母、数字占1个字节兼容(ASCII编码)
3.汉字字符占3个字节
4.极少数字符占4个字节
String类中就提供了相应的方法,可以完成编码和解码的操作。
//编码:把字符串按照指定的字符集转换为字节数组
//解码:把字节数组按照指定的字符集转换为字符串
public static void main(String[] args) throws Exception {// 1、编码String data = "a我b";byte[] bytes = data.getBytes(); // 默认是按照平台字符集(UTF-8)进行编码的。System.out.println(Arrays.toString(bytes));//[97, -26, -120, -111, 98]// 按照指定字符集进行编码。byte[] bytes1 = data.getBytes("GBK");System.out.println(Arrays.toString(bytes1));//[97, -50, -46, 98]// 2、解码String s1 = new String(bytes); // 按照平台默认编码(UTF-8)解码System.out.println(s1);//a我bString s2 = new String(bytes1, "GBK");System.out.println(s2);//a我b}
//可以看到确实中文是负数 英文是正数