Fork me on GitHub

十八.File类、枚举、异常

一.File类的基本用法

java.io.File类:代表文件和目录。 在开发中,读取文件、生成文件、删除文件、修改文件的属性时经常会用到本类。

1.File类的常见构造方法:public File(String pathname)

以pathname为路径创建File对象,如果pathname是相对路径,则默认的当前路径在系统属性user.dir中存储

文件的创建

1
2
3
4
5
6
7
8
9
10
import java.io.File;
public class TestFile1 {
public static void main(String[] args) throws Exception {
System.out.println(System.getProperty("user.dir"));
File f = new File("a.txt"); //相对路径:默认放到user.dir目录下面
f.createNewFile();//创建文件
File f2 = new File("d:/b.txt");//绝对路径
f2.createNewFile();
}
}

user.dir就是本项目的目录

2.通过File对象可以访问文件的属性:

image

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.io.File;
import java.util.Date;
public class TestFile2 {
public static void main(String[] args) throws Exception {
File f = new File("d:/b.txt");
System.out.println("File是否存在:"+f.exists());
System.out.println("File是否是目录:"+f.isDirectory());
System.out.println("File是否是文件:"+f.isFile());
System.out.println("File最后修改时间:"+new Date(f.lastModified()));
System.out.println("File的大小:"+f.length());
System.out.println("File的文件名:"+f.getName());
System.out.println("File的目录路径:"+f.getPath());
}
}

3.通过File对象创建空文件或目录(在该对象所指的文件或目录不存在的情况下)

image

3.1 使用mkdir创建目录

1
2
3
4
5
6
7
8
9
10
11
import java.io.File;
public class TestFile3 {
public static void main(String[] args) throws Exception {
File f = new File("d:/c.txt");
f.createNewFile(); // 会在d盘下面生成c.txt文件
f.delete(); // 将该文件或目录从硬盘上删除
File f2 = new File("d:/电影/华语/大陆");
boolean flag = f2.mkdir(); //目录结构中有一个不存在,则不会创建整个目录树
System.out.println(flag);//创建失败
}
}

3.2 使用mkdirs创建目录

1
2
3
4
5
6
7
8
9
10
11
import java.io.File;
public class TestFile4 {
public static void main(String[] args) throws Exception {
File f = new File("d:/c.txt");
f.createNewFile(); // 会在d盘下面生成c.txt文件
f.delete(); // 将该文件或目录从硬盘上删除
File f2 = new File("d:/电影/华语/大陆");
boolean flag = f2.mkdirs();//目录结构中有一个不存在也没关系;创建整个目录树
System.out.println(flag);//创建成功
}
}

4.使用递归算法,以树状结构展示目录树

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.io.File;
public class TestFile6 {
public static void main(String[] args) {
File f = new File("d:/电影");
printFile(f, 0);
}
/**
* 打印文件信息
* @param file 文件名称
* @param level 层次数(实际就是:第几次递归调用)
*/
static void printFile(File file, int level) {
//输出层次数
for (int i = 0; i < level; i++) {
System.out.print("-");
}
//输出文件名
System.out.println(file.getName());
//如果file是目录,则获取子文件列表,并对每个子文件进行相同的操作
if (file.isDirectory()) {
File[] files = file.listFiles();
for (File temp : files) {
//递归调用该方法:注意等+1
printFile(temp, level + 1);
}
}
}
}

二.枚举

JDK1.5引入了枚举类型。枚举类型的定义包括枚举声明和枚举体。格式如下:

1
2
3
enum  枚举名 {
枚举体(常量列表)
}

枚举体就是放置一些常量。

1.创建枚举类型

1
2
3
enum Season {
SPRING, SUMMER, AUTUMN, WINDER
}

所有的枚举类型隐性地继承自 java.lang.Enum枚举实质上还是类!而每个被枚举的成员实质就是一个枚举类型的实例,他们默认都是public static final修饰的。可以直接通过枚举类型名使用它们。

