IO异常的处理
JDK7前处理
示例代码:
public class FileCopy02 {
public static void main(String[] args){
// 声明字节输入和输出流对象
FileInputStream fis = null;
FileOutputStream fos = null;
try{
// 创建字节输入流对象关联源文件
fis = new FileInputStream("a.txt");
// 创建字节输出流对象关联目标文件
fos = new FileOutputStream("d.txt");
// 定义一个字节数组:用来存储读取到的字节数
byte[] buf = new byte[1024];
// 定义一个整型变量用来记录实际读取的字节个数
int len = ‐1;
// 循环读取数据
while((len = fis.read(buf)) != ‐1){
// 利用fos将字节数组中的内容输出到目标文件中
fos.write(buf,0,len);
}
} catch (Exception e) {
} finally {
try {
// 关闭流:先开后关
if(fis != null) fis.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
// 关闭流:先开后关
if (fos != null) fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
JDK7的处理
- JDK7优化后的 try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。
格式:
try (创建流对象语句,如果多个,使用';'隔开) {
// 读写数据
} catch (IOException e) {
e.printStackTrace();
}
示例代码:
public class FileCopy01 {
public static void main(String[] args){
try( // 创建字节输入流对象关联源文件
FileInputStream fis = new FileInputStream("a.txt");
// 创建字节输出流对象关联目标文件
FileOutputStream fos = new FileOutputStream("d.txt")
){
// 定义一个字节数组:用来存储读取到的字节数
byte[] buf = new byte[1024];
// 定义一个整型变量用来记录实际读取的字节个数
int len = ‐1;
// 循环读取数据
while((len = fis.read(buf)) != ‐1){
// 利用fos将字节数组中的内容输出到目标文件中
fos.write(buf,0,len);
}
} catch (Exception e) {
}
}
}
JDK9的改进
- JDK9中 try-with-resource 的改进,对于引入对象的方式,支持的更加简洁。被引入的对象,同样可以自动关闭,无需手动close。
改进前格式:
// 被final修饰的对象
final Resource resource1 = new Resource("resource1");
// 普通对象
Resource resource2 = new Resource("resource2");
// 引入方式:创建新的变量保存
try (Resource r1 = resource1;
Resource r2 = resource2) {
// 使用对象
}
改进后格式:
// 被final修饰的对象
final Resource resource1 = new Resource("resource1");
// 普通对象
Resource resource2 = new Resource("resource2");
// 引入方式:直接引入
try (resource1;
resource2) {
// 使用对象
}
改进后,代码使用演示:
public class TryDemo {
public static void main(String[] args) throws IOException {
// 创建流对象
FileReader fr = new FileReader("in.txt");
FileWriter fw = new FileWriter("out.txt");
// 引入到try中
try (fr;fw ) {
// 定义变量
int b;
// 读取数据
while ((b = fr.read())!=‐1) {
// 写出数据
fw.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
Properties类
Properties类概述:
- 实现了Map接口,继承Hashtable,也是一个双列集合。
- 也是用来存储键值对数据,键和值默认是字符串类型,不需要指定类型了。
- 有和流技术相结合的方法。
- 可以直接将集合中的数据保存到文件中。
- 也可以直接从文件中读取数据到集合中。
属性文件要求:
- 命名要求:xxx.properties。
- 每一个键值对占据一行,格式:键=值。
- 文件中可以使用注释的,注释是以 # 开头。
Properties集合常用方法:
Object setProperty(String key, String value)
- 添加键值对。
- 如果键存在,则使用新值替换旧值,返回旧值。
- 如果键不存在,则返回null。
String getProperty(String key)
- 根据键获得值,返回键对应的值。
- 键不存在返回null。
Set<String> stringPropertyNames()
- 获得键集合。
void store(OutputStream out,String comments)
- 将集合中的数据保存到流关联的目标文件中。
- comments:说明文字,一般给null即可。
void load(InputStream in)
- 从流关联的目标文件中加载数据到集合中。