java之IO篇——File、字节流、字符流

前言

IO流是用于读写文件中的数据,要读写文件之前可以创建文件获取文件对象再创建IO流,正文会先介绍File类,通过File类的构造方法获取文件的对象,创建文件或目录以及File类的一些方法获取文件对象的属性。后面还介绍了相关的IO流体系,字节流和字符流的区别用法。

目录

前言

一、File

1.常用的成员方法

(1) 判断、获取

(2)创建、删除

(3)获取并遍历 

2. 实操

(1)遍历C盘下的以.avi结尾的文件

(2)删除一个多级文件夹(里面的有些文件有内容) 

(3)统计各种文件的数量 

二、IO流分类

三、IO体系

1.字节流

 2.字符流

四、字节流

1.字节输出流

(1)用法

(2)进阶用法(换行和续写)

 2.字节输入流

(1)用法

3.拷贝

五、try-with-resources

六、字符集(ASCLL、GBK、Unicode)

七、读取出现乱码

1.原因

2.解决方法

3.编码和解码

八、字符流

1.特点

2.使用场景

3.字符输出流

(1)用法

(2)底层原理

4.字符输入流

(1)用法

(2)底层原理

 九、字节流和字符流实战

1.拷贝文件夹

2.加密解密

3.将文件排序


一、File

1.常用的成员方法

(1) 判断、获取

注意: 1.length返回文件的大小(字节数量)

                细节1:这个方法只能获取文件的大小,单位是字节

                如果单位我们要是M,G,可以不断的除以1024

                细节2:这个方法无法获取文件夹的大小

                如果我们要获取一个文件夹的大小,需要把这个文件夹里面所有的文件大小都累加在一起。

           2.getName获取名字

                细节1:file是文件会返回文件的文件名和扩展名(如.txt  .cpp)

                细节2:file是文件夹就返回文件夹的名字。

(2)创建、删除

注意:1.createNewFile创建一个新的空的文件

                细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回true

                             如果当前路径表示的文件是存在的,则创建失败,方法返回false

                细节2:如果父级路径是不存在的,那么方法会有异常IOException

                细节3:createNewFile方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件

           2.mkdir创建一个文件夹(目录)

                细节1:windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false

                细节2:mkdir方法只能创建单级文件夹,无法创建多级文件夹。

          3. mkdirs创建多级文件夹

                细节:既可以创建单级的,又可以创建多级的文件夹

          4.delete删除文件、空文件夹

                细节:如果删除的是文件,则直接删除,不走回收站。

                          如果删除的是空文件夹,则直接删除,不走回收站

                          如果删除的是有内容的文件夹,则删除失败  

(3)获取并遍历 

注意:细节: 

  

//1.创建File对象
File f = new File("D:\\aaa");
//2.listFiles方法
//作用:获取aaa文件夹里面的所有内容,把所有的内容放到数组中返回
File[] files = f.listFiles();
for (File file:files) {
    //file依次表示aaa文件夹里面的每一个文件或者文件夹
    System.out.println(file);
}

2. 实操

(1)遍历C盘下的以.avi结尾的文件

递归,一定要先用if判断文件数组是否为空,否则会抛出空指针异常

(2)删除一个多级文件夹(里面的有些文件有内容) 

(3)统计各种文件的数量 

 /*
    * 作用:
    *       统计一个文件夹中每种文件的个数
    * 参数:
    *       要统计的那个文件夹
    * 返回值:
    *       用来统计map集合
    *       键:后缀名 值:次数
    *
    *       a.txt
    *       a.a.txt
    *       aaa(不需要统计的)
    *
    *
    * */
    public static HashMap<String,Integer> getCount(File src){
        //1.定义集合用来统计
        HashMap<String,Integer> hm = new HashMap<>();
        //2.进入src文件夹
        File[] files = src.listFiles();
        //3.遍历数组
        for (File file : files) {
            //4.判断,如果是文件,统计
            if(file.isFile()){
                //a.txt
                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{
                //5.判断,如果是文件夹,递归
                //sonMap里面是子文件中每一种文件的个数
                HashMap<String, Integer> sonMap = getCount(file);
                //hm:  txt=1  jpg=2  doc=3
                //sonMap: txt=3 jpg=1
                //遍历sonMap把里面的值累加到hm当中
                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;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值