Java-IO流、异常、File类

一、IO流

1. IO流概述

  • 什么是IO流
    • IO流可以用来处理设备之间的数据传输,代表了数据的无结构化传递
    • 上传文件和下载文件

二、异常

1. 异常的概述

  • 什么是异常
    • 异常就是Java程序在运行中出现的错误
  • 异常的分类
    • 编译期异常,RuntimeException
      • 必须处理,否则程序会报红,无法运行
    • 运行期异常,非RuntimeException
      • 可以不处理,程序能运行,但不处理一旦遇到异常就会抛错误,结束程序
  • 异常的继承体系

在这里插入图片描述

2. 异常的两种处理方式

  • 抛出去

    • 将异常抛给调用者处理
    • 调用者如果没有相应的处理方式,就将这个异常一直抛上去,直到抛给JVM处理
    • 当JVM遇到异常时,会将异常的信息和出现位置打印在控制台上,同时结束程序
  • 使用try-catch语句进行捕获处理

    • 语法
    try{
        可能会出现异常的代码;
    }catch(可能出现的异常名 变量名){
        处理异常的代码;
    }catch(可能出现的异常名 变量名){
        处理异常的代码;
    }...
    finally{
        不管能不能遇到异常都会执行的代码;
        一般用来做收尾工作,比如释放资源等;
        可写可不写;
    }
    • 注意
      • try中的语句执行会耗费大量时间,所以尽量要少
      • catch语句中要有具体的处理,不能空语句将异常信息隐藏
      • 可以有多条catch语句,捕获多种异常
    • 多条catch语句
      • 能具体的异常尽量具体,尽量不要使用大的异常如囊括
      • 如果多个异常有继承关系,子类在前,父类在后

3. 编译期异常与运行期异常的区别

  • 编译期异常
    • Exception异常类下,所有非RuntimeException类及其子类的异常类
    • 在编译期间出现,程序报红,不处理无法运行
  • 运行期异常
    • Exception异常类下,RuntimeException类及其所有子类
    • 在运行期间不报错,程序可以运行
    • 不处理如果遇到异常会打印异常信息,并退出程序

4. Throwable的几个常见方法

  • getMessage()
    • 得到异常信息的字符串形式
  • toString()
    • 得到异常类名与异常信息的字符串形式
  • printStackTrace()
    • 得到异常类名与异常信息,以及异常在程序中出现的位置

5. 使用throws的方式处理异常

  • 在方法的声明上注明可能会出现的异常

  • 语法

    public void show)()throws 异常类1,异常类2,异常类3...{
        方法体;
    }
  • 将方法可能出现的异常标注起来,可以是多个,让调用者去处理

6. throw概述及throw与throws区别

  • throw概述

    • 用来处理在方法内部可能出现的异常

    • 语法

      throw new 异常类("要输出的信息");
      
  • throw与throws的区别

    • throw
      • 用在方法体内,使用的是类的对象
      • 一次只能抛出一个异常
      • 异常可以是编译期异常,也可以是运行期异常
      • 抛出异常并进行处理
      • 执行了throw语句一定是抛出了该种异常
    • throws
      • 用在方法声明上,使用的是类
      • 后面可以跟多种异常
      • 抛出的异常由调用者处理,只负责抛出异常
      • 只是表示异常出现的可能性,不一定会出现

7. final、finally、finalize的区别

  • final
    • 是一个状态修饰符,可以修饰类、变量、方法
    • 被修饰的类不能被继承
    • 被修饰的方法不能被重写
    • 被修饰的变量是常量
  • finally
    • 用在try-catch语句中
    • 不管异常是否抛出一定会被执行,除非程序提前退出
    • 用来做收尾工作,比如释放资源等
  • finalize
    • Object类的一个方法
    • 用来回收垃圾

