java基础学习_IO流01_异常、File类_day19总结

简介: java基础学习_IO流01_异常、File类_day19总结 ============================================================================= ===================================...

 java基础学习_IO流01_异常、File类_day19总结

=============================================================================
=============================================================================
涉及到的知识点有:
  1:异常(理解) (0)讲解IO流之前为什么先讲解异常和File类呢? (1)异常的概述 (2)异常的由来 (3)异常的体系 (4)异常的处理 (5)异常的面试题 (6)finally关键字的特点及其面试题 (7)自定义异常类 (8)异常的注意事项 2:File类(掌握) (1)File类的概述 (2)File类的构造方法 (3)File类的功能 (4)File类的案例 ============================================================================= ============================================================================= 1:异常(理解) (0)讲解IO流之前为什么先讲解异常和File类呢? 因为File类表示的是IO流将来要操作的文件类,所以我们需要学习File类。 而操作文件无非就是上传文件和下载文件,在这个操作的过程中可能会出现问题, 出现问题后,我们需要对对应的代码进行处理。所以我们需要先学习异常。 (1)异常的概述 异常就是Java程序在运行过程中出现的错误。 (2)异常的由来 问题也是现实生活中一个具体事务,也可以通过Java的类的形式进行描述,并封装成对象。 其实就是Java对不正常情况进行描述后的对象体现。 (3)异常的体系 Java中的异常被分为两大类:编译时异常和运行时异常。所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常。 Throwable 类是 Java 语言中所有错误或异常的超类。直接已知子类:Error, Exception。 Throwable类 |--Error类 严重错误问题,我们不处理。这种问题一般都是很严重的,我们一般处理不了,比如说内存溢出。 |--Exception类 |--RuntimeException类 运行期异常,这种问题我们也不处理,因为是你写代码的问题,而且这个问题出现肯定是我们的代码不够严谨,需要修正代码的。 |--非RuntimeException类 编译期异常,必须进行处理的,因为你不处理,编译就不能通过。 --------------------------------------- (4)异常的处理 A:JVM的默认处理 如果程序出现了问题,我们没有做任何处理,最终JVM会做出默认的处理。 把异常的名称、原因及出现的位置等信息输出在控制台。同时会结束程序。 但是呢,其余没有问题的程序就不能继续执行了。 所以感觉JVM的默认处理不够好,既然不好那我们就自己来处理呗!那么如何自己处理呢? B:自己处理 异常的处理方案 a:try...catch...finally... 自己编写处理的代码,后面没有问题的程序可以继续执行。 b:throws 把自己处理不了的异常,在方法上声明,告诉调用者,这里有问题。 --------------------------------------- (5)异常的面试题 A:编译期异常和运行期异常的区别? 编译期异常:必须要显示处理的,否则编译不通过。 运行期异常:可以显示处理,也可以显示了不处理;或者直接抛出,告诉调用者,这里有问题。 B:throwthrows的区别 throw: 在方法体中,后面跟的是异常对象名,并且只能是一个, throw抛出的是一个异常对象,说明这里肯定有一个异常产生了。 throws: 在方法声明上,后面跟的是异常类名,可以是多个,用逗号隔开, throws是声明方法有异常,是一种可能性,这个异常并不一定会产生。 --------------------------------------- (6)finally关键字的特点及其面试题 A:finally用于释放资源,它的代码永远会执行。 特殊情况:如果在执行到finally之前jvm退出了,比如System.exit(0),则就不能执行了finally控制的语句体了。 B:面试题 a:final,finally,finalize的区别? final:最终的意思,可以修饰类、成员变量、成员方法 修饰类,类不能被继承。 修饰变量,变量是常量。 修饰方法,方法不能被重写。 finally:是异常处理的一部分,用于释放资源。 一般来说,代码肯定会执行,特殊情况:如果在执行到finally之前jvm退出了,比如System.exit(0),则就不能执行了finally控制的语句体了。 finalize:是Object类的一个方法,用于垃圾回收。 b:如果catch里面有return语句,请问finally里面的代码还会执行吗? 如果会执行,请问是在return前,还是return后。 会。前。(相对于最后一个能执行到的return语句来说) 准确的说,应该是在中间。 C:try...catch...finally...的格式变形 a:try...catch...finally... b:try...catch... c:try...catch...catch... d:try...catch...catch...catch...finally... e:try...finally... 这种做法的目前是为了释放资源但是异常没有处理。 --------------------------------------- (7)自定义异常类 java不可能对所有的情况都考虑到,所以,在实际的开发中,我们可能需要自定义异常类。 而我们自己随意的写一个类,是不能作为自定义异常类来看待的,要想你的类能是一个自定义的异常类,就必须继承自Exception类或者RuntimeException类。 两种方式: A:自定义异常类继承自Exception类 需要检查编译期异常和运行期异常 B:自定义异常类继承自RuntimeException类 只需要检查运行期异常 即:自定义异常类继承自Exception类或者RuntimeException类,只需要在自定义异常类中提供无参构造和一个带参构造即可。 (8)异常的注意事项 A:子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类。(父亲坏了,儿子不能比父亲更坏) B:如果父类抛出了多个异常,子类重写父类时,只能抛出相同的异常或者是父类异常的子集,子类不能抛出父类没有的异常。 C:如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws。 ----------------------------------------------------------------------------- 2:File类(掌握) (1)File类的概述 是文件和目录(文件夹)路径名的抽象表示形式。仅仅是一个路径的表示,不代表具体的事物一定是存在的。 IO流操作中大部分都是对文件的操作,所以Java就提供了File类供我们来操作文件。(在java.io包下) (2)File类的构造方法 A:public File(String pathname) 根据一个路径得到File对象 File file = new File("e:\\demo\\a.txt"); // 把e:\\demo\\a.txt封装成一个File对象 B:public File(String parent, String child) 根据一个父目录和一个子文件/目录得到File对象 File file = new File("e:\\demo", "a.txt"); C:public File(File parent, String child) 根据一个父File对象和一个子文件/目录得到File对象 File file = new File("e:\\demo"); File file2 = new File(file, "a.txt"); 以上三种方式其实效果一样。 --------------------------------------- (3)File类的功能 A:创建功能 public boolean createNewFile() 创建文件,如果存在这样的文件,就不创建了,返回false(该方法会抛异常) public boolean mkdir() 创建文件夹,如果存在这样的文件夹,就不创建了,返回false(该方法不会抛异常) public boolean mkdirs() 创建文件夹,如果父文件夹不存在,会帮你创建出来,如果存在这样的文件,就不创建了,返回false(该方法不会抛异常) 注意: 到底要创建文件还是文件夹,调用者最清楚,所以方法不要调用错了。 B:删除功能 public boolean delete() 删除文件或文件夹(该方法不会抛异常) 注意: a:如果你创建文件或者文件夹忘了写盘符路径,则默认在Java的项目路径下。 b:Java中的删除不走回收站。 c:要删除一个文件夹,请注意该文件夹内不能包含有文件或者文件夹。 C:重命名功能 public boolean renameTo(File dest) 给文件/文件夹重命名(该方法不会抛异常) 如果路径名相同,就是改名。 如果路径名不同,就是改名并剪切到其他目录。 注意: 路径以盘符开始:绝对路径 c:\\a.txt 路径不以盘符开始:相对路径 a.txt D:判断功能 public boolean isDirectory() 判断是否是目录 public boolean isFile() 判断是否是文件 public boolean exists() 判断是否存在 public boolean canRead() 判断是否可读 public boolean canWrite() 判断是否可写 public boolean isHidden() 判断是否隐藏 E:基本获取功能 public String getAbsolutePath() 获取绝对路径 public String getPath() 获取相对路径 public String getName() 获取名称 public long length() 获取长度,单位为字节数 public long lastModified() 获取最后一次的修改时间,单位为毫秒值 F:高级获取功能 public String[] list() 获取指定目录下的所有文件或者文件夹的名称数组(返回的是字符串对象数组) public File[] listFiles() 获取指定目录下的所有文件或者文件夹的File数组(返回的是文件对象数组) 注意:获取的是指定目录下的所有文件或者文件夹,不包括文件夹下的文件和文件夹!!! G:过滤器功能(文件名称过滤器,是接口) public String[] list(FilenameFilter filter) public File[] listFiles(FilenameFilter filter) --------------------------------------- (4)File类的案例 A:判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件的名称。 思路a:先获取所有的,在遍历的时候进行判断,再输出。(即:先获取所有的文件或者文件夹的File数组,然后遍历该File数组,得到每一个File对象,依次判断,如果满足条件就输出。)
 1 package cn.itcast_08;
 2 
 3 import java.io.File;
 4 
 5 /*
 6  * 判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件的名称。
 7  * 
 8  *         思路一:先获取所有的文件或者文件夹的File数组,然后遍历该File数组,得到每一个File对象,依次判断,如果满足条件就输出。
 9  * 
10  * 分析:
11  *         A:把e盘目录封装成一个File对象
12  *         B:获取该目录下所有文件或者文件夹的File数组(返回的是文件对象数组)
13  *         C:遍历该File数组,得到每一个File对象,然后判断
14  *             是否是文件
15  *                 是:继续判断是否以.jpg结尾
16  *                     是:就输出该文件的名称
17  *                     否:不搭理它
18  *                 否:不搭理它
19  */
20 public class FileDemo {
21     public static void main(String[] args) {
22         // 把e盘目录封装成一个File对象
23         File file = new File("e:\\");
24 
25         // 获取该目录下所有文件或者文件夹的File数组(返回的是文件对象数组)
26         File[] fileArray = file.listFiles();
27 
28         // 遍历该File数组,得到每一个File对象,然后判断
29         for (File f : fileArray) {
30             // 是否是文件
31             if (f.isFile()) {
32                 // 继续判断是否以.jpg结尾
33                 if (f.getName().endsWith(".jpg")) {
34                     // 是:就输出该文件的名称
35                     System.out.println(f.getName());
36                 }
37             }
38         }
39     }
40 }
            思路b:先进行判断,再获取符合条件的,最后遍历输出即可。(即:获取的时候就已经是满足条件的了,然后输出即可。)
 1 package cn.itcast_08;
 2 
 3 import java.io.File;
 4 import java.io.FilenameFilter;
 5 
 6 /*
 7  * 判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出此文件的名称。
 8  * 
 9  *         思路二:获取的时候就已经是满足条件的了,然后输出即可。
10  * 
11  * 要想实现这个效果,就必须学习一个接口:文件名称过滤器
12  *         public String[] list(FilenameFilter filter)
13  *         public File[] listFiles(FilenameFilter filter)
14  * 
15  */
16 public class FileDemo2 {
17     public static void main(String[] args) {
18         // 把e盘目录封装成一个File对象
19         File file = new File("e:\\");
20 
21         // 获取该目录下所有文件或者文件夹的String数组
22         // public String[] list(FilenameFilter filter)
23         String[] strArray = file.list(new FilenameFilter() {
24             @Override
25             public boolean accept(File dir, String name) {
26                 // return false;
27                 // return true;
28                 // 通过这个测试,我们就知道了,把该目录下所有文件或者文件夹的名称加不加到数组中,取决于这里的返回值是true还是false。
29                 // 所以,这个true或者false应该是我们通过某种判断得到的。
30                 
31                 // System.out.println(dir + "---" + name); // dir打印的是目录,name打印的是文件或者文件夹名称
32                 // return false;
33                 
34                 // File file = new File(dir, name); // File类的第三种构造方法
35                 // System.out.println(file); // 打印出file对象名,由打印结果可知重写了toString()方法。
36                 // boolean flag = file.isFile();
37                 // boolean flag2 = name.endsWith(".jpg");
38                 // return flag && flag2;
39                 
40                 return new File(dir, name).isFile() && name.endsWith(".jpg");
41             }
42         });
43 
44         // 遍历
45         for (String s : strArray) {
46             System.out.println(s);
47         }
48     }
49 }
        B:批量修改文件名称。
 1 package cn.itcast_09;
 2 
 3 import java.io.File;
 4 
 5 /*
 6  * 需求:把E:\评书\三国演义下面的视频名称修改为
 7  *         00?_介绍.avi
 8  * 
 9  * 思路:
10  *         A:把 E:\\评书\\三国演义 封装成一个File对象
11  *         B:获取该目录下所有的文件的File数组
12  *         C:遍历该File数组,得到每一个File对象,该对象名打印输出为:E:\\评书\\三国演义\\三国演义_001_[评书网-今天很高兴,明天就IO了]_桃园三结义.avi
13  *         D:获取符合要求的各个名称
14  *         E:拼接一个新的名称,再new一个新对象,新对象名打印输出为: E:\\评书\\三国演义\\001_桃园三结义.avi
15  *         F:然后重命名即可。
16  */
17 public class FileDemo {
18     public static void main(String[] args) {
19         // 把 E:\\评书\\三国演义 封装成一个File对象
20         File srcFolder = new File("E:\\评书\\三国演义");
21 
22         // 获取该目录下所有的文件的File数组
23         File[] fileArray = srcFolder.listFiles();
24 
25         // 遍历该File数组,得到每一个File对象
26         for (File file : fileArray) {
27             // System.out.println(file); 
28             
29             // 改前:E:\评书\三国演义\三国演义_001_[评书网-今天很高兴,明天就IO了]_桃园三结义.avi
30             // 改后:E:\评书\三国演义\001_桃园三结义.avi
31             
32             String name = file.getName(); // 三国演义_001_[评书网-今天很高兴,明天就IO了]_桃园三结义.avi
33 
34             int index = name.indexOf("_"); // 找到第一个_
35             String numberString = name.substring(index + 1, index + 4); // 001    包左不包右 
36             // System.out.println(numberString); // 001
37             
38             int endIndex = name.lastIndexOf('_'); // 找到最后一个_
39             String nameString = name.substring(endIndex); // 桃园三结义.avi
40             // System.out.println(nameString); // 桃园三结义.avi
41             
42             // 拼接一个新的名称
43             String newName = numberString.concat(nameString); // 001_桃园三结义.avi
44             // System.out.println(newName); // 001_桃园三结义.avi
45 
46             // 把 E:\\评书\\三国演义\\001_桃园三结义.avi 封装成一个File对象
47             File newFile = new File(srcFolder, newName); // E:\\评书\\三国演义\\001_桃园三结义.avi
48             // System.out.println(newFile);
49             
50             // 重命名即可
51             file.renameTo(newFile);
52         }
53     }
54 }
=============================================================================

 

