Day17Java学习笔记——IO流

tips:shift+F6 批量更改名字

扩展知识

HashMap源码分析

resize()——扩容

IO流

输入输出流,用来进行设备之间的一个数据输出

  • 网络:上传下载,本地:读写文件

— 数据以文件形式体现的

— 文件传输过程中,还会出现一些异常需要处理

准备知识
  • Java中的异常机制
  • 文件 File
异常机制:

背景:一人骑车中,车胎没气了,遇到问题,对这人来说是个小问题,选择解决or不解决;要是车胎没了,这个问题自己无法解决;要是出门前检查,发现车闸送了,必须解决,要不然不能上路

Throwable (translate:可扔) 问题:异常和错误的父类

问题子类:

  • Error 错误,严重性问题,无法解决:eg内存溢出
  • Exception 异常,一般性问题,可解决,在写程序中需要处理的就是异常
    • 运行期异常:RuntimeException及其子类,发生现在程序过程中,可解决,也可不解决
    • 编译器异常:非RuntimeException及其子类,发生在编译期间,不解决程序无法运行

运行期异常的默认处理方法是抛给jvm去处理,它默认会打印异常的堆栈信息,然后退出虚拟机;若用户觉得JVM默认处理异常的方式不友好,可自己捕获异常自己处理:

  • 使用关键字:try{}catch()
try{
	//try里面放的是,有可能出现的代码,一旦出现异常,就会执行catch中的代码;若try中没遇到异常,那么catch中代码不执行
    System.out.println(a/b);
}catch(ArithmeticException e){
    System.out.println("打印除数为0");
}
  • Ctrl+H 看一个类的继承关系
  • 右键 -》Diagrams
try{
	System.out.println(arr[3]);
    System.out.println(a/b);
    
}catch(ArrayIndexofBoundsException e){
    System.out.println("数组角标越界");
}catch(ArithmeticException e){
    System.out.println("打印除数为0");
}
  • catch 可以并列写多个,捕获不同异常

    catch(Exception e){
        System.out.println("其他异常");
    }//捕获所有异常,但不知道到底是什么异常
    
  • 注意,能明确的异常类型,尽量明确

tips:若用户捕获的异常是平级关系,谁前谁后无所谓,如过异常之间有继承关系,子类在前,父类在后

——用Scanner中注意:

在使用完scanner之后应该释放资源:scanner.close()

Scanner scanner = null;
try{
    sc=new Scanner(System.in);
    System.out.println();
    int a = sc.nextInt();
    System.out.println();
    int b = sc.nextInt();
    System.out.println(a/b);
   // sc.close();
}catch(ArithmeticException e){
    System.out.println("打印除数为0");
    e.printStackTrace();
    //打印异常的堆栈信息
}finally{
    System.out.println("finally里面的代码,不管try里面有没有遇到异常,都会执行");
    if(sc!=null){
    //判断输入是否为空,不是空再释放
        sc.close();
    }
}
在finally里面喜欢做一些善后工作,比如释放资源
  • 异常不只是打印出来,还可以做一些业务逻辑:

eg:

whlie(true){
    Scanner sc=new Scanner(System.in);
   System.out.println("输入整数");
    try{
    	int num=sc.nextInt();
    	System.out.println(num);
    	break;
	}catch(InputMismatchException e){
        System.out.println("请再次尝试输入整数");
	}
}

编译期异常

处理方式:

  • 抛给调用者处理,谁调用谁处理,简称甩锅——throws

  • 自己捕获处理

  • throws—用在方法内部进行抛出

    throw new ArithmeticException(”除数为0“)
    

eg:

public class MyTest {
    public static void main(String[] args) throws CloneNotSupportedException{
       
        try {
            hehe();
        } catch (ParseException e) {
            e.printStackTrace();
        }
        System.out.println("========");
    }

    public static void hehe() throws ParseException{
        new SimpleDateFormat("yyyy-MM-dd").parse("2017:11-11");
    }
}

