JavaSE-异常机制File类IO流

Posted Recently 祝祝

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaSE-异常机制File类IO流相关的知识,希望对你有一定的参考价值。

今天内容: (1)异常机制 (2)File类 (3)IO流

1.异常机制(重点、简单)

1.1 基本概念
异常就是"不正常"的含义,在Java语言中用于表示运行阶段发生的错误。
java.lang.Throwable类是Java语言中所有错误(Error)和异常(Exception)的超类。
其中Error类主要用于描述比较严重无法编码解决的问题,如:JVM挂了。
其中Exception类主要用于描述比较轻微可以编码解决的问题,如:0作为除数。

1.2 基本分类
java.lang.Exception类是所有异常类的超类,主要分为以下两大类:
RuntimeException - 运行时异常,也叫作非检测性异常
IOException和其它异常 - 其它异常,也叫作检测性异常
- 所谓检测性异常就是在编译阶段能够被编译器检测出来的异常
其中RuntimeException类的主要子类:
ArithmeticException - 算术异常
ArrayIndexOutOfBoundsException - 数组下标越界异常
NullPointerException - 空指针异常
ClassCastException - 类型转换异常
NumberFormatException - 数字格式异常
在这里插入图片描述

注意:
当程序执行过程中发生异常但没有手动处理时,由Java虚拟机采用默认方式处理,而默认处理方式就是:打印异常名称、异常原因、异常发生的位置等并终止程序。

1.3 异常的避免
在以后的开发中尽量使用if条件判断来避免异常的发生。

1.4 异常的捕获
// 异常是否被捕获的区别在于:是否继续向下执行代码
(1)语法格式
try {
编写可能发生异常的语句;
}
catch(异常类型 变量名) {
编写针对该类异常的处理语句;
}

finally {
编写无论是否发生异常都应该执行的语句;
}

package ExceptionTest;

public class ExceptionFinally {
    public static void main(String[] args) {
        try{
            int ia=10;
            int ib=0;
            System.out.println(ia/ib);
        }catch (Exception e){
            e.printStackTrace();
            // return;//仅仅用于结束该方法
        }finally {
            System.out.println("无论是否发生异常都回来光顾我!!!");
        }
        System.out.println("程序结束了!!!");
    }

}

在这里插入图片描述

注意注意注意:知识点扩充:

catch(Exception e){
e.printStackTrace() ;
}

1:当try语句中出现异常是时,会执行catch中的语句,java运行时系统会自动将catch括号中的Exception e 初始化,也就是实例化Exception类型的对象。e是此对象引用名称。然后e(引用)会自动调用Exception类中指定的方法,也就出现了e.printStackTrace() ;。
printStackTrace()方法的意思是:在命令行打印出:异常信息在程序中出错的位置及原因。(这是白话解释,比较容易理解)
2:System.out.println(e);这个方法打印出异常,并且输出在哪里出现的异常;e.printStackTrace()也是打印出异常,但是它还将显示出更深的调用信息
3:e.printStackTrace();是打印异常的堆栈信息,指明错误原因,其实当发生异常时,通常要处理异常,这是编程的好习惯,所以e.printStackTrace()可以方便你调试程序!

package ExceptionTest;


import com.sun.xml.internal.ws.policy.privateutil.PolicyUtils;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

public class errorTest {
    public static void main(String[] args) throws IOException {
        //构造对象与文件夹相连
        FileInputStream fis =null;
        try{
            System.out.println("1");
            fis=new FileInputStream("c:/a.txt");
            System.out.println("2");
        }catch (FileNotFoundException e){
            System.out.println("3");
            e.printStackTrace();
            System.out.println("4");
        }
//        断开关联
        try{
            System.out.println("5");
            fis.close();
            System.out.println("6");
        }/*catch (IOException e){
            System.out.println("7");
            e.printStackTrace();
            System.out.println("8");
        } catch (NullPointerException e) {
            System.out.println("空指针异常被处理了!");
            e.printStackTrace();
        }*/catch (Exception e){
            e.printStackTrace();
        }

        System.out.println("世界上最真情的相依就是你在try我在catch,"
                + "无论你发神马脾气我都默默接收并静静地处理!");

    }
}

代码1:

