今天我们继续学习IO流之
——转换流
——刘操作的基本规律
——对象的序列化
所谓转换,就是可以对读取到的字节数据进行指定编码表的编码转换。应用的代码有
1,InputStreamReader:字节到字符的桥梁。
2,OutputStreamWriter:字符到字节的桥梁
但:
InputStreamReader(InputStream):通过该构造函数初始化,使用的是本系统默认的编码表GBK。
InputStreamReader(InputStream,String charSet):通过该构造函数初始化,可以指定编码表。
OutputStreamWriter(OutputStream):通过该构造函数初始化,使用的是本系统默认的编码表GBK。
OutputStreamWriter(OutputStream,String charSet):通过该构造函数初始化,可以指定编码表。
所以使用转换流要注意格式的使用。
还有他们的升级版,具有缓冲性质,可以提高效率的升级版Buffered,
也是试用于转换流的。
而由于FileReader与FileWriter在操作文本数据时,使用的是默认的编码表,所以不能转换。
注意:
在使用FileReader操作文本数据时,该对象使用的是默认的编码表。
如果要使用指定编码表时,必须使用转换流。
FileReader fr = new FileReader("a.txt");//操作a.txt的中的数据使用的本系统默认的GBK。
操作a.txt的中的数据使用的也是本系统默认的GBK。
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));
这两句的代码的意义相同。所以理所当然选择前面那句话。简洁方便永远是对的。
但有一点 ——如果a.txt中的文件中的字符数据是通过utf-8的形式编码。
那么在读取时,就必须指定编码表。
那么转换流必须使用。
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"),"utf-8");就必须使用麻烦的,没办法。
接下来说说流操作的基本规律:
数据源:键盘System.in,硬盘File开头的流对象,内存(数组)。
数据汇:控制台System.out,硬盘File开头的流对象,内存(数组)。
将键盘录入的数据存储到一个文件中。(UTF-8编码)
数据源:System.in
既然是源,使用的就是输入流,可用的体系有InputStream,Reader。
因为键盘录入进来的一定是纯文本数据,所以可以使用专门操作字符数据的Reader。
发现System.in对应的流是字节读取流。所以要将其进行转换,将字节转成字符即可。
所以要使用Reader体系中:InputStreamReader(转换流)
接下来,是否需要提高效率呢?如果需要,那么就加入字符流的缓冲区:BufferedReader(升级版)
BufferedReader bur = new BufferedReader(new InputStreamReader(System.in));
数据汇:一个文件,硬盘。
既然是数据汇,那么一定是输出流,可以用的OutputStream,Writer。
往文件中存储的都是文本数据,那么可以使用字符流较为方便:Writer.
因为操作的是一个文件。所以使用Writer中的FileWriter。
是否要提高效率呢?是,那就使用BufferedWriter.
BufferedWriter bufr = new BufferedWriter(new FileWriter("a.txt"));
最后说对象的序列化:
ObjectInputStream
ObjectOutputStream
可以通过这两个流对象直接操作已有对象并将对象进行本地持久化存储。
存储后的对象可以进行网络传输。(就是先储存,再传输?)
两个对象的特有方法:
ObjectInputStream
Object readObject():该方法抛出异常:ClassNotFountException。
ObjectOutputStream
void writeObject(Object):被写入的对象必须实现一个接口:Serializable(这个懂)
否则会抛出:NotSerializableException
今天的就这么多了,理解的不完全,是脑子不好使吗?!。。。。。