java IO流前置知识 File类 字符集

本文详细介绍了Java中File类的使用,包括创建、判断、获取属性、创建与删除文件及文件夹的方法。同时,文章提到了字符集的概念,如ASCII、GBK和Unicode,以及UTF-8编码的特性。还展示了如何进行字符串的编码和解码操作。
摘要由CSDN通过智能技术生成

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我b

        String s2 = new String(bytes1, "GBK");
        System.out.println(s2);//a我b
    }
//可以看到确实中文是负数 英文是正数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值