java入门~第二十天 IO概述、会出现的异常以及File的创建

本文详细介绍了Java的IO流概述、异常处理机制,包括异常的分类、处理方式,如try...catch、throws等。此外,还深入讲解了File类的操作,如创建、删除、重命名文件以及文件的判断功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.IO的概述

1.1IO流概述

IO流用来处理设备之间的数据传输,上传文件和下载文件。

1.2IO流前奏

讲解IO流之前为什么先讲解异常和File类呢?
因为File表示的是IO流将来要操作的文件,所以我们需要学习File类。
而常见操作文件无非就是上传文件和下载文件,在这个操作的过程中可能出现问题,出现问题后,我们需要对对应的代码进行处理。所以我们需要学习异常。

2.异常

处理异常的快捷键 ctrl+alt+T
对于编译期异常,按 alt+enter  自己选一下处理方式

2.1异常的概述和分类

1.异常的概述: 异常就是Java程序在运行过程中出现的错误。

2.异常的分类:

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

运行期异常:RuntimeException,不处理可以正常运行。

总结:所有异常都继承Throwable,异常机制并不是只有坏处理,合理利用异常可以提高程序的健壮性。
在这里插入图片描述

3.异常的继承体系:

​ 异常的基类: Throwable
​ 严重问题: Error 不予处理,因为这种问题一般是很严重的问题,比如: 内存溢出
​ 非严重问题: Exception
​ 编译时异常: 非RuntimeException
​ 运行时异常: RuntimeException

2.2JVM默认是如何处理异常的

main函数收到这个问题时,有两种处理方式:
a:自己将该问题处理,然后继续运行,即try…catch…finally
b:自己没有针对的处理方式,只有交给调用main的jvm来处理,即throws,jvm有一个默认的异常处理机制,就将该异常进行处理.并将该异常的名称,异常的信息.异常出现的位置打印在了控制台上,同时将程序停止运行。

​ 例如:1/0

public static void main(String[] args) throws IOException {
  // 运行期异常: RuntimeException及其子类 运行期异常我们自己可以解决,也可不不解决
    int a=10;
    int b=0;
    //ArithmeticException 除数为0的异常
    System.out.println(a/b);
    //Exception in thread "main" java.lang.ArithmeticException: / by zero
    // 对于运行期异常,我们自己自己没有处理,就交由JVM去处理,JVM的默认处理方式是
    //打印详细的异常信息,然后退出虚拟机。
    // 如果你觉得JVM默认处理异常的方式,不够友好,那么我们可以自己去捕获这个异常,自己来处理
    System.out.println("下面代码");//没有运行
}

2.21try…catch的方式处理异常1

try…catch处理异常的基本格式:

try	{
	可能出现问题的代码 ;
}catch(异常名 变量名){
	针对问题的处理 ;
    //可以输入自己需要的信息,或者调用printStackTrace打印异常信息。
}finally{
	释放资源;
}

变形格式:
		try	{
			可能出现问题的代码 ;
		}catch(异常名 变量名){
			针对问题的处理 ;
		}
//后面的程序继续运行

注意事项:
a: try中的代码越少越好
b: catch中要做处理,哪怕是一条输出语句也可以.(不能将异常信息隐藏)

例如:

public static void main(String[] args)  {
    // 运行期异常: RuntimeException及其子类 运行期异常我们自己可以解决,也可不不解决
    int a = 10;
    int b = 0;
   
    try {

        System.out.println(a / 0);
    }catch (ArithmeticException e) {
        System.out.println("除数为0了");//除数为0了
    }
    System.out.println("下面代码");//下面代码
    System.out.println("下面代码");//下面代码
}
public static void main(String[] args) {

    int a = 1;
    int b = 0;
    
    try {
        System.out.println(a / b);
    } catch (ArithmeticException e) {
        //System.err.println("数学异常");
        e.printStackTrace(); //打印异常的详细信息。
        //System.out.println(e.toString());
        //System.out.println(e.getMessage());
    }
    System.out.println("下面代码");
    System.out.println("下面代码");
    System.out.println("下面代码");
}

例如:

public static void main(String[] args) {
   /*while (true) {
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入一个整数");
            if(scanner.hasNextInt()){
                int num = scanner.nextInt();
                System.out.println(num);
                break;
            }else{
                System.out.println("输入的类型不对,请重新输入一个整数");
            }
        }*/
     while (true) {
            Scanner scanner = new Scanner(System.in);
            try {
                System.out.println("请输入一个整数");
                int num = scanner.nextInt();
                System.out.println(num);
                break;
            }catch (InputMismatchException e) {
                System.out.println("你输入的类型不正确,请重新输入一个整数");
            }
        }
    
}

2.22try…catch的方式处理异常2

try…catch的方式处理多个异常:

try {
可能出现问题的代码 ;
}catch(异常名1 变量名1){
对异常的处理方式 ;
}catch (异常名2 变量名2){
对异常的处理方式 ;
}…

