黑马程序员_IO流(一)

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

IO流概述

 

IO流用来处理设备之间的数据传输;

 

 

Java对数据的操作是通过流的方式;

 

 

Java用于操作流的对象都在IO包中;

 

 

流按操作数据分为两种:

 

 

字节流和字符流;

 

 

流按流向分为:

 

 

输入流,输出流。

 

 

字节流的抽象基类:

 

 

InputStream,OutputStream

 

 

字符流的抽象基类:

 

 

Reader,Writer;

 

 

流操作的基本规律:

 

 

1、明确源和目的;

 

 

2、操作的数据是否为纯为本;

 

 

3、当体系明确后,在明确要使用哪个具体的对象。

 

 

FileWriter,FileReader类:

 

 

操作流程:

 

 

1、创建相应的流对象,该对象被初始化时必须要明确被操作的文件。而且该文件会被创建到指定

 

 

目录下。如果该目录下已有同名文件,将被覆盖(调用第一个构造函数)。 

 

 

2、进行相应的读写操作;

 

 

3、是否需要进行刷新操作,如果需要,则需要进行刷新;

 

 

4、关闭流,释放资源。

 

 

示例代码:

 

FileWriter:

Java代码   收藏代码
  1. class  FileWriterDemo {  
  2.       
  3.     public static void main(String[] args) throws IOException {  
  4.           
  5.         /*创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。 
  6.         而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。 
  7.         其实该步就是在明确数据要存放的目的地。*/  
  8.         FileWriter fw = new FileWriter("demo.txt");  
  9.   
  10.         //调用write方法,将字符串写入到流中。  
  11.         fw.write("abcde");  
  12.   
  13.         /*刷新流对象中的缓冲中的数据。 
  14.         将数据刷到目的地中。*/  
  15.         //fw.flush();  
  16.   
  17.   
  18.         /*关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。 
  19.              将数据刷到目的地中。 
  20.              和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。 
  21. */      fw.close();  
  22.     }  
  23. }  

 

 

FileReader:

Java代码   收藏代码
  1. public static void main(String[] args) throws IOException {  
  2.       
  3.     FileReader  fr = new FileReader("DateDemo.java");//创建FileReader流对象  
  4.   
  5.     char[] buf = new  char[1024]; //创建一个缓冲区  
  6.   
  7.     int num = 0;   
  8.   
  9.     while((num=fr.read(buf))!=-1) { //循环读取文件,读到文件末尾则返回-1  
  10.       
  11.         System.out.print(new String(buf,0,num)); //打印读取的内容  
  12.     }  
  13.   
  14.     fr.close(); //关闭资源  
  15. }  

 

 

文件的续写:

 

 

通过构造方法创建可续写文件的流对象。

Java代码   收藏代码
  1. public static void main(String[] args) throws Exception {  
  2.   
  3.         FileWriter fw = new FileWriter("demo.text",true);//续写,不覆盖已有的文件  
  4.           
  5.         fw.write("abc");  
  6.           
  7.         fw.close();  
  8.     }  

  

文件拷贝代码片段:

 

 

       通过FileReader读取指定文件中的内容,创建一个1M大小字符数组缓冲区,再由FileWriter流对象

 

 

写入指定的目标文件。

 

 

Java代码   收藏代码
  1. public static void copy_2() throws Exception {  
  2.           
  3.         FileReader fr = new FileReader("D:\\testsrc.txt");//创建FileReader对象指向要读取的文件  
  4.           
  5.         FileWriter fw = new FileWriter("D:\\dest.txt");//创建FileWriter对象指向要写入的目的文件  
  6.           
  7.         int len = 0;  
  8.         char[] buf = new char[1024];//创建一个缓冲区  
  9.           
  10.         while((len=fr.read(buf)) != -1) { //读取文件内容  
  11.             fw.write(buf,0,len);//写入文件内容  
  12.         }  
  13.           
  14.         //释放资源  
  15.         fr.close();  
  16.         fw.close();  
  17.     }  

 

 

字符流的缓冲区:

 

 

    缓冲区的出现提高了对数据的读写的效率;

 

 

    对应类:

 

 

    BufferedWrite, BufferedReader;

 

 

    缓冲区要结合流才可以使用。

 

 

    在流的基础上对流的功能进行了增强。

 

 

BufferedWrite提供了一个跨平台的换行方法,newLine();

 

 

BufferedReader提供了一个读一行的方法,readLine()不包含行终止符。当返回null是,表示

 

 

