Java-IO流、异常、File类
文章目录
- 一、IO流
- 1. IO流概述
- 二、异常
- 1. 异常的概述
- 2. 异常的两种处理方式
- 3. 编译期异常与运行期异常的区别
- 4. Throwable的几个常见方法
- 5. 使用throws的方式处理异常
- 6. throw概述及throw与throws区别
- 7. final、finally、finalize的区别
- 8. 自定义异常
- 三、File类
- 1. File类概述
- 2. File类方法
- 3. 文件过滤器
- 4. 练习
一、IO流
1. IO流概述
- 什么是IO流
- IO流可以用来处理设备之间的数据传输,代表了数据的无结构化传递
- 上传文件和下载文件
二、异常
1. 异常的概述
- 什么是异常
- 异常就是Java程序在运行中出现的错误
- 异常的分类
- 编译期异常,RuntimeException
- 必须处理,否则程序会报红,无法运行
- 运行期异常,非RuntimeException
- 可以不处理,程序能运行,但不处理一旦遇到异常就会抛错误,结束程序
- 编译期异常,RuntimeException
- 异常的继承体系
2. 异常的两种处理方式
-
抛出去
- 将异常抛给调用者处理
- 调用者如果没有相应的处理方式,就将这个异常一直抛上去,直到抛给JVM处理
- 当JVM遇到异常时,会将异常的信息和出现位置打印在控制台上,同时结束程序
-
使用try-catch语句进行捕获处理
- 语法
try{可能会出现异常的代码; }catch(可能出现的异常名 变量名){处理异常的代码; }catch(可能出现的异常名 变量名){处理异常的代码; }... finally{不管能不能遇到异常都会执行的代码;一般用来做收尾工作,比如释放资源等;可写可不写; }
- 注意
- try中的语句执行会耗费大量时间,所以尽量要少
- catch语句中要有具体的处理,不能空语句将异常信息隐藏
- 可以有多条catch语句,捕获多种异常
- 多条catch语句
- 能具体的异常尽量具体,尽量不要使用大的异常如囊括
- 如果多个异常有继承关系,子类在前,父类在后
3. 编译期异常与运行期异常的区别
- 编译期异常
- Exception异常类下,所有非RuntimeException类及其子类的异常类
- 在编译期间出现,程序报红,不处理无法运行
- 运行期异常
- Exception异常类下,RuntimeException类及其所有子类
- 在运行期间不报错,程序可以运行
- 不处理如果遇到异常会打印异常信息,并退出程序
4. Throwable的几个常见方法
- getMessage()
- 得到异常信息的字符串形式
- toString()
- 得到异常类名与异常信息的字符串形式
- printStackTrace()
- 得到异常类名与异常信息,以及异常在程序中出现的位置
5. 使用throws的方式处理异常
-
在方法的声明上注明可能会出现的异常
-
语法
public void show)()throws 异常类1,异常类2,异常类3...{方法体; }
-
将方法可能出现的异常标注起来,可以是多个,让调用者去处理
6. throw概述及throw与throws区别
-
throw概述
-
用来处理在方法内部可能出现的异常
-
语法
throw new 异常类("要输出的信息");
-
-
throw与throws的区别
- throw
- 用在方法体内,使用的是类的对象
- 一次只能抛出一个异常
- 异常可以是编译期异常,也可以是运行期异常
- 抛出异常并进行处理
- 执行了throw语句一定是抛出了该种异常
- throws
- 用在方法声明上,使用的是类
- 后面可以跟多种异常
- 抛出的异常由调用者处理,只负责抛出异常
- 只是表示异常出现的可能性,不一定会出现
- throw
7. final、finally、finalize的区别
- final
- 是一个状态修饰符,可以修饰类、变量、方法
- 被修饰的类不能被继承
- 被修饰的方法不能被重写
- 被修饰的变量是常量
- finally
- 用在try-catch语句中
- 不管异常是否抛出一定会被执行,除非程序提前退出
- 用来做收尾工作,比如释放资源等
- finalize
- Object类的一个方法
- 用来回收垃圾
8. 自定义异常
-
为什么要自定义异常
- 在实际开发中我们会遇到各种各样的异常,Java提供的已知异常并不能完全满足我们的需求,有时候要定义自己的异常
-
如何定义自定义异常
- 让我们自己的异常类继承Java中已有的异常类
- 比如Exception、RuntimeException等
-
自定义异常示例
- 代码
public class AbnormalResultValue extends RuntimeException {//自定义异常类,当成绩不在0-100之间时抛出public AbnormalResultValue() {System.out.println("百分比成绩,应该在0-100之间");} } public class ScoreAbnormal {//测试类,输入输出学生成绩public static void main(String[] args) {System.out.println("请输入你的成绩");Scanner input = new Scanner(System.in);int score = input.nextInt();if (score >= 0 && score <= 100) {System.out.println("你的成绩是:" + score);} else {//不在0-100之间抛出自定义异常类throw new AbnormalResultValue();}} }
-
自定义异常注意事项
- 子类重写父类的方法时,只能选择抛出父类方法已有的异常或已有异常的子类异常
- 子类继承自父类,在设计子类时,子类只能抛出父类已有的异常及已有异常的子类
- 如果父类或父类方法没有异常抛出,子类及重写方法不允许抛出异常,可以使用try-catch语句处理
-
异常的使用与选择
- 如果如果方法或功能内部能够处理异常,就自己处理;如果自己处理不了,就抛给调用者
- 后续程序如果还要运行,就try-catch语句自己处理;后续程序不需要执行,就throws抛出去
三、File类
1. File类概述
-
概述
- File类的作用
- 是文件及目录路径(文件夹)的抽象表示形式
- 可以对指定路径的文件或文件夹进行操作
- File类的作用
-
构造方法
- File(String pathname)
- 通过一个全路径得到一个文件对象
- File(String parent,String child)
- 通过父路径与子文件名得到一个文件对象
- File(File parent,String child)
- 根据父路径的文件对象与文件名得到一个文件对象
- File(String pathname)
-
构造方法示例
public class Demo {//实例类,创建文件对象public static void main(String[] args) {String pathName = "F:\\MyDemo\\File";//全路径String parent = "F:\\MyDemo";//父路径String child = "File";//文件名File midFile = new File(parent);//父路径文件对象File file1 = new File(pathName);//使用全路径创建文件对象File file2 = new File(parent, child);//使用父路径与文件名创建对象File file3 = new File(midFile, child);//使用父路径的文件对象与文件名创建文件对象} }
2. File类方法
-
创建功能
- public boolean createNewFile()
- 在指定的目录处创建新文件,已有则不再创建
- 创建成功返回true,已有创建失败返回false
- public boolean mkdir()
- 在指定的目录处创建一个单层文件夹,返回值指创建成功与否
- public boolean mkdirs
- 在指定的目录处创建一个多级文件夹,返回值指创建成功与否
- 如果创建文件时没有写路径,则默认在当前项目路径下
- public boolean createNewFile()
-
删除功能
- public boolean delete()
- 删除文件或单层文件夹
- 注意
- 不能删除多层文件夹,且File类的delete方法不走回收站
- public boolean delete()
-
重命名功能
- public boolean renameTo(File dest)
- 将文件名更改为指定的文件的文件名
- 如果两个文件在同一路径下,则是给调用者改名
- 如果是不同的路径下,则是将指定文件剪切至原文件处
- public boolean renameTo(File dest)
-
判断功能
- public boolean isDirectory()
- 判断是否为文件夹
- public boolean isFile()
- 判断是否为文件
- public boolean exists()
- 判断是否存在
- public boolean canRead()
- 判断是否可读
- public boolean canWrite()
- 判断是否可写
- public boolean isHidden()
- 判断是否隐藏
- public boolean isDirectory()
-
获取功能
- public String getAbsolutePath()
- 获得绝对路径的字符串形式
- public String getPath()
- 获得相对路径的字符串形式
- public String getParent()
- 获得父路径的字符串形式
- public File getParentFile()
- 获得父路径的文件形式
- public long getTotalSpace()
- 得到文件所在分区的总空间,单位是字节
- public long getFreeSpace()
- 得到问价所在分区的剩余空间,单位是字节
- public String getName()
- 获得文件名称
- public long length()
- 得到文件的大小,单位是字节
- public long lastModified()
- 得到文件的最后一次修改时间,单位是毫秒,是距离1970年1月1日的毫秒值
- public String[] list()
- 获得文件夹下所有文件的字符串表示
- public File[] listFiles()
- 获得文件夹下所有的文件的文件表示
- public String getAbsolutePath()
-
举例
- 删除一个多级文件夹
- 代码
public class Deletes {//删除一个多级文件夹下的所有文件public static void main(String[] args) {String userAbsolutePath = "C:\\Users\\Administrator\\Desktop\\新建文件夹";//要删除文件的绝对路径File file = new File(userAbsolutePath);//创建文件对象deletes(file);//调用方法删除文件或文件夹}private static void deletes(File file) {//用来删除传入的文件夹File[] files = file.listFiles();//得到文件夹下所有文件的文件形式for (File file1 : files) {//遍历文件夹下所有的文件if (!file1.delete()) {//直接删,文件就删掉了,不能删的文件夹调用此方法再遍历删除内部文件,一直递归deletes(file1);}}file.delete();//如果是文件夹里面有多个元素,删除完了子元素之后将自己的文件夹再删掉} }
3. 文件过滤器
-
作用
- 将调用者内的文件经过制定规则进行筛选,将满足规则的子文件进行输出
-
两种返回形式
- public String[] list(FilenameFilter filter)
- 经过文件过滤器过滤,将得到的文件名以字符串数组形式返回
- public File[] listFiles(FilenameFilter filter)
- 经过文件过滤器过滤,将得到的文件名以文件数组的形式返回
- public String[] list(FilenameFilter filter)
-
文件过滤器参数的输入
- 使用匿名内部类,在匿名内部类内重写accept方法,实现具体的筛选逻辑
-
举例
- 采用文件过滤器方式,输出指定目录下以指定后缀名(如.jpg)结尾的文件
- 代码
public class DetermineSuffix {//采用文件过滤器方式,输出指定目录下以指定后缀名(如.jpg)结尾的文件的文件名public static void main(String[] args) {String suffix = ".jpg";//指定后缀名String directory = "C:\\Users\\Administrator\\Desktop\\img - 副本";//全指定路径File file = new File(directory);//创建文件对象File[] listFiles = file.listFiles(new FilenameFilter() {//获得文件中满足过滤器条件的子元素@Overridepublic boolean accept(File dir, String name) {if (name.endsWith(suffix)) {//当文件以指定的后缀名结尾时,添加进数组return true;}return false;}});for (File listFile : listFiles) {//打印过滤后的文件中的元素System.out.println(listFile.getAbsolutePath());}} }
4. 练习
-
修改指定目录下,所有文件的后缀名
- 代码
public class ChangeName {//修改指定目录下 所有文件的名称public static void main(String[] args) {String directory = "C:\\Users\\北风\\Administrator\\img - 副本";String oldString = ".png";//原后缀名String newString = ".jpg";//新后缀名File file = new File(directory);//创建指定路径的文件对象changeName(file, newString, oldString);//调用方法更改子文件名}/*** @param file:要改名的文件对象* @param newString:新字符串* @param oldString:原字符串* @Description:此方法可以将指定文件夹中的文件名更改*/private static void changeName(File file, String newString, String oldString) {File[] files = file.listFiles();//得到文件数组的子元素for (File subFile : files) {//遍历文件数组if (subFile.isDirectory()) {//如果是文件夹,继续调用该方法changeName(subFile, newString, oldString);} else {//如果是文件File parentFile = subFile.getParentFile();//获得父路径文件对象String fileName = subFile.getName().replace(oldString, newString);//获得更改过后的文件名File newFile = new File(parentFile, fileName);//根据父路径与更改过后的文件名创建新对象subFile.renameTo(newFile);//为原文件重命名 }}}} }
发布评论