8. 自定义异常

  • 为什么要自定义异常

    • 在实际开发中我们会遇到各种各样的异常,Java提供的已知异常并不能完全满足我们的需求,有时候要定义自己的异常
  • 如何定义自定义异常

    • 让我们自己的异常类继承Java中已有的异常类
    • 比如Exception、RuntimeException等
  • 自定义异常示例

    • 代码
    public class AbnormalResultValue extends RuntimeException {//自定义异常类,当成绩不在0-100之间时抛出
    
        public AbnormalResultValue() {
            System.out.println("百分比成绩,应该在0-100之间");
        }
    }
    public class ScoreAbnormal {//测试类,输入输出学生成绩
        public static void main(String[] args) {
            System.out.println("请输入你的成绩");
            Scanner input = new Scanner(System.in);
            int score = input.nextInt();
            if (score >= 0 && score <= 100) {
                System.out.println("你的成绩是:" + score);
            } else {//不在0-100之间抛出自定义异常类
                throw new AbnormalResultValue();
            }
        }
    }
    
  • 自定义异常注意事项

    • 子类重写父类的方法时,只能选择抛出父类方法已有的异常或已有异常的子类异常
    • 子类继承自父类,在设计子类时,子类只能抛出父类已有的异常及已有异常的子类
    • 如果父类或父类方法没有异常抛出,子类及重写方法不允许抛出异常,可以使用try-catch语句处理
  • 异常的使用与选择

    • 如果如果方法或功能内部能够处理异常,就自己处理;如果自己处理不了,就抛给调用者
    • 后续程序如果还要运行,就try-catch语句自己处理;后续程序不需要执行,就throws抛出去

三、File类

1. File类概述

  • 概述

    • File类的作用
      • 是文件及目录路径(文件夹)的抽象表示形式
      • 可以对指定路径的文件或文件夹进行操作
  • 构造方法

    • File(String pathname)
      • 通过一个全路径得到一个文件对象
    • File(String parent,String child)
      • 通过父路径与子文件名得到一个文件对象
    • File(File parent,String child)
      • 根据父路径的文件对象与文件名得到一个文件对象
  • 构造方法示例

    public class Demo {//实例类,创建文件对象
    
        public static void main(String[] args) {
            String pathName = "F:\\MyDemo\\File";//全路径
            String parent = "F:\\MyDemo";//父路径
            String child = "File";//文件名
            File midFile = new File(parent);//父路径文件对象
    
            File file1 = new File(pathName);//使用全路径创建文件对象
            File file2 = new File(parent, child);//使用父路径与文件名创建对象
            File file3 = new File(midFile, child);//使用父路径的文件对象与文件名创建文件对象
        }
    }
    

2. File类方法

  • 创建功能

    • public boolean createNewFile()
      • 在指定的目录处创建新文件,已有则不再创建
      • 创建成功返回true,已有创建失败返回false
    • public boolean mkdir()
      • 在指定的目录处创建一个单层文件夹,返回值指创建成功与否
    • public boolean mkdirs
      • 在指定的目录处创建一个多级文件夹,返回值指创建成功与否
    • 如果创建文件时没有写路径,则默认在当前项目路径下
  • 删除功能

    • public boolean delete()
      • 删除文件或单层文件夹
    • 注意
      • 不能删除多层文件夹,且File类的delete方法不走回收站
  • 重命名功能

    • public boolean renameTo(File dest)
      • 将文件名更改为指定的文件的文件名
      • 如果两个文件在同一路径下,则是给调用者改名
      • 如果是不同的路径下,则是将指定文件剪切至原文件处
  • 判断功能

    • public boolean isDirectory()
      • 判断是否为文件夹
    • public boolean isFile()
      • 判断是否为文件
    • public boolean exists()
      • 判断是否存在
    • public boolean canRead()
      • 判断是否可读
    • public boolean canWrite()
      • 判断是否可写
    • public boolean isHidden()
      • 判断是否隐藏
  • 获取功能

    • public String getAbsolutePath()
      • 获得绝对路径的字符串形式
    • public String getPath()
      • 获得相对路径的字符串形式
    • public String getParent()
      • 获得父路径的字符串形式
    • public File getParentFile()
      • 获得父路径的文件形式
    • public long getTotalSpace()
      • 得到文件所在分区的总空间,单位是字节
    • public long getFreeSpace()
      • 得到问价所在分区的剩余空间,单位是字节
    • public String getName()
      • 获得文件名称
    • public long length()
      • 得到文件的大小,单位是字节
    • public long lastModified()
      • 得到文件的最后一次修改时间,单位是毫秒,是距离1970年1月1日的毫秒值
    • public String[] list()
      • 获得文件夹下所有文件的字符串表示
    • public File[] listFiles()
      • 获得文件夹下所有的文件的文件表示
  • 举例

    • 删除一个多级文件夹
    • 代码
    public class Deletes {//删除一个多级文件夹下的所有文件
    
        public static void main(String[] args) {
            String userAbsolutePath = "C:\\Users\\Administrator\\Desktop\\新建文件夹";//要删除文件的绝对路径
            File file = new File(userAbsolutePath);//创建文件对象
            deletes(file);//调用方法删除文件或文件夹
        }
        
        private static void deletes(File file) {//用来删除传入的文件夹
    
            File[] files = file.listFiles();//得到文件夹下所有文件的文件形式
    
            for (File file1 : files) {//遍历文件夹下所有的文件
                if (!file1.delete()) {//直接删,文件就删掉了,不能删的文件夹调用此方法再遍历删除内部文件,一直递归
                    deletes(file1);
                }
            }
            file.delete();//如果是文件夹里面有多个元素,删除完了子元素之后将自己的文件夹再删掉
        }
    }
    

