IO
一、前言
1、将数据永久保存到硬盘上
二、IO流的使用步骤
1、声明文件源
2、声明流关联源
3、使用流
4、关闭流
三、字节流
InputStream所有字节输入流的父类FileInputStream
1、读取方法
a、int read() 每次读一个字节
b、int read(byte[] bs)将读取的内容放到字节数组中,返回读取的个数
OutputStream所有字节输出流的父类FileOutputStream
1、写入方法
a、write(int b);将一个字节写入文件
b、write(byte[] bs);将一个字节数组写入文件,如果有中文,会自动进行组合(gbk是一个汉字两个字节, utf-8是一个汉字三个字节)
四、字符流
1、Reader FileReader
int read(); 读取一个字符
将文件内容读到字符数组中
2、Writer FileWriter
FileWriter(file);默认覆盖写
FileWriter(file,true)第二个参数为true,则是追加写
五、例子
1、文件拷贝
2、模拟员工入职和获得所有员工
员工入职
获得所有员工
六、流的分类
1、方向
输入流输出流
2、操作单位
字节流字符流
3、是否文件源关联节点流 FileInputStream处理流 BufferedReader
七、处理流
1、缓冲流
BufferedReader
每次可以读一行
BufferedWriter
生成新行员工入职
获得所有员工
2、转换流
InputStreamReader
InputStreamReader(InputStream in,String charsetName); 字节流对象和字符集名称(gbk|utf-8|...)
// // // // // // // | FileInputStream input = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(input, "utf-8"); char[] bs = new char[(int) file.length()]; reader.read(bs); input.close(); String str = new String(bs); System.out.println(str); | |
} | FileInputStream input = new FileInputStream(file); InputStreamReader reader = new InputStreamReader(input, "utf-8"); BufferedReader br = new BufferedReader(reader); System.out.println(br.readLine()); br.close(); | |
} |
八、对象流
1、ObjectOutputStream
Emp类型需要实现序列化接口
2、ObjectInputStream
九、改写项目
1、修改实体类
确保可以序列化(对象写入文件)和反序列化(从文件中读出对象)
2、编写工具类
负责将list写入文件和将list从文件中读取
3、编写新版本DAO实现类增删改都要先获得所有员工的集合增删改的操作是对集合的操作
最终需要将修改后的集合写入文件,才完成数据的更新操作。
4、修改界面类
十、File类
1、常用方法
2、递归
3、递归的应用
if() {
System.out.println(file2.getAbsolutePath());
}
}
}
public static void showDirByNameLike(File file,String like) { File[] files = file.listFiles();
for (File file2 : files) { if(file2.isDirectory()) {
showDirBySuffix(file2, like);
}
String name = file2.getName();
/*
- String
- endsWith();
- name.contains(like);判断name中是否包含like
- xyzabcuabcvw "abc"
- name.indexOf(like);找出like在name中第一次出现的位置(索引)
- name.lastIndexOf(like);找出like在name中最后一次出现的位置(索引)
*/
if(name.lastIndexOf(like)!=-1) { System.out.println(file2.getAbsolutePath());
}
}
}
public static void showDirBySuffix(File file,String suffix) { File[] files = file.listFiles();
for (File file2 : files) { if(file2.isDirectory()) {
showDirBySuffix(file2, suffix);
}
String name = file2.getName(); if(name.endsWith(suffix)) {
System.out.println(file2.getAbsolutePath());
}
}
}
public static void showDir(File file) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm"); File[] files = file.listFiles();
for (File file2 : files) {
Date date = new Date(file2.lastModified()); String format = sdf.format(date); System.out.println(file2.getName()+
(file2.getName().length()==10?"\t":"\t\t")+format+"\t"+(file2.isFile()?"文件":"文件
夹")+"\t"+(file2.length()/1024==0?"1kb":file2.length()/1024+"kb"));
if(file2.isDirectory()) { showDir(file2);
}
}
}
}
异常
一、前言:
1、为什么要有异常处理一旦出现异常,程序就终止了2、解决方案:
就是进行异常处理
二、异常
1、概念
代码在执行,出现了问题,程序就终止了
2、常见的异常
a、输入不匹配异常
InputMismatchException
上面代码输入非数字,出现异常,22222就不输出了,原因是程序终止在异常出现的位置
b、算术异常
ArithmeticException
c、数组索引越界异常
d、空指针异常
对象是null
没有在堆开辟空间(属性和方法都没有),无法访问
e、字符串索引越界异常
f、日期转换异常
三、异常处理
1、try
将可能出现异常的整体代码包含在try块中,如果这块代码出现异常,try块中剩下的代码就不再执行了。
2、catch
将try块出现的异常进行捕获处理(输出异常信息)。可以有
任意个:每种异常分别处理
1个:Exception,统一处理
注意:异常的详细信息还需要打印出来,供程序员分析出现异常的原因
e.printStackTrace();打印异常栈
子类异常的catch块要在父类异常catch块的前面
可以将任意异常统一处理
3、finally
在项目中有些代码是必须执行的,没有finally块,无法确保代码一定能执行到。
功能:不管有没有异常,有没有返回,finally块的代码是一定会执行,一般资源关闭的代码。
4、try、catch、finally有三种组合
5、throw主动抛出(自首)
抛出的异常返回给调用save方法的地方,如果这个代码被try所包含,会运行catch进行处理。
6、throws向上抛出
在方法中主动抛出一个编译时异常,当前方法不想处理,向上抛出给调用处进行处理。实现类中方法抛出的异常应小于等于父类该方法抛出的异常
四、异常的层级
Throwable
Error 错误 不处理
Exception 异常
五、异常的分类
1、编译时异常
继承Exception,不是RuntimeException,就是编译时异常。
编写时,该方法向上抛出异常,方法上要声明throws。调用该方法的地方会编译报错,强制(提醒)我要进行处理
提醒用户对这里进行异常处理
(要么继续向上抛出,
谁调用谁处理,如果是main方法向上抛出,jvm进行处理,打印异常栈并终止程序
要么trycatch)
2、运行时异常
RuntimeException
在编写时不会报错,没有强制必须处理
六、自定义异常
1、步骤
a、新建异常类继承一个异常类
b、生成有参构造方法,可以存入异常的信息
c、将传入的异常信息通过父类的构造方法super(String message),将信息存入detailMessage属性。
d、可以在需要处理时候进行单独捕获,可以通过getMessage()获得异常的信息
字符串
一、不可变字符串
1、String
底层:
是一个常量的字符数组,一旦初始化数组,所对应的数组不能修改
方法:
二、可变字符串
1、StringBuilder
insert(int offset,Object object); replace(int start,int end,String str); append(Object obj);
2、StringBuffer
StringBuilderstrB=newStringBuilder("abc"); | ||
strB.append("aaa"); | ||
strB.replace(1,3,"xx"); | ||
strB.insert(1,"ABC"); | ||
System.out.println(strB); | ||
// | Stringstr=""; | |
// | StringBuilderstrB=newStringBuilder(); | |
// | longl=System.currentTimeMillis(); | |
// | for(inti=1;i<100000;i++){ | |
// | strB.append(i); | |
// | } | |
// | longl2=System.currentTimeMillis(); | |
// | System.out.println(l2-l); | |
// | StringBufferstrB=newStringBuffer(); | |
// | strB.append(b); | |
// | strB.insert(offset,b) | |
// | strB.replace(start,end,str); | |
} | } |
3、区别
String和StringBuilder:
String为不可变字符串,StringBuilder是可变字符串频繁的拼接操作使用StringBuilder效率更高。StringBuilder和StringBuffer: StringbuIlder:线程不安全,并发效率高StringBuffer:线程安全,并发效率低