将外设中的数据读取到内存中:输入
将内存的数写入到外设中:输出
字符流的由来:
其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字
在对这个文字进行操作 简单说 字节流+编码表
----------------------------------
字节流的两个顶层父类:
1 InputStrem 2 OutputStrem
字符流中的两个顶层父类
1 Reader 2 Writer
读 输入流 写 输出流
这些体系的子类几乎都已父类名作为后缀
而子类名的前缀就是该对象的功能
就从熟悉的文字开始字符流
//需求:将一些文件存储到硬盘的一个文件中
记住:如果要操作文字数据 建议优先考虑字符流
而且要将数据从内存写到硬盘上 要使用字符流中的输出流。Writer
硬盘的数据的基本体现是文件 希望找到一个可以操作文件的Write
找到了能操作文件的FileWriter
//需求读取一个文本文件,将读取到的字符打印到控制台
同上 找到了FileReader
-------------------------------------
字符流 缓冲区
BufferedWriter
:newLine();
BufferedReader
:readLine();
使用缓冲区复制一个文本文件:
装饰设计模式:
对一组对象的功能进行增强时,就可以使用该模式进行问题的解决
==============================
字节流:
InputStream
OutputStream
字节流:
FileInputStream
FileOutputStream
BufferedInputStream
BufferedOutputStream
字符流:
Writer Reader
FileReader
FileWriter
BufferedReader
BufferedWriter
转换流:
InputStreamReader 字节到字符的桥梁 解码
OutputStreamWriter 字符到字节的桥梁 编码
流的操作规律
之所以哟啊弄清楚这个规律是因为 流对象太多 开发时不知道该用那个对象合适
想要知道开发时用到哪些对象 只要通过四个明确即可
1、明确源和目的(汇)
源:InputStream Reader
目的:OutputStream Writer
2、明确数据是否是纯文本数据‘
源:是纯文本:Reader
否 InputStream
目的:是纯文本 Writer
否 OutputStream
到这里就可以明确需求中具体要使用那个体系
3 明确具体的设备
源设备:
硬盘:File
键盘:System.in
内存:数组
网络:Socket流
目的设备:
硬盘:File
控制台:System.out
内存:数组
网络:Socket流
4 是否需要其他额外功能
1 是否需要高效(缓冲区)
是 加上buffer
需求1:复制一个文本文件
1 明确源和目的
源:InputStram Read
目的:OutputStream Writer
2 是否为纯文本
是 :
Read
Writer
3 明确具体设备
源;
硬盘 File
目的
硬盘 FIle
FileReader fr=new FileReader("a.txt");
FileWriter fw=new FileWriter("b.txt");
4 需要额外功能吗?
需要,需要高效
BufferedReader bufr=new BufferedReader(new FileRead("a.txt"));
BufferedWriter bufw=new BufferedWriter(new FileWriter("b.txt"));
需求2 读取键盘录入信息 并写入到一个文件中
1 明确源和目的
源:InputStram Read
目的:OutputStream Writer
2 是否为纯文本
是 :
Read
Writer
3 明确设备
源:
键盘 System.in
目的:
硬盘File
InputStream in =System.in;
FileWriter fw=new FileWriter("b.txt");
这样做可以完成 但是麻烦 将读取的字节数据转成字符串 再由字符流操作
4 需要额外功能
需要。转换 将字节流转成字符流。因为明确的源是Reader 这样操作文本数据更便捷
所以要将已有的字节流转成字符流 使用字节-->字符 InputStreamReader
InputStreamReader isr =new InputStreamReader(System.in);
FileWriter fw=new FileWriter("b.txt");
还需要功能吗 ?
需要 需要高效
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw=new BufferedWriter(new FileWriter("b.txt"));
3 将一个文本文件打印到控制台上
1 明确源和目的
源:InputStram Read
目的:OutputStream Writer
2 是否为纯文本
是 :
Read
Writer
3 明确设备
源
硬盘 File
目的
控制台 System.out
FileReader fr=new FileReder("d:\\a.txt");
OutpurStream out=System.out;//PrintStream 多态
4 需要额外功能吗?
需要 转换
FileReader fr=new FileReder("d:\\a.txt");
OutputStreamWriter osw=new OutputStreamWriter(System.out);
需要 高效
BufferedReader bufr=new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw=new BufferedrWriter(System.out);
需求4 读取键盘录入数据 显示在控制台上
1 明确源和目的
源:InputStram Read
目的:OutputStream Writer
2 是否为纯文本
是 :
Read
Writer
3 明确设备
源
键盘 System.in
目的
控制台:System.out
InputStream in=System.in;
OutputStream out=System.out;
4 明确额外功能
需要转换 因为都是字节流 但是操作的是文本数据
所以使用字符流操作起来更为便捷
InputStreamReader isr=new InputStreamReader(System.in);
OutputStreamWriter osw=new new InputStreamReader(System.in));
为了将其高效
BufferedReader bufr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw=new BufferedWriter(new OutputStreamWriter(System.out));
====================================================================
5需求 将一个中文字符串数据按照指定的编码表写入到一个文本文件中
1 目的 OutputStream Writer
2 是纯文本 Writer
3 设备 硬盘 File
FileWriter fw=new FileWriter("a.txt");
fw.write("你好");
注意:既然需求中已经明确了指定编码表的动作
那就不可以FileWriter 因为FileWriter内部是使用默认的本地码表
只能使用其父类OutputStreamWriter
OutputStreamWriter接收一个字节输出流对象 既然是操作文件 那么该对象应该是FileOutputStream
OutputStreamWritrer osw=new OutputStreamWriter(new FileOutputStream("a.txt"),charsetName);
需要高效吗?
BufferedWriter bfw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream(a.txt),charsetName));
什么时候使用转换流?
1 源或者目的对应的设备是字节流 但是操作的是文本数据 可以使用转换流作为桥梁
提高对文本操作的便捷
2 一旦操作文本涉及到具体的指定编码表时 必须使用转换流