标准的异常处理
jdk1.6及以前
-
- 让流尽量能关闭, 所以将关流的代码放到finally中
-
- 变量作用域的问题 -> 把流的声明, 写在try的外面, try里面做赋值
-
- 局部变量没有默认值, 使用前必须赋值 -> 定义流时, 给初始值为null
-
- close方法也有编译时异常 -> 分开进行try-catch
-
- 在关闭流之前, 做非空判断 -> inn => enter
-
- 为了保证流尽量能关一个就关一个 -> 关流的时候, 加上finally
jdk1.7后
-
- 把创建流的代码, 放到小括号中
-
- 把读写的代码, 放到大括号中
-
- 把关流的代码, 删掉
-
多个了流关闭
- 实例代码
- 实例代码
属性集:Properties
概念:java.util.Properties
继承于Hashtable
,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其对应值都是一个字符串。该类也被许多Java类使用,比如获取系统属性时,System.getProperties
方法就是返回一个Properties
对象。
构造方法:public Properties() :创建一个空的属性列表。
Properties作为双列集合的使用
- setProperty(String key, String value):保存一对属性
- getProperty(String key):使用此属性列表中指定的键搜索属性值。
- public Set stringPropertyNames() :所有键的名称的集合。
Properties作为配置文件的使用((操作的配置文件一般以.properties结尾))
- load(InputStream):从字节输入流中读取键值对。
- load(Reader)
- store(输出流, String 注释)
缓冲流
概述
- 缓冲流, 相当于给FileInputStream/FileOutputStream … 进行了包装, 让他们拥有了更强大的功能.
- 缓冲(缓冲区) : 数组
- 缓冲流的内部, 自带数组.
- 使用数组的方式缓冲流是最快的
字节流
- BufferedInputStream:缓冲字节输入流, 带缓冲区的字节输入流, 高效字节输入流
- BufferedOutputStream 高效字节输入流
自带长度为8192的字节数
字符流
-
BufferedReader
- readLine00():读取一行文本, 读取到换行符, 代表一行结束, 读取到的内容是不包含换行符
-
BufferedWriter
- newLine():写出跨平台的换行符
转换流(字符流)
概述:
计算机中储存的信息都是用二进制数表示的,而我们在屏幕上看到的数字、英文、标点符号、汉字等字符是二进制数转换之后的结果。按照某种规则,将字符存储到计算机中,称为编码 。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为解码 。比如说,按照A规则存储,同样按照A规则解析,那么就能显示正确的文本f符号。反之,按照A规则存储,再按照B规则解析,就会导致乱码现象。
字符编码于字符集
-
字符编码
Character Encoding
: 就是一套自然语言的字符与二进制数之间的对应规则 -
字符集
Charset
:也叫编码表。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等。-
拓展:
-
ASCII字符集
-
GBxxx字符集
-
Unicode字符集
-
-
InputStreamReader
- 字节流通向字符流的桥梁
- 通过指定的字符集, 将字节转换成字符
- 方法:
InputStreamReader(InputStream in, String charsetName)`: 创建一个指定字符集的字符流。
OutputStreamWriter
- 字符流通向字节流的桥梁
- 通过指定的字符集, 将字符转换成字节
- 方法:
OutputStreamWriter(OutputStream in, String charsetName)`: 创建一个指定字符集的字符流。
通过转换流读取GBK的文件, 写出到UTF-8中, 或者反过来
序列化
序列化, 对象输出流(将内存中的对象, 写到硬盘 -> 输出流)
- ObjectOutputStream(OutputStream out):创建一个指定OutputStream的ObjectOutputStream。
- writeObject(Object obj):将指定的对象写出。
反序列化, 对象输入流(反序列化: 将硬盘中的对象, 读取到内存 -> 输入流)
- ObjectInputStream(InputStream in):创建一个指定InputStream的ObjectInputStream。
- readObject():读取一个对象。
注意事项:
-
- 先输出, 再输入。否则会出现 StreamCorruptedException: invalid stream header:
原因: 没有序列化, 就直接反序列化序列化之后对文件进行修改
- 先输出, 再输入。否则会出现 StreamCorruptedException: invalid stream header:
-
- 被序列化的对象, 对应的类必须实现Serializable接口
- 被序列化的对象, 对应的类必须实现Serializable接口
-
- 序列化反序列化的过程中, 不能改变序列化的类(保证class文件相同),h会抛出抛出一个
InvalidClassException
异常
- 序列化反序列化的过程中, 不能改变序列化的类(保证class文件相同),h会抛出抛出一个
打印流
PrintStream
-
System.out
- 标准的输出流, 默认指向控制台
InputStream
-
System.in
- 标准的输入流, 默认指向控制台
Commons-IO
导包
IOUtils
- copy(输入流, 输出流)
FileUtils
- copyFileToDirectory(File src, File dest):把文件复制到指定文件夹中
- copyDirectoryToDirectory(File src, File dest):把文件夹复制到指定文件夹中
装饰设计模式
解决的问题
- 在不改变原有类的基础上, 对对象的功能进行增强
public interface Man {
void eat();
void sleep();
void fight();
}
public class NormalMan implements Man {
@Override
public void eat() {
System.out.println("一天吃3顿饭");
}
@Override
public void sleep() {
System.out.println("一天睡7小时");
}
@Override
public void fight() {
System.out.println("战五渣...");
}
}
public class IronMan implements Man {
// 将被装饰类作为装饰类中的成员变量
private NormalMan normalMan;
// 通过构造方法赋值
public IronMan(NormalMan normalMan) {
this.normalMan = normalMan;
}
@Override
public void eat() {
// 不需要增强的方法, 直接调用
normalMan.eat();
}
@Override
public void sleep() {
normalMan.sleep();
}
@Override
public void fight() {
System.out.println("战五渣进化--- 战秒全!!!");
}
}
public class Demo01 {
public static void main(String[] args) {
// BufferedInputStream bis = new BufferedInputStream(new FileInputStream())
IronMan ironMan = new IronMan(new NormalMan());
ironMan.eat();
ironMan.sleep();
ironMan.fight();
}
}