java 16 IO流、异常、文件

IO流

  • IO流:输入输出流,用于设备之间的一个数据传输。
Throwable 问题
  • Error 错误,属于严重性问题

  • Exception 异常,属于一般性问题

    1. 运行期异常:RuntimeException及其子类

      对于运行期异常,我们自己没有处理,就交由JVM去处理,JVM的默认处理方式是打印详细的异常信息,然后退出虚拟机。

      如果觉得JVM的处理异常方式不够友好,可以使用try catch 来进行异常的捕获处理。

      try里放的是有可能会出现异常的代码

      catch(){}小括号中放的是将要捕获的那种异常

      catch(){}大括号中放的是一旦发生捕获的这种异常,处理方式是什么。

      int a = 10;
      int b = 0;
      try {
          System.out.println(a / 0);
      }catch (ArithmeticException e) {
          System.out.println("除数为0了");
      }
      

      能明确的异常尽量明确,不要拿一个最大的异常一捕了之。

      捕获多个异常时,大的异常放在最后面,平级关系的异常,谁前谁后无所谓。

      • 注意:
      1. try中尽可能放的是有可能出现问题的代码

      2. 一旦发生异常,异常的处理不能空处理,即便打印一句话提示一下都可以

        int[] arr = {2, 3};
        int a = 1;
        int b = 0;
        arr = null;
        try {
            System.out.println(arr.length);
            System.out.println(a / b);
            System.out.println(arr[3]);
        } catch (ArrayIndexOutOfBoundsException| ArithmeticException | NullPointerException  e) {
            if(e instanceof ArrayIndexOutOfBoundsException ){
        
            }else if(e instanceof ArithmeticException){
        
            }else if(e instanceof NullPointerException){
        
            }else{
        
            }
        }
        
    2. 编译期异常

      发生在编译期,非RuntimeException 及其子类,编译期异常,必须处理,不处理的程序无法运行。

      对于编译期异常,我们有两种处理方式:

      1. 使用 throws 抛出异常,抛给调用者,谁调用谁处理。
      2. 使用try catch 自己捕获处理。
    • throw和throws的区别:

      throws:

      ​ 用在方法声明后面,跟的是异常类名
      ​ 可以跟多个异常类名,用逗号隔开
      ​ 表示抛出异常,由该方法的调用者来处理
      ​ throws表示出现异常的一种可能性,并不一定会发生这些异常

      throw:

      ​ 用在方法体内,跟的是异常对象名
      ​ 只能抛出一个异常对象名
      ​ 这个异常对象可以是编译期异常对象, 可以是运行期异常对象
      ​ 表示抛出异常,由方法体内的语句处理
      ​ throw是抛出了异常,执行throw则一定抛出了某种异常

    • finally

      不管有没有遇到异常,finally里面的代码都会执行。一般来说,在这个finally里面做一些善后收尾工作

    • final,finally和finalize的区别

      ​ final: 是一个状态修饰符, 可以用来修饰类 , 变量 , 成员方法.
      ​ 被修饰的类不能被子类继承, 修饰的变量其实是一个常量不能被再次赋值

      ​ 修饰的方法不能被子类重写

      ​ finally:用在try…catch…语句中 , 作用: 释放资源 . 特点: 始终被执行(JVM不能退出)

      ​ finalize: Obejct类中的一个方法,用来回收垃圾

    • 如果catch里面有return语句,请问finally的代码还会执行吗?如果会,请问是在return前还是return后。
      答:会执行, 在return前

      public static void main(String[] args) {
          try {
              System.out.println(23 / 0);
          } catch (Exception e) {
              System.out.println("哦,catch了...............");
              return ;
          }finally {
              System.out.println("哦,被执行了..............");
          }
      }/*哦,catch了...............
      	哦,被执行了..............*/
      
  • 自定义异常

    为什么要有自定义异常?

    ​ java给我们提供了很多异常类,来描述我们在开发中所遇到的一些常见问题,但这样还不足以描述我们遇到的所有异常。

    例:余额不足异常

    public class MyTest {
    
        private static double money;
    
        public static void main(String[] args) {
            money = 100;
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入你的取款金额");
            double num = scanner.nextDouble();
            quKuan(num);
        }
        private static void quKuan(double num) {
            if(num<=money){
                money-=num;
                System.out.println("取款成功");
            }else{
                throw  new NoMoneyException("余额不足异常");
            }
        }
    }
    
    1. 子类在重写父类方法时,父类方法没有抛出过异常,子类在重写时,不能抛出异常。
    2. 父类方法如我有抛出异常,那么子类在重写父类方法时,可以抛出和父类一样的异常,或者说比父类的异常小,或者说不抛异常也可以。
    3. 子类不能抛出父类没有抛出的异常。
    • 处理异常的快捷键ctrl+alt+T
文件

File 文件和目录路径名的抽象表示形式。