我的GitHub地址: https://github.com/heizemingjun
我的博客园地址: http://www.cnblogs.com/chenmingjun
我的蚂蚁笔记博客地址: http://blog.leanote.com/chenmingjun
Copyright ©2018 黑泽明军
【转载文章务必保留出处和署名,谢谢!】
相关文章
|
11月前
|
Java
在 Java 中捕获和处理自定义异常的代码示例
本文提供了一个 Java 代码示例,展示了如何捕获和处理自定义异常。通过创建自定义异常类并使用 try-catch 语句,可以更灵活地处理程序中的错误情况。
312 1
|
4月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
|
11月前
|
Java API 调度
如何避免 Java 中的 TimeoutException 异常
在Java中,`TimeoutException`通常发生在执行操作超过预设时间时。要避免此异常,可以优化代码逻辑,减少不必要的等待;合理设置超时时间,确保其足够完成正常操作;使用异步处理或线程池管理任务,提高程序响应性。
498 13
|
9月前
|
C#
【Azure Function】Function App出现System.IO.FileNotFoundException异常
Exception while executing function: xxxxxxx,The type initializer for 'xxxxxx.Storage.Adls2.StoreDataLakeGen2Reading' threw an exception. Could not load file or assembly 'Microsoft.Extensions.Configuration, Version=9.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'. The system cannot find the
193 64
|
7月前
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
7月前
|
SQL druid Java
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
|
7月前
|
SQL druid Java
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
【YashanDB知识库】YashanDB JDBC驱动查询时抛出io fail:Read timed out异常
|
7月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
8月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
479 14
|
8月前
|
缓存 Java 应用服务中间件
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
java语言后台管理若依框架-登录提示404-接口异常-系统接口404异常如何处理-登录验证码不显示prod-api/captchaImage 404 (Not Found) 如何处理-解决方案优雅草卓伊凡
1317 5