io

Posted on By xqw

网上一张图

按字符字节分成两部分,字符字节有关概念

主要使用的两种设计模式

从设计模式上看,最主要使用了两种设计模式,结构型设计模式

适配器模式

InputStream(被适配) InputStreamReader(适配器,新功能,能读字符了),构造方法:

  /**
      * Creates an InputStreamReader that uses the default charset.
      *
      * @param  in   An InputStream
      */
     public InputStreamReader(InputStream in) {
         super(in);
         try {
             sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object
         } catch (UnsupportedEncodingException e) {
             // The default encoding should always be available
             throw new Error(e);
         }
     }

使用:

  File file = new File ("hello.txt");   
  FileInputStream in=new FileInputStream(file); 
  InputStreamReader inReader=new InputStreamReader(in); 

装饰者模式

拿几个类:
InputStream(超类)、
FileInputStream(被装饰,事先写好,不好修改)、
FilterInputStream(装饰者父类)、
BufferedInputStream(装饰者出来的类,新功能,能使用缓存技术对File操作)
所以使用的代码就变成了这样

File file = new File ("hello.txt"); 
FileInputStream in = new FileInputStream(file); 
BufferedInputStream inBuffered = new BufferedInputStream (in); `

OutputStream 同理

用法分析

  1. 按数据来源(去向)使用 是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
    是byte[]:ByteArrayInputStream, ByteArrayOutputStream
    是Char[]: CharArrayReader, CharArrayWriter
    是String: StringBufferInputStream, StringReader, StringWriter
    网络数据流:InputStream, OutputStream, Reader, Writer

  2. 按是否格式化输出使用 要格式化输出:PrintStream, PrintWriter

  3. 按是否要缓冲使用 要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter。

  4. 按数据格式使用 二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类
    纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类

  5. 按输入输出使用 输入:Reader, InputStream类型的子类;输出:Writer, OutputStream类型的子类

  6. 特殊需要 从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
    对象输入输出:ObjectInputStream, ObjectOutputStream
    进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
    合并输入:SequenceInputStream
    更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader

  7. 决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
    考虑最原始的数据格式是什么:是否为文本?
    是输入还是输出?
    是否需要转换流:InputStreamReader, OutputStreamWriter?数据来源(去向)
    是什么:文件?内存?网络?
    是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)
    是否要格式化输出:print。