InputStream的作用是用来表示那些从不同数据源产生输入的类 。包含的类型如下表所示:
类 | 功能 | 构造器参数 | 如何使用 |
---|
ByteArrayInputStream | 允许将内存的缓冲区当作InputStream使用 | 缓冲区,字节将从中取出 | 作为一种数据源:将其与FilterInputStream对象相连以提供有用接口 |
StringBufferInputStream | 将String转换成InputStream | 字符串。底层实现实际使用StringBuffer | 作为一种数据源:将其与FilterInputStream对象相连以提供有用接口 |
FileInputStream | 用于从文件读取信息 | 字符串,表示文件名、文件或FileDescriptor对象 | |
PipedInputStream | 产生用于写入相关PipedOutputStream的数据。实现“管道化”概念 | PipedOutputStream | 作为多线程中的数据源:将其与FilterInputStream对象相连以提供有用接口 |
SequenceInputStream | 将两个或多个InputStream对象转换成单一InputStream | 两个InputStream对象或一个容纳InputStream对象的容器Enumeration | 作为一种数据源:将其与FilterInputStream对象相连以提供有用接口 |
FilterInputStream | 抽象类,作为“装饰器”的接口。其中,“装饰器”为其他的InputStream类提供有用功能。 | | |
2.OutputStream类型
该类别的类决定了输出所要去往的目标:字节数组(但不是String)、文件或管道包含的类型如下表所示:
类 | 功能 | 构造器参数 | 如何使用 |
---|
ByteArrayOutputStream | 在内存中创建缓冲区。所有送往“流”的数据都要放置在此缓冲区 | 缓冲区初始化尺寸(可选的) | 用于指定数据的目的地:将其与FilterOutputStream对象相连以提供有用接口 |
FileOutputStream | 用于将信息写至文件 | 字符串,表示文件名、文件或者FileDescriptor对象 | 指定数据的目的地:将其与FilterOutputStream对象相连以提供有用接口 |
PipedOutputStream | 任何写入其中的信息都会自动作为相关PipedInputStream的输出。实现“管道化”概念 | PipedInputStream | 指定用于多线程的数据的目的地:将其与FilterOutputStream对象相连以提供有用接口 |
FilterOutputStream | 抽象类,作为“装饰器”的接口。其中,“装饰器”为其他的InputStream类提供有用功能。 | | |
类 | 功能 | 构造器参数 | 如何使用 |
---|
DataInputStream | 与DataOutputStream搭配使用,因此我们可以按照可移植方式从流读取基本数据类型(int,char,long等) | InputStream | 包含用于读取基本类型数据的全部接口 |
BufferedInputStream | 使用它可以防止每次读取时都得进行实际写操作。代表“使用缓冲区” | InputStream,可以指定缓冲区大小(可选的) | 本质上不提供接口,只不过是向进程中添加缓冲区所必须的。与接口对象搭配 |
LineNumberInputStream | 跟踪输入流中的行号;可调用getLineNumber()和setLineNumber(int) | InputStream | 仅增加了行号,因此可能要与接口对象搭配使用 |
PushbackInputStream | 具有“能弹出一个字节的缓冲区”。因此可以将读到的最后一个字符回退 | InputStream | 通常作为编译器的扫描器,之所以包含在内是因为Java编译器的需要,我们基本上用不到 |
4.FilterOutputStream类型
类 | 功能 | 构造器参数 | 如何使用 |
---|
DataOutputStream | 与DatInputStream搭配使用,因此我们可以按照可移植方式从流读取基本数据类型(int,char,long等) | OutputStream | 包含用于写入基本类型数据的全部接口 |
PrintStream | 用于产生格式化输出。其中OutputStream处理数据的存储,PrintStream处理显示 | OutputStream,可以用boolean值指示是否每次换行时情况缓冲区(可选的)应该是对OutputStream对象的“final”封装。可能会经常使用到它 | |
BufferedOutputStream | 使用它以避免每次发送数据时都要进行实际的写操作。代表“使用缓冲区”。可以调用flush()清空缓冲区 | OutputStream,可以指定缓冲区大小(可选的) | 本质上并不提供接口,只不过向进程中添加缓冲区所必需的。与接口对象搭配 |
5.如何选择类
- 确定是输入还是输出
输入流:InputStream Reader
输出流:OutputStream Writer - 操作的是否是纯文本
是:字符流 Reader,Writer
否:字节流 InputStream,OutputStream - 具体的操作设备
硬盘文件:
– 读取:FileInputStream,FileReader
– 写入:FileOutputStream,FileWriter
内存
– byte[]:ByteArrayInputStream, ByteArrayOutputStream
– char[]:CharArrayReader, CharArrayWriter
–String:StringBufferInputStream(已过时,因为其只能用于String的每个字符都是8位的字符串), StringReader, StringWriter
–网络用Socket流
–键盘:用System.in(是一个InputStream对象)读取,用System.out(是一个OutoutStream对象)打印
4.是否需要转换流
是,就使用转换流,从Stream转化为Reader,Writer:InputStreamReader,OutputStreamWriter
5.是否需要缓冲提高效率
是就加上Buffered:BufferedInputStream, BufferedOuputStream, BuffereaReader, BufferedWriter
6.是否需要格式化输出
例子
例:将一个文本文件中数据存储到另一个文件中。
1)数据源和数据目的:读取流,InputStream Reader 输出:OutputStream Writer
2)是否纯文本:是!这时就可以选择Reader Writer。
3)设备:是硬盘文件。Reader体系中可以操作文件的对象是 FileReader FileWriter。
FileReader fr = new FileReader(“a.txt”);
FileWriter fw = new FileWriter(“b.txt”);
4)是否需要提高效率:是,加Buffer
BufferedReader bfr = new BufferedReader(new FileReader(“a.txt”); );
BufferedWriter bfw = new BufferedWriter(new FileWriter(“b.txt”); );
参考文献
- Java输入输出流
- JAVA编程思想