黑马程序员_IO流的总结

---------------------- android培训java培训、期待与您交流! ----------------------

一:IO流概述与基本操作

IO流用于操作设备上数据的技术。

专门用于操作字符数据的流对象:
  其实原理:字节流+编码表。
  
 日后,只要操作的数据是文本,建议使用字符流更为方便。
 
字节流:
 InputStream  OutputStream
 
字符流:
 Reader Writer
 
名称规律:
 四个体系中的子类们,后缀名都是其所属体系顶层父类的名称,
 前缀名都是该子类对象的功能体现。
 
 
需求:将一个字符串写入到硬盘的文件中。
既然是将一个字符串写入到一个外围设备上。
就要使用到流技术。
既然字符串是文本,所以可以使用字符流。
既然是往外部设备上写入,需要使用输出流。
即使字符流,又是输出流,哪个体系?Writer.
既然是往文件里写,Writer中是否有定义具体操作文件的子类对象。
Writer体系中有一个对象FileWriter.专门用操作文件的流对象。


接下来,先查阅一下Writer体系中共性方法。有写字符数组,字符,字符串的方法。

创建子类的对象。 FileWriter ,创建对象时,必须要查阅子类的构造方法摘要。
发现必须要明确数据的目的地。

二:流的操作规律:
 目的:为了明确使用io流对象时,在具体需求下,该用哪个对象来解决问题。
 
 其实通过几个明确来完成具体对象确定的。
 
 明确一:明确数据源,还是数据目的(数据汇)。
  数据源:意味着读,InputStream , Reader
  数据目的:意味着写,OutputStream , Writer
 
 明确二:明确要操作的数据是否是纯文本数据。
  是纯文本:为了方便于文本操作建议使用字符流。
  是纯文本,对于数据源:Reader
  是纯文本,对于数据目的:Writer
  不是纯文本呢?那还用废话吗?都是字节流嘛!
  
 到了前两个明确,已经可以确定四个体系中一个。
 接下来就是要搞清楚到底要用这个体系中的哪个对象。
 
 明确三:明确数据所在的具体设备。
  数据源:
   硬盘:File打头。
   内存:数组。
   键盘:System.in
   网络:Socket
  数据目的:
   硬盘:File前缀
   内存:数组。
   控制台:System.out.
   网络:Socket
  
 明确四:明确流操作时,是否需要额外功能?
  高效? Buffered
  转换?转换流。
  ...很多。 都是基本基础流之上来的功能流对象。

 

需求一:复制一个文本文件。
 明确一:
  既有源,又有目的。
  源:InputStream  Reader
  目的:OuputStream  Writer
  
 明确二:
  是否是纯文本?
  是!
  源:Reader
  目的:Writer
 
 明确三:
  具体的设备是哪个?
  源:硬盘,File
  目的:硬盘 File
 
 代码就出来了。
 FileReader fr = new FileReader("a.txt");
 FileWriter fw = new FileWriter("b.txt");
 
 
 明确四:
  需要额外功能不?
  需要,高效!
 
  BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
  BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
   
 

需求二:将键盘录入的数据存储到一个文件中。
 明确一:
  既有源,又有目的。
  源:InputStream  Reader
  目的:OuputStream  Writer
  
 明确二:
  是否是纯文本?
  是!
  源:Reader
  目的:Writer

 明确三:
  具体设备:
  源:键盘,System.in
  目的:硬盘,File
  
  InputStream in = System.in;
  FileWriter fw = new FileWriter("a.txt");
  
  这样是可以完成读写操作的。就是很麻烦。
 明确四:
  需要额外功能不?
  转换。转换流。字节转成字符。InputStreamReader
  InputStreamReader isr = new InputStreamReader(System.in);
  FileWriter fw =new FileWriter("a.txt");
  高效,Buffered
  BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
  BufferedWriter bufw = new BufferedWriter(new FileWriter("a.txt"));
  
  
  
  


需求三:将一个文本文件打印在控制台上。
 明确一:
  既有源,又有目的。
  源:InputStream  Reader
  目的:OuputStream  Writer
  
 明确二:
  是否是纯文本?
  是!
  源:Reader
  目的:Writer
 
 明确三:
  具体的设备:
  源:硬盘,File
  目的:控制台 ,System.out.
 
  FileReader fr = new FileReader("a.txt");
  OutputStream out = System.out;
  
  char[] buf = new char[1024];
  int len = fr.read(buf);  
  String str = new String(buf,0,len);  
  out.write(str.getBytes());
  
  麻烦。
  
 明确四:需要额外功能不?
  转换:字符转成字节的对象。OutputStreamWriter
  FileReader fr = new FileReader("a.txt");
  OutputStreamWriter osw  = new OutputStreamWriter(System.out);
  
  高效:
  BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
  BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
  
  

 

需求四:读取键盘录入数据,打印在控制台上。

 自己写!
 


需求五:读取一个文本文件中的中文,将这些数据按照UTF-8的编码写入到文件中。
 
 FileReader fr = new FileReader("a.txt");
 
 这三句代码的效果一模一样。
 FileWriter fw = new FileWriter("b.txt");//GBK. 这个子类对象的出现是为了便于操作字符文件,将本地默认码表+操作文件的字节流进行了封装。、
            //但是这个子类也有局限性,1,必须是文件,2,固定码表 本地默认。
            如果想要改变设备,或者码表必须用它的父类。以下两句。
 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));//GBK
 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"GBK");//GBK
 
 明确一:
  既有源,又有目的。
  源:InputStream  Reader
  目的:OuputStream  Writer
  
 明确二:
  是否是纯文本?
  是!
  源:Reader
  目的:Writer
 
 明确三:
  具体的设备:
  源:硬盘,File
  目的:硬盘,File
  
  FileReader fr = new FileReader("a.txt");
  FileWriter fw = new FileWriter("b.txt");
 
 明确四:
  需要额外功能吗?
  必须,因为要明确指定的编码,所以目的就不可以使用FileWriter。因为它是固定的编码。
  需要转换,字符-->字节。OutputStreamWriter
  FileReader fr = new FileReader("a.txt");
  //因为目的是文件。又是字节流类型。所以可以给转换流传入FileOutputStream
  OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"),"UTF-8");
  
  需要,高效。
  BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));// 是按照默认码表读取
  BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("b.txt"),"utf-8");
  

  ---------------------- android培训java培训、期待与您交流! ----------------------
详细请查看:http://edu.youkuaiyun.com/heima

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值