Java IO概述

输入流和输出流是相对与内存设备而言


将外设中的数据读取到内存中:输入
将内存的数写入到外设中:输出


字符流的由来:
其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字
在对这个文字进行操作 简单说 字节流+编码表
----------------------------------

字节流的两个顶层父类:
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 一旦操作文本涉及到具体的指定编码表时 必须使用转换流

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值