2.枚举使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* @author RickYinPeng
* @ClassName Test_06_Enum
* @Description 测试枚举
* @date 2019/1/21/12:00
*/
public class Test_06_Enum {
public static void main(String[] args) {
System.out.println(Season.SPRING);

Season season = Season.AUTUMN;

switch (season){
case SPRING:
System.out.println("春天来了,播种的季节");
break;
case SUMMER:
System.out.println("夏天来了,游泳的季节");
break;
case AUTUMN:
System.out.println("秋天来了,收获的季节");
break;
case WINTER:
System.out.println("冬天来了,冬眠的季节");
}

}
}
enum Season{
SPRING,SUMMER,AUTUMN,WINTER
}
enum Week{
星期一,星期二,星期三,星期四,星期五,星期六,星期天
}

三.异常(Exception)的概念

异常指程序运行过程中出现的非正常现象,例如用户输入错误、除数为零、需要处理的文件不存在、数组下标越界等。

在Java的异常处理机制中,引进了很多用来描述和处理异常的类,称为异常类。异常类定义中包含了该类异常的信息和对异常进行处理的方法。

所谓异常处理,就是指程序在出现问题时依然可以正确的执行完。

1.异常的分析

1
2
3
4
5
6
public class Test2 {
public static void main(String[] args) {
int i=1/0; //除数为0
System.out.println(i);
}
}

执行结果:

1
2
Exception in thread "main" java.lang.ArithmeticException: / by zero
at yp.JavaSE.Review_06.Test_01.main(Test_01.java:11)
Java是采用面向对象的方式来处理异常的。处理过程:
1. 抛出异常:在执行一个方法时,如果发生异常,则这个方法生成代表该异常的一个对象,停止当前执行路径,并把异常对象提交给JRE。
2. 捕获异常:JRE得到该异常后,寻找相应的代码来处理该异常。JRE在方法的调用栈中查找,从生成异常的方法开始回溯,直到找到相应的异常处理代码为止。

### 2.异常分类

JDK 中定义了很多异常类,这些类对应了各种各样可能出现的异常事件,所有异常对象都是派生于Throwable类的一个实例。如果内置的异常类不能够满足需要,还可以创建自己的异常类。

Java对异常进行了分类,不同类型的异常分别用不同的Java类表示,所有异常的根类为java.lang.Throwable,Throwable下面又派生了两个子类:ErrorException。

image

注意:这个人家面试会问你Error和Exception的区别

2.1 Error

Error是程序无法处理的错误,表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。

例如,Java虚拟机运行错误(Virtual MachineError),当 JVM 不再有继续执行操作所需的内存资源时,将出现 OutOfMemoryError。这些异常发生时,Java虚拟机(JVM)一般会选择线程终止。

Error表明系统JVM已经处于不可恢复的崩溃状态中。记下来

image

2.1.1 Error与Exception的区别
  1. 我开着车走在路上,一头猪冲在路中间,我刹车。这叫一个异常。
  2. 我开着车在路上,发动机坏了,我停车,这叫错误。系统处于不可恢复的崩溃状态。发动机什么时候坏?我们普通司机能管吗?不能。发动机什么时候坏是汽车厂发动机制造商的事。

哈哈。就是这种比喻

2.2 Exception

Exception是程序本身能够处理的异常,如:空指针异常(NullPointerException)、数组下标越界异常(ArrayIndexOutOfBoundsException)、类型转换异常(ClassCastException)、算术异常(ArithmeticException)等。

Exception类是所有异常类的父类,其子类对应了各种各样可能出现的异常事件。 通常Java的异常可分为:

  1. RuntimeException 运行时异常
  2. CheckedException 已检查异常(编译期异常)
RuntimeException运行时异常

这类异常通常是由编程错误导致的,所以在编写程序时,并不要求必须使用异常处理机制来处理这类异常,经常需要通过增加“逻辑处理来避免这些异常”

CheckedException已检查异常

所有不是RuntimeException的异常,统称为Checked Exception,又被称为“已检查异常”,如IOException、SQLException等以及用户自定义的Exception异常。 这类异常在编译时就必须做出处理,否则无法通过编译。