IO流
用来处理设备之间的数据传输,上传文件和下载文件
输入输出流,用于设备之间的数据传输
File表示的是IO流将来要操作的文件。
异常
异常就是java程序在运行过程中出现的错误。
Throwable 问题
Erro 错误,属于严重性问题
Exception 异常,属于一般性问题 可分为运行期异常和编译期异常。
运行期异常:RuntimeException及其子类 运行期异常我们自己可以解决,也可不不解决(ArithmeticException 除数为0的异常),对于运行期异常,我们自己没有处理就交由JVM去处理,JVM的默认处理方式是打印详细的异常信息,然后退出虚拟机。如果我们觉得JVM机的处理不够好,可以自己去捕获这个异常,自己来处理。
异常处理的两种方式
try…catch…finally
throws
try...catch处理异常的基本格式
try {
可能出现问题的代码 ;
}catch(异常名 变量名){
针对问题的处理 ;
}finally{
释放资源;
}
变形格式:
try {
可能出现问题的代码 ;
}catch(异常名 变量名){
针对问题的处理 ;
}
注意事项:
- try中的代码越少越好
- catch中要做处理,哪怕是一条输出语句也可以,不能空处理,也不能将异常信息隐藏。
try…catch的方式处理多个异常
try {
可能出现问题的代码 ;
}catch(异常名1 变量名1){
对异常的处理方式 ;
}catch (异常名2 变量名2){
对异常的处理方式 ;
}....
注意事项:
- 能明确变量类型的尽量明确,不要用大的来处理
- 捕获多个异常的时候,大的异常放前面,平级的前后无所谓。
针对多个异常的处理
针对多个catch的变形格式
try {
可能出现问题的代码 ;
}catch(异常名1 | 异常名2 | .... 变量名){
对异常的处理方案 ;
}
好处:简化了代码
弊端:对多个异常的处理方式是一致的
instance of 判断其左边对象是否是其右边类的实例。返回布尔类型的值。
注意事项:
- 多个异常之间的只能是平级关系,不能出现子父类的继承关系。
- 处理方式是一致的
编译期异常和运行期异常的区别
所有的RuntimeException类及其子类的实例被称为运行时异常,其他的异常就是编译时异常。
编译时异常:JAVA程序必须显示处理,否则程序就会发生错误,无法通过编译。
运行时异常:无需显示处理,也可以和编译时异常一样处理。
Throwable的几个常见方法
getMessage(): 获取异常信息,返回字符串。
toString(): 获取异常类名和异常信息,返回字符串。
printStackTrace(): 获取异常类名和异常信息,以及异常出现在程序中的位置。返回值void。
throws的方式处理异常
定义功能方法时,需要把出现的问题暴露出来让调用者去处理,那么就通过throws在方法上标识。
throw用在方法的内部进行异常的抛出。抛出的异常一定是发生了得到异常
throws用在方法的后面进行抛出异常 ,抛出可能性异常。
throw的概述
在功能方法内部出现某种情况,程序不能继续运行,需要进行跳转时就用throw把异常对象抛出。
throws和throw的区别
throws
用在方法声明后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,由该方法的调用者来处理
throws表示出现异常的一种可能性,并不一定会发生这些异常
throw
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
这个异常对象可以是编译期异常对象,可以是运行期异常对象
表示抛出异常,由方法体内的语句处理
throw则是抛出了异常,执行throw则一定抛出了某种异常
finally关键字
作用:finally里面做一些善后收尾工作。比如说释放资源,遇到异常 这个里面的代码也可以执行,前提是jvm没有退出。
被finally控制的语句体一定会执行,前提是jvm没有停止
final,finally和finalize的区别
final:是一个状态修饰符,可以用来修饰类,变量,成员方法。
- 被修饰的类不能被子类继承,修饰的变量其实是一个常量不能被再次赋值。
- 修饰的方法不能被子类重写。
finally:用try…catch…语句中,作用:释放资源,特点:始终被执行(JVM没有退出的情况之下)
finalize:Object类中的一个方法,用来回收垃圾。
如果catch语句中有return语句,finally语句会执行,不过是在return语句之前执行。
package com.itheima.demo17;
import java.util.InputMismatchException;
import java.util.Scanner;
public class Test2 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
System.out.println("请输入一个整数");
int i = sc.nextInt();
System.out.println(i);
}catch (InputMismatchException e){
e.printStackTrace();
return;
}finally {
System.out.println("这里的代码执行了");
}
}
}
//请输入一个整数
//as
//这里的代码执行了
//java.util.InputMismatchException
// at java.util.Scanner.throwFor(Scanner.java:864)
// at java.util.Scanner.next(Scanner.java:1485)
// at java.util.Scanner.nextInt(Scanner.java:2117)
// at java.util.Scanner.nextInt(Scanner.java:2076)
// at com.itheima.demo17.Test2.main(Test2.java:14)
package com.itheima.demo17;
import java.util.Scanner;
//判断一个数是不是素数,素数:在大于1的自然数中,除了1和它本身之外,不再含有其他因数
public class Test3 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个自然数");
int n = sc.nextInt();
for(int i=2;i<=n;i++){
if(n%i==0){
System.out.println("不是素数");
}else{
System.out.println("是素数");
}
break;
}
}
}
package com.itheima.demo17;
//判断100到200之间的素数:思路:用一个数分别区除2到sqrt()这个数,如果能整除,则白表明此数不是素数,反之就是素数。
public class Test4 {
public static void main(String[] args) {
int count = 0;
for (int i = 101; i < 200; i += 2) {
boolean flag = true;
for (int j = 2; j <= Math.sqrt(i); j++) {
if (i % j == 0) {
flag = false;
break;
}
}
if (flag == true) {
count++;
System.out.println(i);
}
}
System.out.println(count);
}
}
自定义异常
在以后的开发过程中。我们可能会遇到各种问题,然而JDK不可能针对每一种问题给出具体的异常类,我们需要自己定义一些异常类。
//从银行取钱,发现钱不够,给出提示。
package com.itheima.demo17;
import java.util.Scanner;
public class Test5 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入您的取款金额");
double num = sc.nextDouble();
qukuan(num);
}
private static void qukuan(double num) {
double money=100;
if(num<=money){
System.out.println("取款成功");
}else{
throw new NoMoneyException("余额不足异常");
}
}
}
package com.itheima.demo17;
public class NoMoneyException extends RuntimeException {
public NoMoneyException(String 余额不足异常) {
}
}
//请输入您的取款金额
//200
//\Exception in thread "main" com.itheima.demo17.NoMoneyException
// at com.itheima.demo17.Test5.qukuan(Test5.java:21)
// at com.itheima.demo17.Test5.main(Test5.java:11)
异常的注意事项
- 子类重写父类方法时,子类的方法必须抛出相同的异常或父类异常的子类,或者子类不抛出异常也可以。
- 如果谷类抛出了多个异常,子类重写父类时,只能抛出相同的异常,或者他的子集,子类不能抛出父类没有的异常,或者子类不抛出异常也是可以的。
- 如果被重写的方法没有异常抛出,那么子类的方法绝对不可以抛出异常,如果子类方法内有异常发生,那么子类只能try,不能throws。
也就是父类没有抛出异常,子类在重写父类方法时,不能抛出异常,如果父类抛出了异常。那么子类抛出和父类一样的异常,或者比父类小的异常。子类不能抛出父类没有抛出过的异常。
如何使用异常处理
原则:如果该功能内部可以将问题处理,用try,如果处理不了,交由调用者处理,这是用throws
区别:
后续程序需要继续运行就try
后续程序不需要继续运行就throws
如果JDK没有提供对应的异常,需要自定义异常。
File类
概述:文件和目录路径名的抽象表现形式,这个类可以用来表示文件,也可以用来表示目录。
File类的构造方法
1. File file = new File("E:\\20151020\\day02\\day02总结.java") ;//根据一个路径得到File对象。
2. File file2 = new File("E:\\20151020\\day02" , "day02总结.java") ;//根据一个目录和一个子文件/目录得到File对象
3. File file3 = new File("E:\\20151020\\day02") ;
File file4 = new File(file3 , "day02总结.java") ;//根据一个父File对象和一个子文件/目录得到File对象
创建功能
public boolean createNewFile():创建一个新的文件 如果存在这样的文件,就不创建了
public boolean mkdir():创建文件夹 如果存在这样的文件夹,就不创建了 注意这个方法只能创建单层目录 如果创建多层目录得一层一层创建
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来 可以创建多层目录 当然也可以创建单层目录
绝对路径:包含盘符号的一个详细路径
相对路径:不含有盘符号的路径。
如果创建文件或者文件夹忘记写盘符路径,默认在项目路径下面。
删除功能
public boolean delete();删除文件或者文件夹
删除文件夹时,这个文件夹是空文件夹,如果这个文件夹里面有文件,则不能删除。java总删除不走回收站,要删除注意该文件夹内不能包含文件或者文件夹。
package com.itheima.demo17;
import java.io.File;
import java.io.IOException;
public class Test6 {
public static void main(String[] args) throws IOException {
File file = new File("C:\\Users\\Administrator\\Desktop", "px.txt");
boolean b = file.createNewFile();
System.out.println(b);
boolean b1 = file.delete();
System.out.println(b1);
}
}
//false
true
//删除多级目录
package com.itheima.demo17;
import java.io.File;
public class Test7 {
public static void main(String[] args) {
File file = new File("C:\\Users\\Administrator\\Desktop\\px");
boolean b = delete(file);
System.out.println(b);
}
private static boolean delete(File file) {
if(file.exists()&&file.isDirectory()){
String[] list = file.list();
for (String s : list) {
File file1 = new File(file, s);
delete(file1);
}
}
return file.delete();
}
}
File类的重命名功能
-
public boolean renameTo(File dest):把文件重命名为指定的文件路径 注意事项: 1.如果原来的文件和传入的这个文件是同一个路径,则就是改名 2.如果原来的文件和传入的这个文件不是同一路径,就会发生剪切,把源文件剪切到传入的这个文件路径下面。
判断功能:
public boolean isDirectory(): 判断是否是目录
public boolean isFile(): 判断是否是文件
public boolean exists(): 判断是否存在
public boolean canRead(): 判断是否可读
public boolean canWrite(): 判断是否可写
public boolean isHidden(): 判断是否隐藏
public boolean isAbsolute(); 判断是否使用的是绝对路径
获取功能:
public String getAbsolutePath(): 获取文件的绝对路径,返回的是字符串形式
public String getPath(): 获取相对路径
public String getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。返回的是字符串形式。
public File getParentFile() 返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。 返回的是file类型
public long getTotalSpace() 返回此抽象路径名指定的分区大小。 返回总容量 单位字节,获取磁盘的总空间大小,单位是字节。
public long getFreeSpace() 返回此抽象路径名指定的分区中未分配的字节数。返回剩余容量 单位字节。,获取磁盘的剩余空间,
public String getName(): 获取文件名
public long length(): 获取文件的大小,单位是字节
public long lastModified(): 获取最后一次的修改时间,毫秒值
public String[] list(): 获取指定目录下的所有文件或者文件夹的名称数组
public File[] listFiles(): 获取指定目录下的所有文件或者文件夹的File数组
package com.itheima.demo17;
import java.io.File;
public class Test8 {
public static void main(String[] args) {
File file = new File("D:\\");
long totalSpace = file.getTotalSpace();
System.out.println(totalSpace);
long freeSpace = file.getFreeSpace();
System.out.println(freeSpace/1024/1024/1024.0+"GB");
}
}
package com.itheima.demo17;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test9 {
public static void main(String[] args) {
File file = new File("C:\\Users\\Administrator\\Desktop\\课后");
long l = file.lastModified();
Date date = new Date(l);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy:MM:dd");
String format = dateFormat.format(date);
System.out.println(format);
}
}
输出指定目录下指定后缀名文件名
判断E盘目录下是否有后缀名为.png的文件,如果有,就输出该文件名称
分析:
a: 把E:\\demo这个路径封装成一个File对象
b: 获取该路径下所有的文件或者文件夹对应的File数组
c: 遍历这个数组,进行判断
package com.itheima.demo17;
import java.io.File;
public class Test10 {
public static void main(String[] args) {
File file = new File("E:\\图片");
String[] list = file.list();
for (String s : list) {
File file1 = new File(file, s);
if(file1.isFile()&&file1.getName().endsWith(".png")){
System.out.println(s);
}
}
}
}
//中心主题.png
文件名称过滤器
概述:
public String[] list(FilenameFilter filter)
public File[] listFiles(FilenameFilter filter)
判断E盘目录下是否有后缀名为.jpg的文件,如果有,就输出该文件名称
分析:
把E:\\demo这个路径封装成一个File对象
获取所有的以.png结尾的文件数组 (相当于过滤)
遍历数组
package com.itheima.demo17;
import java.io.File;
import java.io.FileFilter;
public class Test11 {
public static void main(String[] args) {
File file = new File("E:\\图片");
File[] files = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
boolean b = pathname.isFile() && pathname.getName().endsWith("png");
return b;
}
});
for (File file1 : files) {
System.out.println(file1.getName());
}
}
}