catch (IOException e){
            System.out.println("7");
            e.printStackTrace();
            System.out.println("8");
        } catch (NullPointerException e) {
            System.out.println("空指针异常被处理了!");
            e.printStackTrace();
        }

代码二:

catch (Exception e){
            e.printStackTrace();
        }

在Java里代码一等同于代码二

(2)注意实现
a.当需要编写多个catch分支时,切记小类型的异常应该放在大类型异常的上面
懒人的写法:
catch(Exception e){ … }
b.finally主要用于编写善后处理的语句,如:关闭已经打开的文件等。

(3)执行流程
try {
a;
b; - 可能发生异常的语句
c;
} catch(…) {
d;
} finally {
e;
}

当上述程序执行过程没有发生异常时的执行流程:a b c e;
当上述程序执行过程发生异常时的执行流程:a b d e;

1.5 异常的抛出
(1)基本概念
在某些特殊情况下产生的异常无法处理或者不便于处理时,就可以将该异常转移给该方法的调用者,这种方式就叫做异常的抛出。
在这里插入图片描述

(2)语法格式
访问权限 返回值类型 方法名称(形参列表) throws 异常类型1, 异常类型2, …{}
如:
public void show() throws IOException {}

package ExceptionTest;

import java.io.FileInputStream;
import java.io.IOException;

public class ExceptionThrowsTest {
    // 在以后的开发中不建议在main方法中抛出异常
    public static void main(String[] args) throws IOException {
        FileInputStream fis =new FileInputStream(" c:/a.txt");
        fis.close();
    }
}

(3)方法重写的原则
a.要求方法名相同、参数列表相同、返回值类型相同,从jdk1.5开始允许返回子类类型
b.要求方法的访问权限不能变小,可以相同或者变大
c.要求不能抛出更大的异常
在这里插入图片描述

package cn.learn.day15;

import java.io.IOException;

public class SuperExceptionTest {

	public void show() throws IOException {
		
	}
}
package cn.learn.day15;

import java.io.FileNotFoundException;
import java.io.IOException;

import org.omg.CORBA.portable.ApplicationException;

public class SubExceptionTest extends SuperExceptionTest {

	@Override
	//public void show() throws Exception { error 不能抛出更大的异常
	// error 不能抛出同级不一样异常
	//public void show() throws ApplicationException { 
	//public void show() throws IOException { ok 可以抛出相同的异常
	//public void show() throws FileNotFoundException { ok 可以抛出更小的异常
	public void show() { //ok 可以不抛出异常	
	
	}
}

1.6 自定义异常
(1)基本概念
虽然Java官方提供了大量的异常类,但一定不会包含所有开发中可能出现的异常,在Java程序中若需要表达特定问题的特定异常时,就需要程序员自定义异常来描述。
在这里插入图片描述

(2)实现流程
a.自定义xxxxException继承自Exception类或者其子类;
b.提供两个版本的构造方法:无参构造方法 和 字符串作为参数的构造方法;
自定义异常:

package ExceptionTest;

public class AgeException extends Exception {
        /*

        *

        **/
        private static final long serrivalVersionUID =1L;
        public AgeException() {
         }

        public AgeException(String msg) {
            super(msg);// 调用父类的有参构造方法
        }

}

练习:https://shimo.im/docs/yxrT3QHkWc3pRYTK

注意注意:知识扩充:
throw 与throws的区别
1:throw后面跟的是对象,只能跟一个对象
2:throws放在小括号的后面
3:throws后面跟的是一个类型,或者很多类型

一张图搞定异常:

在这里插入图片描述

2.File类(查手册会用即可)

中文版手册:https://www.matools.com/api/java8
2.1 基本概念
换包:换到Java.io包
java.io.File类主要用于描述文件和目录的路径信息可以获取名称、大小等属性信息

2.2 常用的方法
在这里插入图片描述

绝对路径 - 主要指以根目录开始的路径信息,如:c:/… d:/… /…
相对路径 - 主要指以当前工作目录开始的路径信息,如:./
- . 表示当前目录 … 表示当前目录的上一级目录
- 在以后的开发中尽量使用相对路径
注意注意:知识扩充:
/反斜杠可以提高代码的可用性,而不用\\,Java中两个反斜杠\\才代表反斜杠,一个代表转移字符
在这里插入图片描述

package FileTest;

