网上一张图

按字符字节分成两部分,字符字节有关概念
主要使用的两种设计模式
从设计模式上看,最主要使用了两种设计模式,结构型设计模式
适配器模式
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 同理
用法分析
-
按数据来源(去向)使用 是文件: FileInputStream, FileOutputStream, FileReader, FileWriter
是byte[]:ByteArrayInputStream, ByteArrayOutputStream
是Char[]: CharArrayReader, CharArrayWriter
是String: StringBufferInputStream, StringReader, StringWriter
网络数据流:InputStream, OutputStream, Reader, Writer -
按是否格式化输出使用 要格式化输出:PrintStream, PrintWriter
-
按是否要缓冲使用 要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter。
-
按数据格式使用 二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类
纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类 -
按输入输出使用 输入:Reader, InputStream类型的子类;输出:Writer, OutputStream类型的子类
-
特殊需要 从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter
对象输入输出:ObjectInputStream, ObjectOutputStream
进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
合并输入:SequenceInputStream
更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader -
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
考虑最原始的数据格式是什么:是否为文本?
是输入还是输出?
是否需要转换流:InputStreamReader, OutputStreamWriter?数据来源(去向)
是什么:文件?内存?网络?
是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)
是否要格式化输出:print。