注意事项:
1:能明确的尽量明确,不要用大的异常来处理。
2:平级关系的异常谁前谁后无所谓,如果出现了子父关系,父必须在后面。

public static void main(String[] args)  {
    int[] arr={2,3};
    int a=1;
    int b=0;
    arr=null;
    //1.你能明确的异常,尽量明确,不要拿一个最大的异常一捕了之。
    //2.捕获多个异常时,大的异常,放在最后面,平级关系的异常,谁前谁后无所谓。
    try{
        System.out.println(arr.length);//执行了第一句
        System.out.println(a / b);
        System.out.println(arr[3]);
    }catch (ArrayIndexOutOfBoundsException e){
        System.err.println("角标越界异常");
    }catch (ArithmeticException e){
        System.err.println("除数为0了");
    }catch (NullPointerException e){
        System.out.println("空指针异常");//就捕捉了一句
    } catch (Exception e) {
        System.out.println("其他异常");
    }
    System.out.println("下面代码");//这三句不影响执行
    System.out.println("下面代码");
    System.out.println("下面代码");
    //空指针异常
	//下面代码
	//下面代码
	//下面代码
}

所以不能放在一个大的异常来处理,可以多个try,多个catch.

对于编译期异常,我们有两种处理方式:
方式1:使用 throws 抛出异常,抛给调用者,谁调用谁处理,俗称甩锅。
方式2: 使用try catch 自己捕获处理。

2.23JDK7针对多个异常的处理方案

      public static void main(String[] args)  {
        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]);
            //JDK1.7 提供的这种语法,不推荐
        } catch (ArrayIndexOutOfBoundsException| ArithmeticException | NullPointerException  e) {
            if(e instanceof ArrayIndexOutOfBoundsException ){
                System.out.println("aa");
            }else if(e instanceof ArithmeticException){
                System.out.println("bb");
            }else if(e instanceof NullPointerException){
                System.out.println("cc");
            }else{
      }
    }
    System.out.println("下面代码");
    System.out.println("下面代码");
    System.out.println("下面代码");
										//cc
										//下面代码
										//下面代码
										//下面代码
}

2.3编译期异常和运行期异常的区别

编译期异常和运行期异常的区别

Java中的异常被分为两大类:编译时异常和运行时异常。
所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常

编译时异常: Java程序必须显示处理,否则程序就会发生错误,无法通过编译
运行时异常: 无需显示处理,也可以和编译时异常一样处理

2.4Throwable的几个常见方法

Throwable的几个常见方法
a: getMessage(): 获取异常信息,返回字符串。
b :toString(): 获取异常类名和异常信息,返回字符串。
c: printStackTrace(): 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。

2.41throws的方式处理异常

throws的方式处理异常
定义功能方法时,需要把出现的问题暴露出来让调用者去处理。
那么就通过throws在方法上标识。

2.42throw的概述以及和throws的区别

throws

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

throw

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

public static void main(String[] args)  {
    //  throw 和 throws 的区别

  /*  C:
    throws和throw的区别
    a:throws
    用在方法声明后面,跟的是异常类名
    可以跟多个异常类名,用逗号隔开
    表示抛出异常,由该方法的调用者来处理
    throws表示出现异常的一种可能性,并不一定会发生这些异常
    b:
    throw
            用在方法体内,跟的是异常对象名
            只能抛出一个异常对象名
    这个异常对象可以是编译期异常对象, 可以是运行期异常对象
    表示抛出异常,由方法体内的语句处理
    throw则是抛出了异常,执行throw则一定抛出了某种异常*/

    Scanner sc = new Scanner(System.in);
    System.out.println("请输入第一个整数");
    int a = sc.nextInt();
    System.out.println("请输入第二个整数");
    int b = sc.nextInt();

    double r=show(a,b);

    System.out.println(r);

}

private static double show(int a, int b) {
    double r=0;
    if(b==0){
        //throw 用在方法内部进行异常的抛出。
        throw new ArithmeticException("除数为0,程序接收");
//Exception in thread "main" java.lang.ArithmeticException: 除数为0,程序接收
    }else{
        r=a/b;
    }
    return r;
}

2.5finally关键字

2.51finally关键字的特点及作用

1.finally的特点:
被finally控制的语句体一定会执行(前提 jvm没有停止)
特殊情况:在执行到finally之前jvm退出了(比如System.exit(0))
2.finally的作用: 用于释放资源,在IO流操作和数据库操作中会见到。

public static void main(String[] args) {
    try {
        System.out.println(1/1);
    }catch (Exception e) {
        e.printStackTrace();
    }finally {
        //一般来说,在这个finally里面做一些善后,收尾工作,比如释放资源。
        System.out.println("不管有没有遇到异常,finally 里面的代码都会执行");
    }

}

2.52final,finally和finalize的区别

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

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

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

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

public static void main(String[] args)  {
    int a=23;
    int b=0;
    try {

        System.out.println(23 / 0);
    } catch (Exception e) {
        System.out.println("哦,catch了...............");
        return ;
    }finally {
        System.out.println("哦,被执行了..............");
    }
    //哦,catch了...............
    // 哦,被执行了..............
}