3. 文件过滤器

  • 作用

    • 将调用者内的文件经过制定规则进行筛选,将满足规则的子文件进行输出
  • 两种返回形式

    • public String[] list(FilenameFilter filter)
      • 经过文件过滤器过滤,将得到的文件名以字符串数组形式返回
    • public File[] listFiles(FilenameFilter filter)
      • 经过文件过滤器过滤,将得到的文件名以文件数组的形式返回
  • 文件过滤器参数的输入

    • 使用匿名内部类,在匿名内部类内重写accept方法,实现具体的筛选逻辑
  • 举例

    • 采用文件过滤器方式,输出指定目录下以指定后缀名(如.jpg)结尾的文件
    • 代码
    public class DetermineSuffix {//采用文件过滤器方式,输出指定目录下以指定后缀名(如.jpg)结尾的文件的文件名
    
        public static void main(String[] args) {
            String suffix = ".jpg";//指定后缀名
            String directory = "C:\\Users\\Administrator\\Desktop\\img - 副本";//全指定路径
            File file = new File(directory);//创建文件对象
    
            File[] listFiles = file.listFiles(new FilenameFilter() {//获得文件中满足过滤器条件的子元素
                @Override
                public boolean accept(File dir, String name) {
                    if (name.endsWith(suffix)) {//当文件以指定的后缀名结尾时,添加进数组
                        return true;
                    }
                    return false;
                }
            });
    
            for (File listFile : listFiles) {//打印过滤后的文件中的元素
                System.out.println(listFile.getAbsolutePath());
            }
        }
    }

4. 练习

  • 修改指定目录下,所有文件的后缀名

    • 代码
    public class ChangeName {//修改指定目录下 所有文件的名称
    
        public static void main(String[] args) {
            String directory = "C:\\Users\\北风\\Administrator\\img - 副本";
            String oldString = ".png";//原后缀名
            String newString = ".jpg";//新后缀名
            File file = new File(directory);//创建指定路径的文件对象
            changeName(file, newString, oldString);//调用方法更改子文件名
        }
    
        /**
         * @param file:要改名的文件对象
         * @param newString:新字符串
         * @param oldString:原字符串
         * @Description:此方法可以将指定文件夹中的文件名更改
         */
        private static void changeName(File file, String newString, String oldString) {
            File[] files = file.listFiles();//得到文件数组的子元素
            for (File subFile : files) {//遍历文件数组
                if (subFile.isDirectory()) {//如果是文件夹,继续调用该方法
                    changeName(subFile, newString, oldString);
                } else {//如果是文件
                    File parentFile = subFile.getParentFile();//获得父路径文件对象
                    String fileName = subFile.getName().replace(oldString, newString);//获得更改过后的文件名
                    File newFile = new File(parentFile, fileName);//根据父路径与更改过后的文件名创建新对象
                    subFile.renameTo(newFile);//为原文件重命名 }
                }
            }
        }
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值