学习IO流的两个需要知道的知识点
I/O流
输入输出流,用来处理设备之间的数据传输。
文件是数据局的载体。在传输文件的过程中,会出现各种各样的异常。所以我们要学会处理问题。
异常
Java中的异常:Throwable问题(父类):
-
Error错误:严重性问题,我们处理不了。
-
Exception异常(一般性问题,我们可以处理):
-
运行期异常:发生在运行期间,可以解决,也可以不解决。
-
运行期异常是JVM在处理,JVM默认处理方法是:打印异常的信息,然后停掉虚拟机,往后的代码不执行。
-
显然默认处理方法不是很完美,所以我们可以自己来处理运行期异常:使用关键字try和catch(试图捕获),使得往后的程序得到运行。
-
try的{}中放的是有可能出现异常的代码;不会出现异常的代码尽量不要放进去。
-
catch的{}中放的是try中的代码一旦出现异常的时候执行的代码。catch的()中放的是异常类名,就是需要捕获的异常类型。
1.7之后()中可以用|隔开多个异常,不过不建议这样写,因为这种方法遇到不同的异常的处理结果和方法都是一样的,分不开来。
-
在捕获异常的同事能明确的就不要用顶层父类Exception在catch的()中标注。
-
如果有捕获多个异常,那么多个异常之间存在异常关系,父类异常放在最后,并列关系的异常,先后顺序无所谓。
-
不要做空处理,所有的异常都要处理。一般情况简单的处理方法是打印异常的堆栈信息。
-
常见的写法还可以看到finally{},不论有没有异常finally中的都会执行;一般我们会采用在finally的{}中放一些收尾功能,比如清理内存。finally可以不加。
-
-
编译期异常:发生在编译期间,必须处理,不解决就无法编译和运行。
-
编译期异常第一种处理方法是:throw:把错误抛给调用者,俗称甩锅。一般情况下在main方法下就不在甩锅,用捕获处理。
-
捕获处理:try{}catch(){}。
-
throws:不同于throw抛出的异常一定发生了,throws抛出的方法不一定发生,并且throws用在方法的声明上。throw抛出的是一个异常对象,throws抛出的是一个异常类名,可以抛出多个,而且可以抛出编译期异常和运行。
-
-
注意事项:
1.子类在重写父类的方法时,父类方法没有抛出异常,那么子类就不能抛出异常,有异常只能捕获。2.父类方法有抛出异常,那么子类可以抛出和父类一样或比父类异常小的异常。
3.子类不能抛出父类没有抛出的异常。
-
全选有错的一行Ctrl+Alt+t自动生成捕获异常
Java中提供的异常不够我们用,所以我们可以建立一个异常继承Java的expection来完成我们需要的自定义异常
文件
电脑上的数据都是以文件的形式来体现的,IO流传输的数据就是传文件,所以Java提供了一个film类用来描述文件和文件目录路径。
-
封装文件或目录使用:new film();
-
路径:用/隔开
-
绝对路径:从盘符号开始写的,有详细的路径。
-
相对路径:不带盘符号的路径。(发给别人时候用相对路径比较合适,收到的人可以不用改路径。一般用次路径找文件)
./:当前路径某个文件
…/:上级路径某个文件
-
可以写一个父路径再写一个子路径防止子路径 变更。
-
父路径可以用一个文件名代替。
-
-
创建目录:对象名.mkdir返回值是目录是否创建成功,创建成功返回true,重复常见返回false。只能创建单级目录。
创建多级目录:对象名.mkdirs创建多级目录,返回值和mkdir相同。
-
创建文件:对象名.createNewFilm
-
删除:调delete方法(删除空目录和文件)
先封装,再调用删除,重复删除返回false。 -
递归删除
public class ZuoYe { public static void main(String[] args) { //删除多级目录 File f = new File("E:\\photo");//包装路径:File可以包装路径或文件 for (File ff : f.listFiles()) { if (ff.isFile()){ ff.delete(); }else if (ff.isDirectory()){ diguiShanchu(ff.getAbsolutePath(),ff); } } boolean delete = f.delete(); System.out.println(delete); } //用递归的方法进行删除,创建递归方法 private static void diguiShanchu(String absolutePath,File f) { for (File ff : f.listFiles()) { if (ff.isFile()){ ff.delete(); }else if (ff.isDirectory()){ diguiShanchu(ff.getAbsolutePath(),ff); } } boolean delete = f.delete(); System.out.println(delete); } }
-
改名字:(还有剪切功能).renameTo。(当改名的文件和传过去的文件在同一目录下,就是改名字;如果不在同一目录下就是剪切重命名。)
-
判断文件或目录是否存在:封装的文件或目录的名称.exists
-
判断封装的东西是不是文件夹isfilm
-
判断封装的是不是文件isdirectory
-
判断文件是刻度还是可写:canread和canwrite还有ishidden