import java.io.FileFilter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.File;

public class FilePractiseTest {
    public static void main(String[] args) throws IOException {
        // 1.构造File类型的对象描述c:/a.txt文件
        File f1=new File("E:/a.txt");
        // 2.判断文件是否存在,若存在则获取相关信息并打印出来
        if (f1.exists()) {
            System.out.println("文件名称:" + f1.getName());
            System.out.println("文件大小:" + f1.length());
            Date d1 = new Date(f1.lastModified());
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            System.out.println("文件最后一次修改时间:" + sdf.format(d1));
            System.out.println("绝对路径信息:" + f1.getAbsolutePath());
            System.out.println(f1.delete() ? "文件已经删除" : "文件没有删除成功");
        }else {
            System.out.println(f1.createNewFile()?"创建文件成功":"文件未创建成功");
        }
        System.out.println("---------------------");
        // 3.构造对象描述目录的路径信息并实现创建和删除操作
        File f2 =new File("E:/敲代码使我快乐/我快乐我男朋友就快乐/我男朋友快乐我们都快乐");
        // 判断是否存在,若存在则删除目录,若不存在则创建目录
        if (f2.exists()){
            System.out.println(f2.delete()?"删除目录成功":"未删除目录");
        }else {
            System.out.println(f2.mkdirs()?"创建目录成功":"创建目录失败");
        }
        System.out.println("-----------------------");
        // 4.构造对象来描述指定的目录
        File f3=new File("E:\\\\luffy\\\\ftp");
        // 获取该目录中的所有内容
        //File[] fArr = f3.listFiles();
        // 获取该目录中的所有内容,但需要按照指定的规则进行过滤
        // 准备一个过滤器接口的引用作为方法的实参
//        匿名内部类
        FileFilter ff=new FileFilter() {
            @Override
            public boolean accept(File pathname) {
                return pathname.getName().endsWith("txt");
            }
        };
        File[] fArr=f3.listFiles(ff);
        // 若是普通文件则直接打印文件的名称,若是目录文件则使用[]将名称括起来

        for (File tf: fArr){
            if (tf.isFile()){
                System.out.println(tf.getName());
            }
            if (tf.isDirectory()){
                System.out.println("["+tf.getName()+"]");
            }
        }

        }
    }


3.IO流

3.1 基本概念
I/O就是Input/Output的简写,也就是输入输出的含义。
I/O流就是像流水一样不间断地进行输入输出(读写)的状态

3.2 基本分类
按照数据读写的基本单位不同分为: 字节流字符流
其中字节流主要指以字节(一个字节)为单位进行读写的流,可以处理任意类型的文件
其中字符流主要指以字符(2个字节)为单位进行读写的流,只能处理文本文件

按照数据流动的方向不同分为:输入流 (读操作) 和 输出流(写操作)(站在程序的角度)。
其中输入流主要指从文件中读取数据内容输入到程序中,也就是读文件;
其中输出流主要指将程序中的数据内容输出到文件中,也就是写文件;
节点流和包装流:
节点流:直接跟文件关联
包装流:需要依赖其他流跟文件进行关联
在这里插入图片描述
在这里插入图片描述

3.3 FileOutputStream类(重中之重)
(1)基本概念
java.io.FileOutputStream类主要用于将图像数据之类的原始字节流写入输出流中

(2)常用的方法
在这里插入图片描述

作业:
1.重点掌握FileOutputStream类及其代码。
2.自定义成员方法实现参数指定目录所有内容的打印,要求子目录中的内容也要打印
方法格式如下:
public static void printDir(File f){
}

作业代码连接:https://shimo.im/docs/yxrT3QHkWc3pRYTK

搞定!!!
今天就先到这吧,回宿舍啦啦啦啦
少一些对周边的仰视,多平视一下自身,去发现自己的长处,然后据此脚踏实地,稳步前行。
今天的你比昨天有潜力,明天的你比今天有创新。在自我进步中寻求提升。

以上是关于JavaSE-异常机制File类IO流的主要内容,如果未能解决你的问题,请参考以下文章

JavaSE知识-19(异常&IO(File类))

JavaSE复习File类与IO流

javaSE I/O流—— File类

javaSE I/O流—— File类

Java全栈JavaSE:25.File类和IO流

JavaSE-IO操作