IO流
流动的是数据。---用于传输数据的一套API---IO-> Input Output---输入输出流---当数据是从外部流向程序的时候,输入流;数据是从程序流向外部的时候,输出流。读取文件---将数据从文件读到程序中---输入流;向文件中写入数据---数据从程序流向了文件---输出流。
根据数据的传输方向:输入流、输出流
根据数据的传输形式:字节流、字符流
| 输入流 | 输出流 |
字节流 | InputStream | OutputStream |
字符流 | Reader | Writer |
这四个基本流都是抽象类。
数据的来源(目的地):硬盘,网络,输入设备,内存
向TXT文件写入一个字符串---输出流,字符流,和文件有关的流---FileWriter
FileWriter(String path)---创建一个新的文件。如果文件不存在,会创建一个新文件。
流中的异常处理
1. 将流对象放在try外定义并且赋值为null,放在try中初始化
2. 在关流之前需要判断流对象是否初始化成功
3. 需要将流强制置为null以防关流失败无法释放文件
4. 需要在写完数据之后手动添加flush操作以防关流失败产生数据丢失
读取一个TXT文件---输入流 字符流 和文件有关的流---FileReader
public class FileReaderDemo1 {
public static void main(String[] args) { FileReader reader = null; try { reader = new FileReader("E:\\a.txt"); // 读取数据--每次读取的是一个字符 // 返回值表示的是读取到的这个字符的编码 // 如果读取到了文件的末尾,返回一个-1 // int i = reader.read(); // 记录每次读取到的字符 int i = -1; while ((i = reader.read()) != -1) { System.out.println((char) i); } } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } finally { reader = null; } } } } }
缓冲流
BufferedReader---需要传入字符输入流,真正读取数据的是传入的这个字符输入流,缓冲流仅仅提供了一个缓冲区。
BufferedWriter---newLine()---写入一个换行
StringReader
读取字符串的流。
字节流
以字节形式读取数据---没有缓冲区
转换流
InputStreamReader---转换输入流---将字节流转化为字符流---底层是以字节流形式读取,但是表层是以字符流形式操作
OutputStreamWriter---转换输出流---将字符流转化为字节流---表层是以字符流形式写出,底层是以字节流形式来传输
系统流/标准流
都是字节流
System.in 标准输入流
System.out 标准输出流
System.err 标准错误流
打印流
PrintStream/PrintWriter---传入流之后向指定的位置打入数据
合并流
SequenceInputStream---只有输入流没有输出流---如果要合并多个流,需要将这些流放到一个Vector对象中,然后利用Vector产生Enumeration对象,然后利用Enumeration对象来构建一个合并流对象
序列化/反序列化流
序列化:将对象进行完整存储---持久化
反序列化:将对象还原回来
注意:
1. 如果一个对象要想被序列化,这个对象对应的类必须实现一个接口---Serializable---这个接口中没有任何的方法和属性,仅仅用来标识这个类产生的对象可以被序列化
2. 被static/transient修饰的属性不会被序列化
3. 每一个类在序列化的时候都会有一个版本号。如果没有手动指定版本号,那么在编译的时候会根据当前类中的方法和属性自动计算一个版本号。对象在反序列化的时候会比较对象中的版本号和当前类中的版本号是否一致。如果手动指定了版本号,就不再自动计算。---版本号serialVersionUID---默认用private static final long修饰
4. 集合/数组不能被序列化
盒子---锁---钥匙---产生器 (加密解密的过程)-------重要
//需要找制作钥匙的对象
在此的规则指的加密算法---对称加密,非对称加密
产生钥匙
产生锁
将锁和钥匙配对
第一个参数表示钥匙和锁的配对模式
Cipher.init(Cipher.ENCRYPT_MODE,kye)
找盒子
将盒子序列化出去
//创建反序列化流
反序列化盒子
关流
将对象从盒子中取出
Properties
是一个可以持久化的映射。键和值的类名默认为String,而且只能是String.---Properties对象必须存储到properties文件中。properties文件中不能存储中文,一旦输入中文,就会变成对应的编码---properties文件的默认编码格式为ISO-8859-1
JDK5的特性
静态导入
import static 包名.类名.方法名; ---只能够导入静态方法
可变参数
是指参数个数不做限定。用 ... 定义,本质上是一个数组。可变参数在使用的时候可以不传值也可以传入一个或者多个值。
枚举
适用于一些取值相对固定并且能够一一列举的场景(星期、月份、季节)。用enum来定义一个枚举类。枚举常量必须定义在首行,而且之间用 , 隔开。
不允许在类外随意创建对象
在取值相对固定且能过一一列举的情况下,建议使用枚举类
默认构造函数是私有的而且只能是私有的
每个枚举常量之间用,隔开 最后一个枚举常量之后最好加上 ; 表示结束
枚举类中允许定义一切的方法和属性。---可以定义抽象方法
所有的枚举类的顶级父类---java.lang.Enum
switch---需要一个表达式,表达式的值是byte/short/char/int, JDK1.7允许使用String,JDK1.5开始支持枚举常量
unit测试
单元测试。需要导入Junit库,在要测试的方法之上添加@Test---要求测试的方法无参无返回值非静态
Debug调试
断点调试。
F5---钻入方法中,查看方法的执行
F6---执行到下一行
F7---返回上一步
F8 ---执行到下一个断点