finally的代码还会执行,在return前。

2.6自定义异常

1.为什么要有自定义异常?Java给给我们提供了很多异常类,来描述我们在开发中所遇到一些常见的问题,但是还是不足以,描述我们所遇到一些异常情况。

2.自定义异常概述 需要将我们自定义的异常类纳入到我们的异常体系中
继承自Exception
继承自RuntimeException

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("余额不足异常");
        }
    }
}
public class NoMoneyException extends RuntimeException {
	//调方法返回错误信息
    public NoMoneyException(String msg) {
        super(msg);

    }
}

2.7异常的注意事项及如何使用异常处理

1.异常注意事项(针对编译期异常)
a:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类,或者子类不抛出异常也是可以的。(父亲坏了,儿子不能比父亲更坏)
b:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是他的子集,子类不能抛出父类没有的异常,或者子类不抛出异常也是可以的。
c:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws

2.如何使用异常处理
原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws

如果JDK没有提供对应的异常,需要自定义异常。

3.File文件类

3.1File类的概述和构造方法

1.File类的概述:查看API,文件和目录路径名的抽象表示形式,这个File类可以用来表示文件,也可以用来表示目录。

2.构造方法:
File(String pathname):根据一个路径得到File对象 。

通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。

绝对路径:包含盘符号的一个详细路径
相对路径:不含有盘符号的路径。

​ File(String parent, String child):根据一个目录和一个子文件/目录得到File对象

根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。

	File(File parent, String child):根据一个**父File对象和一个子文件/目录**得到File对象

根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。

public static void main(String[] args) {
    File file = new File("E:\\IdeaProjects\\20200809-File-文件类-下午\\a.txt");
    //Java中的相对路径:Java工程的文件夹的根目录
    File file1 = new File("a.txt");
    System.out.println(file);
    System.out.println(file1);

    File file2 = new File("src/b.txt");
    System.out.println(file2);
}

3.2File类的创建功能

public boolean createNewFile():创建一个新的文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹,如果存在这样的文件夹,就不创建了 注意这个方法只能创建单层目录 如果创建多层目录得一层一层创建
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来 可以创建多层目录 当然也可以创建单层目录

​ **注意事项:**如果你创建文件或者文件夹忘了写盘符路径,那么,默认在项目路径下。

3.3File类的删除功能

删除功能
public boolean delete():删除文件或者文件夹 (删除文件,注意不走回收站)
注意:删除文件夹时 这个文件夹是空文件夹 如果这个文件夹里面有文件,则不能删除

3.4File类的重命名功能

public boolean renameTo(File dest):把文件重命名为指定的文件路径

注意事项:
如果路径名相同,就是改名。
如果路径名不同,就是改名并剪切。

3.5File类的判断功能

​ public boolean isDirectory(): 判断是否是目录
​ public boolean isFile(): 判断是否是文件
​ public boolean exists(): 判断是否存在
​ public boolean canRead(): 判断是否可读
​ public boolean canWrite(): 判断是否可写
​ public boolean isHidden(): 判断是否隐藏
​ public boolean isAbsolute(); 判断是否使用的是绝对路径

3.6File类的获取功能

public String getAbsolutePath():	获取绝对路径
public String getPath():		获取相对路径
public String getParent()   返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
public File getParentFile()  返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。 
public long getTotalSpace()  返回此抽象路径名指定的分区大小。 返回总容量 单位字节
public long getFreeSpace()   返回此抽象路径名指定的分区中未分配的字节数。返回剩余容量 单位字节
public String getName():		获取名称
public long length():			获取长度。字节数
public long lastModified():		获取最后一次的修改时间,毫秒值
public String[] list():			获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles():		获取指定目录下的所有文件或者文件夹的File数组 
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");

  //已用空间=总空间-剩余空间
}

3.7文件名称过滤器的概述及使用

文件名称过滤器的概述
public String[] list(FilenameFilter filter)获取指定目录下的**所有文件或者文件夹的名称**数组

public File[] listFiles(FilenameFilter filter)获取指定目录下的所有文件或者文件夹的File数组

文件名称过滤器的使用: 需求:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称

  • 分析:
  • a: 把E:\demo这个路径封装成一个File对象
  • b: 获取所有的以.jpg结尾的文件数组 (相当于过滤)
  • c: 遍历数组
public static void main(String[] args) {
  /*  public String[] list ():获取指定目录下的所有文件或者文件夹的名称数组
    public File[] listFiles ():获取指定目录下的所有文件或者文件夹的File数组*/
    //需求:判断test盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
    File file = new File("C:\\Users\\ShenMouMou\\Desktop\\test");
    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);
         }
    }
}

方法二:

public static void main(String[] args) {
    File file = new File("C:\\Users\\ShenMouMou\\Desktop\\test");
    File[] files = file.listFiles();
    for (File f : files) {
        if(f.isFile()&&f.getName().endsWith(".jpg")){
            System.out.println(f.getName());
        }
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值