一、IO流的概述
IO流用来处理设备之间的数据传输
二、异常
- 异常的概述:异常就是Java程序在运行过程中出现的错误
- 异常的分类:错误、运行期异常、编译期异常
- 异常的继承体系
Throwable异常或错误的父类
Error错误 严重性问题 不予处理,解决不了
Exception异常 一般性问题,可以解决
RuntimeException运行期异常 可以解决,也可以不解决
非RuntimeException编译期异常,必须解决
1.运行期异常
- 交由JVM解决
运行期异常,发生在程序运行期间,可以解决也可以不解决(如果不解决,交由JVM解决)
int a=1;
int b=0;
System.out.println(a/b);
//ArithmeticException 当出现异常的运算条件时,抛出此异常。例如,一个整数除以0时,抛出此异常
我们没有处理这个异常,就默认交由JVM去处理
那么JVM的处理方式是,在控制台打印出该异常的异常信息,然后退出JVM,后面的程序也就不执行了
- 我们自己捕获异常来处理
如果我们觉得JVM这种处理方式不够友好,那么我们可以手动来处理
我们可以尝试捕获这个异常来处理
int a=10;
int b=0;
try{
System.out.println(a/b); //这行代码有可能会出现异常
}catch(ArithmeticException e){
//一旦遇到这个异常,怎么去处理
System.out.println("除数为0了");
}
int a=1;
int b=0;
int[] arr={1,2};
arr=null;
try{
System.out.println(a/b);
System.out.println(arr.length);
}catch(ArithmeticException e){
System.out.println("除数为0了");
}catch(NullPointerException e){
System.out.println("空指针异常");
}catch(Exception e){
System.out.println("未知异常");
}
try里面一般放置有可能会出现问题的代码
catch(某种异常)一旦出现这种异常,catch就会捕获这种异常
一旦try中出现这种异常,那么相应的catch就会执行
捕获异常的注意事项:
1.能明确的异常,尽量明确
2.多个异常类,如果是平级关系,在前在后没关系
3.多个异常类,存在继承关系,父类异常要放在后面
//JDK1.7新加的针对多个异常捕获异常的语法
String str=null;
try{
System.out.println(1/0);
System.out.println(str.length());
}catch(NullPointerException|ArithmeticException e){
if(e instanceof NullPointerException){
System.out.println("空指针异常");
}else if(e instanceof ArithmeticException){
System.out.println("除数为0异常");
}
}
//catch里面不能做空处理,即使写最简单的一条输出语句,提醒一下都行,不要做空处理
try{
System.out.println(1/0);
}catch(ArithmeticException e){
e.printStackTrace();//打印异常的堆栈信息
String message = e.getMessage();//获取异常信息
System.out.println(e.toString());//获取异常信息
}catch(Exception e){
e.printStackTrace();
}
2.编译期异常
- 编译期异常:发生在编译期间,非 RuntimeException及其子类,编译期异常必须处理
编译期异常,有两种处理方式,采用
1.将异常抛给调用者,谁调用谁处理,俗称甩锅。throws关键字在方法上抛出,抛给调用者,由调用者去处理
2.自己捕获处理try{}catch(){}
//方式一:抛出异常给调用者
public class Test1 {
public static void main(String[] args) throws ParseException {
parseDateStr();
}
private static void parseDateStr() throws ParseException {
String str="2019-07-20";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date parse = simpleDateFormat.parse(str);
System.out.println(parse);
}
}
//方式二:自己捕获异常try{}catch(){}
public class Test1 {
public static void main(String[] args) {
parseDateStr();
}
private static void parseDateStr(){
String str="2019-07-20";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
try{
Date parse = simpleDateFormat.parse(str);
System.out.println(parse);
}catch(ParseException e){
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//一般在main方法里面,就不要再抛出了,自己捕获处理
Scanner scanner=null;
try{
String str="2019-07-20";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
simpleDateFormat.parse(str);
scanner=new Scanner(System.in);
int i = scanner.nextInt();
}catch(Exception e){
e.printStackTrace();
}finally{
//finally最终的,不管你try里面有没有遇到异常,它里面的代码都会执行
//我们一般会在这里做些善后工作,比如释放资源
System.out.println("finally里面的代码必须执行");
scanner.close();
}
}
- final,finally和finalize的区别
final 修饰类 不能被继承,修饰变量 变为常量,修饰方法 方法不能被重写
finally用在异常处理语句中,里面的代码一定会被执行
finalize() Object finalize()当垃圾回收器确定不存在对该对象的更多引用时,由对象的垃圾回收器调用此方法 - throw的概述以及和throws的区别
throw的概述: 在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
public class Test1 {
public static void main(String[] args) {
mathMethod();
}
private static void mathMethod(){
Scanner scanner = new Scanner(System.in);
System.out.println("请输入第一个数");
int a = scanner.nextInt();
System.out.println("请输入第二个数");
int b = scanner.nextInt();
if(b>0){
System.out.println(a/b);
}else if(b==0){
//throw在方法内部,抛出一个异常对象
throw new ArithmeticException("除数为0");
}
}
}
throws和throw的区别
a:throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
b:throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
这个异常对象可以是编译期异常对象,可以是运行期异常对象
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
3.自定义异常
当Java提供给我们的这些异常类,无法描绘我们所遇到的异常时,那么可以自定义异常
1.成绩不合法异常
public class MyTest1 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的成绩0-100");
int score = scanner.nextInt();
if(score>=0&&score<=100){
System.out.println(score);
}else{
throw new ScoreException("成绩不合法");
}
}
}
public class ScoreException extends RuntimeException {
public ScoreException(String msg) {
super(msg);
}
}
2.余额不足异常
public static void main(String[] args) {
int num=1000;
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你的取款金额");
int money = scanner.nextInt();
if(money<=num){
System.out.println("取款成功");
System.out.println("你的余额还剩"+(num-money)+"元");
}else{
throw new noMoneyException("余额不足");
}
}
public class noMoneyException extends RuntimeException{
public noMoneyException(String s) {
super(s);
}
}
4.异常的注意事项
1.子类在重写父类方法时,父类没有抛出异常,子类不能抛出异常
2.子类不能抛出父类没有抛出过的异常
3.子类方法上,抛出的异常不能比父类大,只能比父类小,或跟父类一样
三、File文件类
File是文件或目录(文件夹)的抽象表现形式,我们可以使用File来封装一个文件或文件夹
- File类的构造方法
File(String pathname); 通过将给定路径名字符串转换成抽象路径名来创建一个新的File实例
File(String parent,String child) 根据parent路径名字符串和child路径字符串来创建一个新的File实例
File(File parent,String child); 根据parent的抽象路径名和child的路径名字字符串创建一个新的File实例
//封装了一个文件
File file = new File("E:\\测试图片\\新建文本文档.txt");
File file1 = new File("E:\\测试图片", "新建文本文档.txt");
File file2 = new File("E:\\测试图片");
File file3 = new File(file2, "新建文本文档.txt");
//封装了一个目录
File file4 = new File("E:\\测试图片");
- File类的创建功能
//创建功能
绝对路径:带有盘符号的详细路径
相对路径:不带盘符号的路径 Java的这个项目,它的相对路径就是这个项目的跟路径下
./当前路径 ../当前的上一级路径 ../../当前路径的上两级路径
File file1 = new File("E:\\a.txt");
file1.createNewFile();
File file2 = new File("e.txt");
file2.createNewFile();
//创建一个文件,返回值表示,该文件是否创建成功
//重复创建该文件,返回false;第一次创建返回true
File file = new File("a.txt");
boolean b = file.createNewFile();
//创建一个目录
//第一次创建成功返回true,重复创建返回false
File file1 = new File("E:\\test");
boolean mkdir = file1.mkdir();//创建一个单级目录
File file2 = new File("E:\\demo\\hehe\\haha");
boolean mkdirs = file2.mkdirs();//创建多级目录
- File类的删除功能
//delete();删除文件或目录,注意不走回收站
File file = new File("a.txt");
boolean b = file.delete();//返回值表示,文件是否删除成功
System.out.println(b);
//delete();删除目录,只能删除空目录
File file1 = new File("E:\\test");
boolean b1 = file.delete();
System.out.println(b1);
//删除非空目录,可以采用递归删除
- File类的重命名功能
//renameTo();当你的源文件,和你传入的文件,在同一个目录下那么就是重命名
File file = new File("a.txt");
File file1 = new File("b.txt");
boolean b = file.renameTo(file1);//返回值表示是否重命名成功
//renameTo();当你的源文件和传入文件的路径不一致时,那么就是剪切
File file2 = new File("e.txt");
File file3 = new File("E:\\e.txt");
boolean b1 = file2.renameTo(file3);
- File类的判断功能
File file = new File("b.txt");
boolean b1 = file.isFile();//判断是不是一个文件
File file1 = new File("E:\\demo");
boolean b2 = file1.isDirectory();//判断是不是一个目录
boolean b3 = file.exists();//判断文件是否存在
boolean b4 = file.canRead();//判断文件是否可读
boolean b5 = file.canWrite();//判断文件是否可写
boolean b6 = file.isHidden();//判断文件是否隐藏
boolean b7 = file.canExecute();//判断是否是可执行文件
boolean b8 = file.isAbsolute();//判断这个文件,是否是绝对路径
- File类的获取功能
File file = new File("D:\\Documents\\Pictures\\aaa.txt");
String name = file.getName();//获取文件或路径的名称
long length = file.length();//获取文件的长度,字节数
String absolutePath = file.getAbsolutePath();//获取绝对路径返回的是字符串形式
File absoluteFile = file.getAbsoluteFile();//获取绝对路径返回的是File的形式
File file1 = new File("b.txt");
String path = file1.getPath();//获取相对路径
String parent = file.getParent();//获取该文件的父路径,返回的是字符串表现形式
File parentFile = file.getParentFile();//获取该文件的父路径,返回的是File表现形式
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");
File file = new File("D:\\Documents\\Pictures\\aaa.txt");
//获取文件的最后一次修改时间
long time = file.lastModified();
//将毫秒值转换成年月日时分秒
Date date = new Date(time);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String format = simpleDateFormat.format(date);
System.out.println(format);
//获取该路径下所有文件或文件夹的名称
File file = new File("E:\\测试图片");
String[] list = file.list();
for (String s : list) {
System.out.println(s);
}
//获取该目录下,所有文件或文件夹的File形式数组
File file = new File("E:\\测试图片");
File[] files = file.listFiles();
for (File file1 : files) {
System.out.println(file1);
}
四、案例演示
- 需求:判断E\测试图片 目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
//方法一
File file = new File("E:\\测试图片");
File[] files = file.listFiles();
for (File file1 : files) {
if(file1.isFile()&&file1.getName().endsWith(".jpg")){
System.out.println(file1.getName());
}
}
//方式二
File file = new File("E:\\测试图片");
File[] files = file.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File file1 = new File(dir, name);
if(file1.isFile()&&file1.getName().endsWith(".jpg")){
return true;
}else{
return false;
}
}
});
for (File file1 : files) {
System.out.println(file1.getName());
}
//方式三
File file = new File("E:\\测试图片");
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if(pathname.isFile()&&pathname.getName().endsWith(".jpg")){
return true;
}else{
return false;
}
}
});
for (File file1 : files) {
System.out.println(file1.getName());
}
- 删除多级目录
public static void main(String[] args) {
File file = new File("E:\\测试图片");
deleteFolder(file);
}
public static void deleteFolder(File file){
File[] files = file.listFiles();
for (File f : files) {
if(f.isFile()){
f.delete();
}else{
deleteFolder(f);
}
}
file.delete();
}
- 判断E盘目录下是否有后缀名为.jpg的文件,如果有,把他的后缀名改成.png
public static void main(String[] args) {
File file = new File("E:\\测试图片");
updateFile(file);
}
public static void updateFile(File file){
File[] files = file.listFiles();
for (File f : files) {
if(f.isFile()){
String parent = f.getParent();
String name = f.getName();
if(name.endsWith(".jpg")){
name=name.replace(".jpg",".png");
}
File newFile = new File(parent, name);
f.renameTo(newFile);
}else{
updateFile(f);
}
}
}