黑马程序员--Io流,(含自己的一点理解,与图解)

来源:互联网 发布:淘宝网电脑网页版登录 编辑:程序博客网 时间:2024/05/17 04:37

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

 

 

 

                                            IO

 

在java中,文件的输入输出功能是通过流(Stream)来实现的。什么是流呢?可以理解为一组有顺序的,有起点和终点的动态数据集合。流可以看成是数据的导管,导管的一端是源端
一端是目的端,数据从源端输入,在目的端输出。

 

 


流按照处理数据的单位可分为两种:字节流和字符流。字节流处理字节的输入和输出,例如使用字节流读取或书写二进制数据。字符流为字符输入和输出处理提供了方便。他采用Unicode编码标准,因而可以国际化,在某些方面如汉字的处理,它比字节流高效。

流的抽象基类:

 字节流:InputStream(输入)、OutputStream(输出);
 字符流:Writer(写入)、Reader(读出)


所有字符输入流类都是抽象类Reader的子类。返回字符值。

 int read()从源中读取一个字符的数据。返回字符值
 int read(char b[])从源中试图读取b.length个字符到b中,返回实际读取的字符数目,返回-1表示读取完毕
 void close()关闭输入流。

Java中IO流:

        1,在程序中所有的数据都是以流的方法进行传输和保存的。
        2,Java 的IO是实现输入和输出的基础。
        3,Java把所有传统的流类型(类或抽象类)都放在java.io包中,用以实现输入输出功能。
        4,输入和输出是一个相对的概念,我们一般站在程序的角度来分析和处理问题的。
              程序需要数据 --> 读进来--> 输入
              程序保存数据 --> 写出去--> 输出

 

 

步骤:
      1,使用File类找到一个文件对象,得到IO操作的源或目标
      2,通过字节流或字符流的子类创建对象,(得到IO操作的通道)
      3,进行读或写的操作,(IO操作)
      4,关闭输入/输出,(注意节约资源,关掉)


注意:
 1,定义文件路径时,可以用“/”或者“\\”。
        2,在创建一个文件时,如果目录下有同名文件将被覆盖。


例如:用Reader来实现文件的读取。
 //创建字符输入流对象,负责读取c:\hello.template文件
 Reader fr=new FileReader("c:/hello.template");
 //创建中转站数组,存放读取的内容
 char[] ch=new char[1024];
 //读取文件内容到ch数组
 int length=fr.read(ch);
 //输出保存在ch数组中的文件内容
 System.out.println(new String(ch,0,length));


 注意:最后要关闭输入流
 if(fr!=null){
  fr.close();
 }

 

使用Writer输出内容到文件

 void write(int n)向输出流写入单个字符。

 void write(char b[])向输出流写入一个字符数组

 void write(String str)向输出流写入一个字符串数组。

 void close()关闭输出流


例如:
 String str="传智播客,黑马程序员";
 FileWriter fw=new FileWriter("c:\\itcast.txt");
 fw.write(str);

 注意:关闭写入流
 if(fw!=null){
  fw.close();
 }

 


装饰设计模式:
    解决的问题:给已有的对象提供增强额外的功能。对原有类进行了功能的改变,增强。

    与继承的区别:它比继承更加灵活


Writer
           |--TextWriter
           |--MediaWriter

但是,发现写入效率有点低。想要对其进行效率的提高。 这时就可以使用缓冲技术来完成的。
对于已有对象中的写入方法,不够高效,可以通过派生子类的形式对其进行复写,定义高效的写入动作。如,

Writer
           |--TextWriter
               |--BufferTextWriter
           |--MediaWriter
               |--BufferMediaWriter
           |--DataWriter
               |--BufferDataWriter
这种方式其实是通过继承的方式提高了效率。但是对于扩展性是一个问题。而且所需的功能越多,子类就越多。
 一旦加入新类,就需要为它提供高效。显得很麻烦!

这时我们可以将缓冲技术单独进行封装。哪个对象需要缓冲,就把哪个对象传递给缓冲对象即可。

 

 


读取键盘录入:

      InputStream in = System.in;

     将字节数据转成字符数据:InputStreamReader isr = new InputStreamReader(in);

     提高读取效率,使用缓冲区:BufferedReader bufr = new BufferedReader(isr);

键盘录入

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

注意:系统中获取的流对象都是唯一的,如果将其关闭,就不能在使用了。所以一般情况下,从System获取到的流对象,不需要关闭。它会随着程序的停止而结束。

 

 

 

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

 

 

 

原创粉丝点击