class Dog implements Cloneable{
    @Override
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

快捷键演示

运行期异常:选中可能有问题的代码,用Ctrl + Alt +t,自动生成

编译期异常:Alt+Enter 万能纠错键;选择抛出或捕获

**tips:**throws与throw区别

  • throws 用在方法声明上,是抛出多个异常的类型,抛出的只是一中发生该类异常的可能性,并不会一定发生
  • throw 用在方法内部,它只能抛出一个异常对象,一个具体的异常对象,一旦抛出,就说明发生了这种情况

自定义异常

——当Java提供的这些异常类并不能完全描述,在开发中所要描述的异常,那么就需要自定义异常

eg:

//模拟银行取款余额异常
public class MyTest {
    public static void main(String[] args) {
        //自定义异常;当Java提供的这些异常类,并不能完全描述,我在开发中所要描述的异常,那么就需要我们自定义异常
        int num = 100;
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你的取款金额");
        int money = scanner.nextInt();
        if (money <= num) {
            num -= money;
        } else {
            // System.out.println("余额不足");
            //我想要抛出一个余额不足异常
            throw new NoMoneyException("余额不足");
        }
    }

}
public class NoMoneyException extends RuntimeException{

    public NoMoneyException(String msg) {
        super(msg);
    }
}

子类父类的异常

——子类在重写父类方法时,方法内部出现编译期异常,若父类方法没有throws该异常,子类就不能抛出;

——子类不能抛出父类没有抛出过的异常;

——父类有抛出异常,子类可以不抛出;

——子类抛出的异常不能比父类 大,只能比父类的小或一样

File

IO:输入输出流,用来进行设备之间的一个数据传输,那么在传输过程总就可能会有异常出现,需要处理,so先学异常机制

Java提供了一个类:File 来描述文件和目录

构造方法:

new File();

路径:

——绝对路径;带有盘符号的详细路径

——相对路径:不带有盘符号的路径(项目文件夹的根目录)

创建文件,返回值的意思为文件是否创建成功

file.createNewFile();

——第一次创建文件时,创建成功返回true

——文件已经存在,重复创建返回false

如何创建目录

file.mkdir();

——返回值 是目录是否创建成功

——文件夹已经存在,重复创建返回false

——只能创建单级目录

file.mkdirs();——创建单级或多级目录

删除文件与文件夹

先封装,再删除

file.delete();——返回删除成功与否

delete();——不能直接删除多级目录(用递归从里面开始删处)

重命名

renameTo();

——重命名文件:传入的这个新文件和旧文件路径一致,只是文件名不一样,就会重命名

——剪切功能:传入的新文件和旧文件路径不一致,就会把旧文件剪切走

File file = new File("abc.txt");
File file2 = new File("E:\\abc.txt");
file.renameTo(file2);

判断功能

isFile();——判断是否为文件

isDirectory();——判断是否为目录

.canWrite();——可写
.canRead();——可读

.isHidden();——是否隐藏

file.canExecute();——Linux下判断文件是否执行

与获取相关的方法

file.length()——获取文件的字节数

file.getName()——获取文件名

file.getParent()——获取文件的父路径(返回字符串形式)

file.getParentFile()——获取文件的父路径(返回File类型)

file.getAbsoluteFile()——获取文件的绝对路径(返回File类型)

file.getAbsolutPath()——获取文件的绝对路径(返回字符串形式)

file.getPath()——获取文件的相对路径(返回字符串形式)

file.getTotalSpace()——获取磁盘的大小(单位字节)

file.getFreeSpace()——获取剩余容量

file.lastModified()——获取文件最后一次修改时间(单位是毫秒值)

file.exists()——判断文件在不在

file.list()——获取指定目录下的所有文件或者文件名的名称数组,返回字符串数组,遍历数组(不灵活)

file.listFiles()——获取指定目录下的所有文件或者文件夹的File数组

过滤的方法,根据此方法的返回值进行过滤,返回false不往数组里面装

new FilenameFilter(){}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值