JavaSE-day27-异常和File

01异常

1异常的体系

2throw和throws的区别

1.作用不同

        1.throw用于方法中主动抛出一个异常对象

        2.throws用于在方法声明处生命该方法可能是抛出的异常类型,他把异常交给调用方法的那个人。

2.语法位置不同

        1.thow在方法内部

        2.thows出现在方法声明处

3.数量不同        

        1.throw每次只能抛出一个异常对象

        2.throws一次可以抛出多个异常类型

4.处理方式不同

        1.使用throw抛出异常后,后续代码通常不会继续执行除非在try-catch中

        2.声明throws知识告知调用者方法可能出现异常,但是方法本身不负责处理异常。

注意点

        编译时异常必须在方法体上thrwos抛出,运行时一场不需要。

02自定义异常实现方式

创建girl类,生成的setAge和setName方法中进行了判断以满足题中条件

public class Girl {
    private String name;
    private int age;

    public Girl() {
    }

    public Girl(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 获取
     * @return name
     */
    public String getName() {
        return name;
    }

    /**
     * 设置
     * @param name
     */
    public void setName(String name) {
        if (name.length() <3 || name.length() >10){
            throw new NameFormatterException(name+"长度不在18-40之间");
        }
        this.name = name;
    }

    /**
     * 获取
     * @return age
     */
    public int getAge() {
        return age;
    }

    /**
     * 设置
     * @param age
     */
    public void setAge(int age)  {
        if (age <18 || age >40){
            throw  new AgeOutOfBoundsException(age+"年龄范围不合法");
        }
        this.age = age;
    }

    public String toString() {
        return "Girl{name = " + name + ", age = " + age + "}";
    }
}

创建自定义异常类AgeOutOfBoundsException和NameFormatterException

public class AgeOutOfBoundsException extends RuntimeException {
    public AgeOutOfBoundsException(String message) {
        super(message);
    }

    public AgeOutOfBoundsException() {
        super();
    }
}
public class NameFormatterException extends RuntimeException{
    public NameFormatterException() {
        super();
    }

