1.File:是文件和目录路径名的抽象表示。
2.绝对路径:带盘符的路径。
相对路径:相对某个文件或文件夹来说的路径。
当要描述的文件或目录与参照的文件或目录不在同一个目录下,相对路径==绝对路径。
当要描述的文件或目录与参照的文件或目录在同一个盘符下,相对路径!=绝对路径。
3.File类的常用方法
eg:public static void main(String[] args) {
//获得文件对象
//File f1=new File("d:\\a.txt");
File f1=new File("d:"+File.separator+"a.txt");
System.out.println("绝对路径:"+f1.getAbsolutePath());
System.out.println("相对路径:"+f1.getPath());
System.out.println("文件名:"+f1.getName());
System.out.println("文件是否可写:"+f1.canWrite());
System.out.println("文件是否可读:"+f1.canRead());
System.out.println("文件是否为隐藏文件:"+f1.isHidden());
System.out.println("文件的长度:"+f1.length());
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("文件的最后修改时间:"+sdf.format(f1.lastModified()));
//给file对象重命名
f1.renameTo(new File("D:\\sx.txt"));
System.out.println("重命名成功");
//删除文件
File f2=new File("D:\\sx.txt");
f2.delete();
System.out.println("文件删除成功");
//删除目录,只有空目录才可以直接删除
File f3=new File("D:\\bb");
f3.delete();
System.out.println("目录删除成功");
}
4.过滤器:把想要的数据留下,把不想要的数据过滤掉。
eg:/**
* 过滤器类
* @author sx
* @version 1.0 2019年7月4日
*/
public class MyFileFilter4 implements FileFilter{
/**
* 过滤方法
*/
@Override
public boolean accept(File pathname) {
//将以.txt结尾的文件留下,其他的过滤掉
if (pathname.getName().endsWith(".txt")) {
return true;
}else {
return false;
}
}
}
public static void main(String[] args) throws IOException {
//获得文件对象
File f1=new File("aa");
//判断当前的目录是否存在
if (f1.exists()) {
//获得当前目录下的所有子目录和子文件,将过滤器对象作为方法的参数
File[] fs=f1.listFiles(new MyFileFilter4());
for (File f2 : fs) {
System.out.println(f2.getPath());
}
} else {
System.out.println("当前的目录不存在");
}
}
5.递归:方法自身调用自身。
5.1:将原问题拆分为若干个子问题,子问题的解决方法与原问题一样。
5.2:原问题的解决依赖于所有子问题的解决。
5.3:递归要有出口。
eg:/**
- 需求3:输出指定目录下的所有文件信息,比如打印当前项目根目录下的所有文件信息(只考虑当前目录,不考虑子目录)
需求改进:
-
要求只输出文件后缀名为txt的文件
-
根据API的过滤器来完成该功能
-
需求继续跟进,列出当前目录及子目录中符合该条件的文件信息(递归)
-
递归:方法里面调用方法自身
* @author sx * @version 1.0 2019年7月4日 */ public class FileTest5 { public static void main(String[] args) throws IOException { //获得文件对象 File f1=new File("aa"); //调用方法 digun(f1); } /** * 获得当前目录下所有符合要求的文件 方法 */ public static void digun(File f) { //判断当前的目录是否存在 if (f.exists()) { //获得当前目录下的所有子文件或子目录 File[] fs=f.listFiles(); //遍历所有子文件或子目录 for (File f2 : fs) { //如果当前的对象是文件还是目录 if (f2.isFile()) {//文件 //判断当前文件是否是以.txt结尾 if (f2.getName().endsWith(".txt")) { System.out.println(f2.getPath()); } } else {//目录 digun(f2); } } } else { System.out.println("当前的目录不存在"); } }
}
6.异常:是程序在运行期发生的不正常的事件,它会打断指令的正常执行流程。
7.异常的分类
7.1:异常的总根类:throwable
7.1.1:错误(Error):JVM系统内部错误或资源耗尽等严重情况-属于JVM需要负担的 责任这一类异常事件无法恢复或不可能捕获,将导致应用程序中断。
7.1.2:异常(Exception):由于程序设计不合理或者偶然的外界因素导致的异常。
7.1.2.1:检查异常(非运行时异常):由于偶然的外界因素而导致的异常。
特征:检查异常是在代码写完就报一条红线。eg:IOException
7.1.2.2:运行时异常(非检查异常):由于程序设计不合理导致的异常.
eg:NullPointException,ArrayIndexOutOfBoundsException,ArithmeticException
8.异常处理机制:Java语言使用异常处理机制为程序提供了异常处理的能力。
8.1:捕获异常:适用于任何出异常的场景。
8.1.1:捕获异常的语法:
try{
可能会出异常的代码;
}catch(异常类型1|异常类型3 变量名1){
出现异常类型1时的解决的代码;
}catch(异常类型2 变量名2){
出现异常类型2时的解决的代码;
}finally{
关闭对象释放资源的代码;(一定会执行除非System.exit()不执行)
}
8.1.2:语法特点:
8.1.2.1:try-catch结构中try块有且仅有一个;
8.1.2.2:try-catch结构中catch块有0个到多个;catch块至少执行0个,至 多执行1个;如果有多个catch块,小异常写在前面,大异常写在后 面;一个catch块中可以写多个异常类型,它们之间用|分隔;
8.1.2.3:try-catch结构中,finally可以有0个到多个;
finally中代码一定会执行,除非遇到System.exit().
finally的优先级高于return.
eg:public static void main(String[] args) {
try {
System.out.println("开始执行程序");
int num=8/0;
System.out.println("结束执行程序");
//System.exit(0);
//return;
}catch (ArithmeticException|NullPointerException e) {
//打印异常信息
e.printStackTrace();
}catch (Exception e) {
System.out.println("2出异常了");
}finally {
System.out.println("这是finally块");
}
}
public static void main(String[] args) {
//声明一个变量作标记
boolean flag=false;
do {
Scanner input=new Scanner(System.in);
//重置标记
flag=false;
try {
System.out.println("请输入一个整数:");
int num=input.nextInt();
System.out.println("输入的数为:"+num);
} catch (InputMismatchException e) {
System.out.println("你的输入有误,请重新输入");
//出异常改变标记
flag=true;
}catch (Exception e) {
e.printStackTrace();
}
}while(flag==true);
}
8.2:抛出异常类型:适用于当前的异常自己解决不了,就抛出给调用者。eg:检查异常。
作用:提醒调用者这个方法可能会出异常。
8.2.1:抛出异常的语法:
public 返回值类型 方法名(形参列表) throws 异常类型1,异常类型2{
方法体;
}
eg:public static void main(String[] args) throws IOException {
//获得文件对象
File f1=new File("d:\\bb\\cc\\aa\\b.txt");
//获得当前文件的父目录
File parentFile=f1.getParentFile();
//判断父目录是否存在,如果不存在,就创建父目录
if (parentFile.exists()==false) {
parentFile.mkdir();//只能创建一级目录
parentFile.mkdirs();//创建多级目录
}
//判断文件是否存在,如果不存在,就创建文件
if (f1.exists()==false) {
f1.createNewFile();
System.out.println("文件创建成功");
}else {
System.out.println("文件已存在");
}
}
8.3: 抛出异常对象:适用于由于用户不合理操作而导致的异常。
8.3.1:语法:在方法中用 throw 异常对象;
8.3.2:抛出异常对象一般和throws或者try-catch结构一起用,不能单独使用。
eg:public static void main(String[] args) throws Exception {
Scanner input=new Scanner(System.in);
try {
System.out.println("请输入一个整数:");
int num=input.nextInt();
System.out.println("输入的数为:"+num);
} catch (Exception e) {
//抛出异常对象
throw new Exception("你的输入有误");
}
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
try {
System.out.println("请输入一个整数:");
int num=input.nextInt();
System.out.println("输入的数为:"+num);
} catch (Exception e) {
//抛出异常对象
try {
throw new Exception("你的输入有误");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
9.自定义异常:适用于当系统的异常类型无法满足需要,就可以自定义异常。
eg:/**
* 自定义异常类,继承Exception
* @author sx
* @version 1.0 2019年7月4日
*/
public class MyInputException extends Exception{
/**
* 自定义异常类的构造方法
* @param message
*/
public MyInputException(String message) {
super(message);
}
}
public static void main(String[] args) {
Scanner input=new Scanner(System.in);
try {
System.out.println("请输入一个整数:");
int num=input.nextInt();
System.out.println("输入的数为:"+num);
} catch (Exception e) {
//抛出自定义的异常对象
try {
throw new MyInputException("333333333你的输入有误");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}