JavaSE——IO流(一)异常,File文件类

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());
        }
    }
}
发布了58 篇原创文章 · 获赞 13 · 访问量 1878

猜你喜欢

转载自blog.csdn.net/weixin_44324174/article/details/104317947