    public NameFormatterException(String message) {
        super(message);
    }
}

说明:创建异常类的命名方式一般是异常类型+Exception,里面使用ctrl+O,重载第二个方法即可完成自定义异常。

创建测试类

public class Test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
                String name;
        int age = 0;
        Girl girl = new Girl();
        while (true) try {
            System.out.println("请输入你的姓名");
            name = sc.next();
            girl.setName(name);

            System.out.println("请输入你的年龄");
            age = sc.nextInt();

            girl.setAge(age);
            break;
        } catch (AgeOutOfBoundsException | NameFormatterException e) {

03File概述、构造方法和成员变量方法

1file概述

file对象表示路径,可以是文件和文件夹,该路径能存在也可以不存在

2.file构造方法

三种构造方法

简单使用

public class FileDemo1 {
    public static void main(String[] args) {
        String str = "C:\\Users\\30116\\Desktop\\my\\color.md";
        //尝试三种构造方法
        File f1 = new File(str);
        System.out.println(f1);
        String parent = "C:\\Users\\30116\\Desktop\\my";
        String child = "color.md";
        //这里使用java自己生成,因为会在不同的操作系统使用
        File f2 = new File(parent , child);
        System.out.println(f2);
        //第三种
        File f3 = new File(parent);
        File f5 = new File(f3,child);
        System.out.println(f5);
    }}

3.file常见的成员方法

常见的成员方法

常见的遍历方法

简单应用部分:

public class FileDemo3 {
    public static void main(String[] args) {
        File f1 = new File("C:\\Users\\30116\\Desktop\\my\\Xmind\\a.txt");
        //细节1:只能返回字节单位,对于M,G,需要除以1024
        //细节2:
        System.out.println(f1.length());
        System.out.println(f1.getAbsolutePath());
        File f2 = new File("..\\b.txt");
        System.out.println(f2.getAbsolutePath());
        //返回定义文件时使用的路径
        System.out.println(f2.getPath());
        System.out.println(f2.getName());
        System.out.println(f1.lastModified()); //返回文件最后修改时间,毫秒
    }
}

遍历的简单应用:

public class FileDemo6 {
    public static void main(String[] args) {
        //1.遍历文件夹下的所有内容
        File f1 = new File("C:\\Users\\30116\\Desktop\\my\\Xmind");
        File[] files = f1.listFiles();
        if (files != null) {
            for (File f : files) {
                System.out.println(f);
            }
        }
    }
}

重点掌握listFiles()方法

课后练习:如何使用获取的最近更改事件把时间转换为yyyy-MM-dd HH:mm:ss类型(提示使用jdk7的SimpleDateFormatter)

04File的综合练习(重点)

写在前面的话:file的练习需要自己创建文件夹,代码中是我自己的文件夹创建的,读者在实现代码时,需要先创建好自己的文件夹

综合练习1

public class TestDemo1 {
    public static void main(String[] args) throws IOException {
        //1.在文件夹下创建一个文件
        File f1 = new File("aaa");
            //创建了一个day27//aaa文件夹,创建了两个
            f1.mkdir();

        File f2 = new File(f1,"a.txt");

            boolean flag = f2.createNewFile();
            if (flag){
                System.out.println("success");
            }else {
                System.out.println("defeat");
            }
   }
}

综合练习2

public class TestDemo2 {
    public static void main(String[] args) {
        //定义一个方法查找里面是否有以avi结束的电影
        System.out.println(method());

    }

    /*查看是否有以.avi结尾的电影*/
    private static boolean method() {
        File f1 = new File("C:\\Users\\30116\\Desktop\\my\\Xmind\\aaa");
        String[] list = f1.list(new FilenameFilter() {
            @Override
            public boolean accept(File dir, String name) {
                File src = new File(dir, name);
                return src.isFile() && name.endsWith(".avi");
            }
        });
        System.out.println(Arrays.toString(list));
        if (list != null && list.length == 0) {
            return false;
        }
        return true;
    }

}

综合练习3

解说:主要思想是递归思想,使用listFIles方法找到文件夹下所有目录,找到后,对是文件的进行操作,,不是文件的递归继续查找直至找到所有的.avi文件,递归时包含递归出口。

public class TestDemo4 {
    public static void main(String[] args) {
        /*思路
         * 1.先找到四个盘符 //找到一个盘符里面的就可以
         * 2.找到盘符下的文件夹
         * 3.创建File对象,使用list过滤方法找.avi文件
         * 4.找到文件夹下的所有文件夹,循环遍历文件夹,盘符+文件夹创建对象
         * 5循环调用方法*/
        File src = new File("C:\\");
        //禁止调用该方法
        //禁止调用该方法
        //禁止调用该方法
        //禁止调用该方法
        //禁止调用该方法
        //禁止调用该方法
        //alls();

    }
    /*电脑上所有的盘符的文件*/
    public static  void all(){
        File file = new File("C:\\");
        File[] files = file.listRoots();
        for (File file1 : files) {
            findAVI(file1);
        }
    }
    /*找到c盘符下面的.avi文件结尾的文件*/
    public static  void findAVI(File src){
        //1.找到盘符下的所有文件
        File[] files = src.listFiles();
        if(files != null){
            for (File file : files) {
                if (file.isFile()){
                    if (file.getName().endsWith(".avi")){
                        System.out.println(file);
                    }
                }else {
                    findAVI(file);
                }
            }
        }
    }
}

综合练习4

删除一个多级文件夹同样是递归思想,文件夹下的文件和文件夹删除,递归到最高级文件夹进行删除。

public class TestDemo5 {
    public static void main(String[] args) {
        //删除一个多级文件夹
        File src = new File("C:\\Users\\30116\\Desktop\\my\\Xmind\\bbb");
        del(src);
    }
    /*删除一个多级文件夹,需要删除里面的所有文件和文件夹
    * 参数 file
    * 返回值 void*/
    public  static  void del(File src){
        //1.找到该文件夹下的所有目录和文件
        File[] files = src.listFiles();
        //2.递归
        //如果为null的情况,比如没有权限访问就会为null,切记删除不在回收站不可删除重要内容

            for (File file : files) {
                if (file.isFile()){
                    if (file.getName().endsWith(".txt")){
                        //删除
                        System.out.println(file.delete());
                    }
                }else {
                    del(file);
                }
            }
            src.delete();
    }
}

综合练习5

有一种情况需要考虑,就是如果我们访问的文件夹需要权限,就会返回null和文件夹没有内容,使用一个if判避免报错。

public class TestDemo6 {
    public static void main(String[] args) {
        //统计文件夹的大小就是统计所有文件的大小
        File file = new File("C:\\Users\\30116\\Desktop\\my\\Xmind\\ggg");
        getCount(file);
        System.out.println(count);
    }
    static long count =0;
    //utf-8中一个汉字3个字节
    public static void getCount(File src){
        File[] files = src.listFiles();
        if (files != null){
            for (File file : files) {
                if (file.isFile()){
                    count+=file.length();
                }else {
                    getCount(file);
                }
            }
        }

    }
}

综合练习6

使用HashMap和递归思想以及双列集合的遍历方法。

public class TestDemo7 {
    public static void main(String[] args) {

        File src = new File("C:\\Users\\30116\\Desktop\\my\\Xmind\\ggg");
 
        Set<String> strings = getCount(src).keySet();

        for (String string : strings) {
            System.out.println(string+":"+hm.get(string));
        }
    }
    /*统计文件家中每种文件的个数并打印
    * 参数 开始文件夹
    * 可能遇到的情况
    * 有后缀和无后缀
    * 我写的也性的通
    * 返回值 Map*/
    static HashMap<String,Integer> hm = new HashMap();
    public static HashMap<String,Integer> getCount(File src){
        File[] files = src.listFiles();
        if (files != null){
            for (File file : files) {
                if (file.isFile()){
                    //这个逻辑没有阿伟的好,因为我这个还要判断
                    //哪个只需要判断用.分割后,是否长度为2,长度不为2说明,文件没有后缀不统计
                    //这就是没有全面的考虑问题
                    if (file.getName().endsWith(".txt") ||file.getName().endsWith(".doc")||file.getName().endsWith(".jpg")){
                        //切割找后缀
                        String sub = file.getName().substring(file.getName().lastIndexOf(".") + 1);
                        if (hm.containsKey(sub)){
                            //hm中包含这个后缀
                            int count = hm.get(sub);
                            hm.put(sub,++count);
                        }else {
                            //改后缀第一次出现
                            hm.put(sub,1);
                        }
                    }
                }else {
                    getCount(file);
                }
            }
        }
        return hm;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值