IO流的概述
1.概念
IO流是用来处理设备之间的数据传输,也就是上传文件和下载文件。
2.为什么要先讲解异常和File类?
(1)File表示的是IO流将来要操作的文件,所以必须学习File类
(2)而常见操作文件无非就是文件上传和文件下载,在这个操作过程中可能出现问题,出现问题后,我们就需要对对应的代码进行处理,所以要学习异常。
一.异常
1.概述
异常就是Java程序在运行过程中出现的错误。
2.分类
(1)error:严重问题,一般不予处理,比如内存溢出。
(2)Exception:非严重问题,可以解决的问题。
①编译时异常:非RuntimeException
②运行时异常:RuntimeException
3.JVM默认处理异常的方式
main函数收到这个问题时,有两种处理方式:
(1)自己将该问题处理,然后继续运行
(2)自己没有针对的处理方式,只能交给调用main方法的JVM来处理,JVM有一个默认的异常处理机制,就是将该异常进行处理,并将该异常的名称,异常的信息,异常出现的位置打印在了控制台上,同时将该程序停止运行。
//1/0异常
package com.westmo1.demo7;
public class MyDemo4 {
public static void main(String[] args) {
int a=1;
int b=0;
System.out.println(a/b);
}
}
//Exception in thread "main" java.lang.ArithmeticException: / by zero
at com.westmo1.demo7.MyDemo4.main(MyDemo4.java:7)
4.异常处理(try…catch…finally)
(1)基本格式
try {
可能出现问题的代码 ;
}catch(异常名 变量名){
针对问题的处理 ;
}finally{
释放资源;
}
(2)案例演示
package com.westmo1.demo7;
public class MyDemo4 {
public static void main(String[] args) {
int a=1,b=0;
int[] arr={12,12};
arr=null;
//对于try里面遇到的可能出现的异常,我们能明确的尽量明确,去捕获不要拿一个最大的异常,捕获了之,为什么?
//因为你如果用一个最大的异常捕获,那么出现异常,肯定可以捕获住,但是你不知道这是何种具体的异常。
try{
System.out.println(arr.length);
System.out.println(a/b);
}catch (ArithmeticException e){
System.out.println("除数为0了");
}catch (NullPointerException e){
System.out.println("空指针异常");
}catch (Exception e){
System.out.println("其他异常");
}
System.out.println("下面的代码");
}
}
5.编译期异常和运行期异常的区别
(1)概念
Java中的异常被分为两大类:编译时异常和运行时异常,所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常都是编译时异常。
- 编译时异常:Java程序必须显示处理,否则程序就会发生错误,无法通过编译。
- 运行时异常:无需显示处理,也可以和编译时异常一样处理。
(2)案例演示
//try...catch方式
package com.westmo1.demo8;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyDemo1 {
public static void main(String[] args) {
String str="2020-12-12";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy--mm-dd");
try {
Date parse = simpleDateFormat.parse(str);
System.out.println(parse);
} catch (ParseException e) {
System.out.print("解析异常");
}finally {//异常有无发生,都会执行finally中的代码
System.out.println("善后工作");
}
System.out.println("后面的代码");
}
}
//throws方式处理,把出现的问题暴露出来让调用者去处理
package com.westmo1.demo8;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class MyDemo1 {
public static void main(String[] args) throws ParseException {
String str = "2020-12-12";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-mm-dd");
Date parse = simpleDateFormat.parse(str);
System.out.println(parse);
}
}
6.异常的基类(Throwable的几个产常见方法)
getMessage(): 获取异常信息,返回字符串。
toString(): 获取异常类名和异常信息,返回字符串。
printStackTrace(): 获取异常类名和异常信息,以及异常出现在程序中的位置。
7.throw和throws的区别
(1)throw概述:在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时,就用throw把异常对象抛出。
(2)区别
throws:用在方法声明后面,跟的是异常类名,可以 跟多个异常类名,用逗号隔开。它表示抛出异常,将异常抛给了调用者,由调用者处理,并且throws只是表示异常的一种可能性,并不一定会发生这些异常。
throw:它是用在方法体内,跟的是异常对象名,只能是一个异常对象名,这个对象名可以是编译期异常对象也可以是运行期异常对象。它抛出的异常是由方法体内的语句处理,并且执行throw则一定抛出了某种异常。
package com.westmo1.demo8;
import java.util.Scanner;
public class MyDemo5 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("输入两个数");
int a = scanner.nextInt();
int b = scanner.nextInt();
test1(a,b);
}
private static void test1(int a, int b) {
if (b==0) {
throw new ArithmeticException("除数为0了");
}else{
System.out.println(a/b);
}
}
}
8.finally关键字以及与final,finalize的区别
(1)finally:是Java保证代码一定要执行的一种机制,我们可以使用try-catch-finally来进行处理异常的操作。处理异常时,不关异常有没有发生,finally中的代码都会执行。
(2)final:可以用来修饰方法,类,变量。修饰方法该方法不能被重写,修饰类该类不能被继承,修饰变量该变量不能被修改。
(3)finalize:是基础类Object的一个方法,是保证对象在被垃圾收集前完成特定资源回收。但是现在已经不推荐使用。
9.自定义异常
package com.westmo1.demo8;
import java.util.Scanner;
public class MyDemo6 {
public static void main(String[] args) {
//成绩不合法异常 0-100 输入别的就是异常,这个异常RuntimeException中没有
Scanner scanner = new Scanner(System.in);
System.out.println("输入成绩");
int i = scanner.nextInt();
Score(i);
}
private static void Score(int i) {
if(i>=0&&i<=100){
System.out.println("成绩合格");
}else{
throw new ScoreException("成绩不合法");
}
}
//x需要将我们写的这个类纳入到Java的异常体系中
static class ScoreException extends RuntimeException{
public ScoreException(String s) {
super(s);
}
public void ScoreException(String string){
}
}
}
二.File类
1.概述
我们在使用IO流进行数据传输时,这些数据在我们电脑上都是以文件或文件夹的形式来体现的。Java中就给我们提供了一个File类来描述文件或文件夹。
2.使用
(1)构造方法
File(String pathname):根据一个路径得到File对象
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
(2)创建功能
public boolean createNewFile():创建一个新的文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了 注意这个方法只能创建单层目录 如果创建多层目录得一层一层创建
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来 可以创建多层目录 当然也可以创建单层目录
相对路径:没有带盘符的路径 Java中相对路径,指的是Java工程的根目录
绝对路径:带有盘符的路径
(3)删除功能
public boolean delete():删除文件或者文件夹 ,如果这个文件夹中有文件,就不能删除
(4)重命名功能
public boolean renameTo(File dest):把文件重命名为指定的文件路径
(5)判断功能
public boolean isDirectory(): 判断是否是目录
public boolean isFile(): 判断是否是文件
public boolean exists(): 判断是否存在
public boolean canRead(): 判断是否可读
public boolean canWrite(): 判断是否可写
public boolean isHidden(): 判断是否隐藏
public boolean isAbsolute(); 判断是否使用的是绝对路径
(6)获取功能
public String getAbsolutePath(): 获取绝对路径
public String getPath(): 获取相对路径
public String getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。
public File getParentFile() 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。
public long getTotalSpace() 返回此抽象路径名指定的分区大小。 返回总容量 单位字节
public long getFreeSpace() 返回此抽象路径名指定的分区中未分配的字节数。返回剩余容量 单位字节
public String getName(): 获取名称
public long length(): 获取长度。字节数
public long lastModified(): 获取最后一次的修改时间,毫秒值
public String[] list(): 获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles(): 获取指定目录下的所有文件或者文件夹的File数组
3.文件名称过滤器
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
3.案例演示
(1)删除一个多级文件夹
package com.westmo1.demo10;
import java.io.File;
public class MyDemo1 {
public static void main(String[] args) {
File file = new File("F:\\123");
Delete(file);
System.out.println("删除完成");
}
private static void Delete(File file) {
File[] files = file.listFiles();//或取file目录下所有文件或文件夹的File数组
for (File file1 : files) {
if (file1.isFile()) {//判断是否是文件
file1.delete();
}else{
Delete(file1);//如果不是,递归
}
}
file.delete();
}
}
(2)判断指定目录下是否有后缀名为.jpg的文件,有就输出文件名称。
①:File类实现
package com.westmo1.demo10;
import java.io.File;
public class MyDemo2 {
public static void main(String[] args) {
File file = new File("E:\\123");
Show(file);
}
private static void Show(File file) {
File[] files = file.listFiles();
for (File file1 : files) {
if (file1.isFile()){
if(file1.getName().endsWith(".jpg")) {
System.out.println(file1.getName());
}
}else{
Show(file1);
}
}
}
}
②文件过滤器实现
package com.westmo1.demo10;
import java.io.File;
import java.io.FilenameFilter;
public class MyDemo3 {
public static void main(String[] args) {
File file = new File("E:\\123");
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());
}
}
}