已经读到了文件的末尾。

 

 

因为在BufferedReader和BufferedWrite中调用了相应的流对象,所以只需要关闭BufferedReader

 

 

和BufferedWrite,释放资源。

 

 

 

代码片段:

 

Java代码   收藏代码
  1. public static void copy_2() throws Exception {  
  2.       
  3.     FileWriter fw = new FileWriter("buf.txt");  
  4.       
  5.     BufferedWriter bufw = new BufferedWriter(fw);  
  6.       
  7.     bufw.write("abcde");  
  8.       
  9.     //关闭缓冲区,就是在关闭缓冲区中的流对象  
  10.     bufw.close();  
  11.       
  12.     //fw.close();可以不用再写  
  13. }  

 

 

 

Java代码   收藏代码
  1.               FileReader fr = new FileReader("buf.txt");  
  2. BufferedReader bufr = new BufferedReader(fr);  
  3.   
  4. String line = null;  
  5. while((line=bufr.readLine()) != null) { //一次读取一行数据  
  6.     System.out.println(line);  
  7. }  


 

装饰设计模式:

 

 

 当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有的功能,并提供加

 

 

强功能。那么自定义的该类称为装饰类。

 

 

继承和装饰的区别:

 

 

装饰模式比继承更灵活,避免了继承体系的臃肿,而且降低了类与类之间的关系。

 

 

装饰类因为增强已有对象,具备的功能和已有对象是相同的,只不过提供了更强的功能,所以装饰

 

 

类和被装饰类通常属于同一个体系中。

 

 

Java代码   收藏代码
  1. class Person {  
  2.       
  3.     public void chifan() {  
  4.           
  5.         System.out.println("吃饭");  
  6.     }  
  7. }  
  8.   
  9. class SuperPerson  {  
  10.       
  11.     private Person p ;  
  12.       
  13.     SuperPerson(Person p) {  
  14.           
  15.         this.p = p;  
  16.     }  
  17.       
  18.     public void superChifan() {  
  19.           
  20.         System.out.println("开胃酒");  
  21.         p.chifan();  
  22.         System.out.println("甜点");  
  23.         System.out.println("来一根");  
  24.     }  
  25. }  
  26.   
  27.   
  28.   
  29. class  PersonDemo  
  30. {  
  31.     public static void main(String[] args)   
  32.     {  
  33.         Person p = new Person();  
  34.   
  35.         SuperPerson sp = new SuperPerson(p);  
  36.           
  37.         sp.superChifan();  
  38.   
  39.     }  
  40. }  

 

 

read 方法返回的为什么是int类型,而不是byte类型:

 

 

    为了防止凑巧读取到8个1(十进制的-1),这样正好符合了判断条件,而此时文件并没有读取结

 

 

束,所以将byte类型提升为int类型,由4个字节来存放数据,前3个字节补0(方法是将提升后的数据与

 

 

255进行与运算),避免了出现-1的情况,也保证了原数据没有变化。而write方法在执行时,又将4个

 

 

字节的int类型转换为了1个字节的byte类型。

 

 

 字节流 FileInputStream、FileOutputStream:

 

 

FileOutputStream因为是对字节的最小单位操作,所以不需要刷新操作。

 

 

 

Java代码   收藏代码
  1. public static void writeFile() throws Exception {  
  2.           
  3.         FileOutputStream fos = new FileOutputStream("fos.txt");  
  4.           
  5.         //没有使用缓冲区,不需要刷新,因为是对字节的最小单位操作  
  6.         fos.write("abcde".getBytes());  
  7.           
  8.         fos.close();  
  9.   
  10.     }  

 

 

键盘录入方法:

 

 

读取转换流:

 

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

 

输出转换流:

 

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

 

 

示例代码:

Java代码   收藏代码
  1. public static void main(String[] args) throws IOException {  
  2.           
  3.         BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));//创建键盘输入流对象  
  4.   
  5.         BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));//创建流对象,输出到控制台  
  6.   
  7.         String line = null;  
  8.   
  9.         while((line=bufr.readLine())!=null) {//读取一整行数据  
  10.               
  11.             if("over".equals(line))  
  12.                 break;  
  13.             bufw.write(line.toUpperCase());//变为大写字母  
  14.             bufw.newLine();  
  15.             bufw.flush();//刷新  
  16.         }  
  17.   
  18.         bufr.close();//释放资源  
  19.   
  20.     }  

---------------------- <a href="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<a href="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值