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流的主要内容,如果未能解决你的问题,请参考以下文章