File(String pathname);

  • 实例化

    public static void main(String[] args) {
       /* File(String parent, String child)
        根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。*/
        File file = new File("C:\\Users\\Administrator\\Desktop","a.txt");
        System.out.println(file);//C:\Users\Administrator\Desktop\a.txt
        /*File(File parent, String child)*/
        File file1 = new File("C:\\Users\\Administrator\\Desktop");
        File file2 = new File(file1, "a.txt");
        System.out.println(file2);//C:\Users\Administrator\Desktop\a.txt
    }
    
  • 绝对路径:包含盘符号的一个详细路径

    相对路径:不包含有盘符号的路径

  • 创建一个新文件,第一次创建返回true,重复创建返回false。

    public static void main(String[] args) throws IOException {
        File file = new File("C:\\Users\\Administrator\\Desktop\\b.txt");
        //创建一个新的文件,第一次创建成功返回true,重复创建会返回false
        boolean b = file.createNewFile();
        System.out.println(b);//true
        File file2 = new File("C:\\Users\\Administrator\\Desktop\\b.txt");
        boolean newFile = file2.createNewFile();
        System.out.println(newFile);//false
    
  • 创建文件夹

    public static void main(String[] args) {
        File file = new File("aa");
        //创建单级文件夹,重复创建返回false
        file.mkdir();
        File file3= new File("bb/cc/dd/ee");
        //mkdirs() 创建单级或多级文件夹
        file3.mkdirs();
    }
    
  • 删除文件

    public static void main(String[] args) {
        File file = new File("src/b.txt");
        //删除文件,注意不走回收站
          boolean b = file.delete();
        //delete(); 删除文件夹时,只能删掉空文件夹,非空目录不能删除
        System.out.println(b);
    }
    
  • 重命名

    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\Desktop\\a.txt");
        //renameTo(file1); 有两层作用
        //1.如果原来的文件和你传入的这个文件,用的是同一路径,是重命名
        //2.如果原来的文件和你传入的这个文件,不是同一路径,就会发生重命名并剪切,把源文件,剪切到你传入的这个文件路径下。
        File file1 = new File("C:\\Users\\Administrator\\Desktop\\d.txt");
        file.renameTo(file1);
    }
    
  • 判断功能

    public static void main(String[] args) {
        File file = new File("a.txt");
        //判断是否是文件
        System.out.println(file.isFile());
        //判断是否是目录
        System.out.println(file.isDirectory());
        File file1 = new File("C:\Users\Administrator\Desktop\aa.txt");
        //判断是否可读
        System.out.println(file1.canRead());
        //判断是否可写
        System.out.println(file1.canWrite());
        //判断文件是否隐藏
        System.out.println(file1.isHidden());
        //判断文件是否存在
        System.out.println(file1.exists());
        //判断是否使用的是绝对路径
        System.out.println(file1.isAbsolute());
        System.out.println(file.isAbsolute());
    
    }
    
  • 获取功能

    public static void main(String[] args) {
        File file = new File("a.txt");
        File file1 = new File("C:\\Users\\Administrator\\Desktop\\aa.txt");
        //getName(); 获取文件名
        String name = file1.getName();
        System.out.println(name);//aa.txt
        //获取文件的大小 单位是字节
        long length = file1.length();
        System.out.println(length);//0
        //获取文件的绝路径路径,返回的是字符串形式
        String absolutePath = file1.getAbsolutePath();
        System.out.println(absolutePath);//C:\Users\Administrator\Desktop\aa.txt
        //获取文件的绝路径路径,返回的是File类型,比较灵活
        File absoluteFile = file1.getAbsoluteFile();
        System.out.println(absoluteFile.toString());
        //C:\Users\Administrator\Desktop\aa.txt
        //获取相对路径
        String path = file.getPath();
        System.out.println(path);//a.txt
        //获取父路径getParent(); 返回的是 字符串的形式
        String parent = file1.getParent();
        System.out.println(parent);//C:\Users\Administrator\Desktop
        //getParentFile();获取父路,返回的是File类型
        File parentFile = file1.getParentFile();
        System.out.println(parentFile);//C:\Users\Administrator\Desktop
    }
    
  • 获取磁盘空间

    public static void main(String[] args) {
        File file = new File("D:\\");
        //获取磁盘的总空间大小,单位字节
        long totalSpace = file.getTotalSpace();
        System.out.println(totalSpace/1024/1024/1024.0+" GB");
        //获取磁盘的剩余空间
        long freeSpace = file.getFreeSpace();
        System.out.println(freeSpace / 1024 / 1024 / 1024.0 + " GB");
    }
    
  • 获取文件更改时间

    public static void main(String[] args) {
        // public long lastModified ():获取最后一次的修改时间,毫秒值
        File file1 = new File("C:\\Users\\Administrator\\Desktop\\b.txt");
        long l = file1.lastModified();
        //把毫秒值,转换成年月日 时分秒
        System.out.println(l);
        Date date = new Date(l);
        String str = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date);
        System.out.println(str);
    
    }
    
  • 获取文件或文件夹的数组

    public static void main(String[] args) {
      /*  public String[] list ():获取指定目录下的所有文件或者文件夹的名称数组
        public File[] listFiles ():获取指定目录下的所有文件或者文件夹的File数组*/
        //需求:判断Desktop目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
        File file = new File("C:\\Users\\Administrator\\Desktop");
        String[] list = file.list();
        for (String s : list) {
            File f = new File(file, s);
            //System.out.println(f);
            if(f.isFile()&&f.getName().endsWith(".jpg")){
                 System.out.println(s);
             }
        }
    }
    
  • 将文件夹中的.png文件改为.jpg文件

    public static void main(String[] args) {
        File file = new File("C:\\Users\\Administrator\\Desktop\\test");
        File[] file1 = file.listFiles();
            for (File s : file1) {
                if (s.isFile() && s.getName().endsWith(".png")) {
                    String oldpath = s.getAbsolutePath();
                    String SubString = oldpath.substring(0, oldpath.lastIndexOf("."));
                    File  NewName = new File(SubString + ".jpg");
                    boolean a=s.renameTo(NewName);
                    System.out.println(a);
                }
            }
        }
    }
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值