其他的FilterInputStream子类则在内部修改InputStream类的行为:是否缓冲、是否保留它所读过的行(允许我们查询行数或者设置行数),以及是否把一个单一字符推回输入流等等。实现最后两个功能的类添加像是为了创建一个编译器(使用Java构建的编译器),一般情况下我们不会用到它们。
FilterInputStream类型DataInputStream 与DataOutputStream搭配使用,可以按照可移植的方式从流中读取基本类型数据 DataInputStream(InputStream in);包含用于读取基本数据类型的所有接口
BufferedInputStream 使用它可以防止每次读取时都得进行实际的写操作。代表“使用缓冲区”。 BufferedInputStream(InputStream in) 、BufferedInputStream(InputStream in, int size);本质上不提供接口,只是向进程中添加缓冲区所必需的。与接口对象搭配
LineNumberInputStream 跟踪输入流中的行号;可以调用getLineNumber()和setLineNumber(int) LineNumberInputStream(InputStream in);仅增加了行号
PushbackInputStream 具有“能弹出一个字节的缓冲区”,因此可以将读到的最后一个字符回退 PushbackInputStream(InputStream in) 、PushbackInputStream(InputStream in, int size);通常作为编译器的扫描器
通过FilterOutputStream向OutputStream中写入
FilterOutputStream子类中地DataOutputStream可以将各种基本数据类型以及String对象格式化输出到“流”中;这样任何机器上使用DataInputStream就可以读取它们。
PrintStream最初的目的是为了便于以可视化格式打印所有基本数据类型以及String对象。它和DataOutputStream不同,后者的目的是将数据元素置于“流”中,使DataInputStream能够可移植地重构它们。DataOutputStream用于处理数据存储,PrintStream用于处理显示。
BufferedOutputStream是一个修改过的OutputStream,它对数据流使用缓冲技术;因此当每次向流中写入时,不必每次都进行实际的物理写动作。所以在进行输出时,我们可能更经常使用它。
FilterOutputStream类型 类 功能 构造器/如何使用DataOutpurStream 与DataInputStream搭配使用,因此可以安装可移植的方式向流中写入基类类型数据(int,char,long等) DataOutputStream(OutputStream out) ; 包含用于写入基本类型数据的全部接口
PrintStream 用于产生格式化输出。 构造参数为OutputStream或者是指定的文件名或文件
BufferedOutputStream 使用它避免每次发送数据时都要进行实际的写操作。代表“使用缓冲区”。可以调用flush()函数清空缓冲区 BufferedOutputStream(OutputStream out) 、BufferedOutputStream(OutputStream out, int size);本质上不提供接口,只是向进程中添加缓冲区所必需的。与接口对象搭配
随即访问文件RandomAccessFile
RandomAccessFile适用于由大小已知的记录组成的文件,我们就可以使用seek()将文件指针位置从一处转到另一处,然后读取或者修改记录。我们事先要知道每条记录的大小以及它们在文件中的位置,那么我们就可以实现随机访问。
RandomAccessFile不是InputStream或者OutputStream继承层次结构中的一部分。RandomAccessFile的工作方式类似于将DataInputStream和DataOutputStream组合起来使用。在Java 1.4中,RandomAccessFile的大多数功能将由nio存储映射文件所代替。
I/O流的典型使用方式 缓冲输入文件若要打开一个文件进行字符输入,我们使用String或者File对象作为构造参数的FileReader。为了提高文件的读取速度,我们可以使用带缓冲(Buffer)的BufferedReader(读取一定数量的文件中字符先存放在BufferedReader中的Buffer中,即BufferedReader中的Buffer为一个字符数组。Buffer可以缓和一个字符一个字符进行读取的频繁操作的延迟,因为一个一个读取将大量时间都花费在了开始读取和结束读取操作上)。我们将FileReader的引用传递给BufferedReader的构造器,就构造出我们需要的对象,此对象还拥有读取一行字符串的readLine()方法。(这种方式也叫做装饰器模式,BufferedReader让我们的原本的对象拥有缓冲以及按行读取字符串的方法)。下面举例简单应用BufferedReader。
public class TestBufferedReader { public static String read(String fileName) { BufferedReader br = null; FileReader fReader = null; StringBuilder sBuilder = new StringBuilder(); try { fReader = new FileReader(fileName); br = new BufferedReader(fReader); String str = null; //按行获取文件内容 while((str = br.readLine()) != null) { sBuilder.append(str); sBuilder.append("\n"); //readLine()删除了换行符 } }catch (FileNotFoundException e) { e.printStackTrace(); }catch (IOException e) { e.printStackTrace(); }finally { if (br != null) { try { br.close(); }catch (IOException e) { e.printStackTrace(); } } if(fReader != null) { try { fReader.close(); }catch (IOException e) { e.printStackTrace(); } } } return sBuilder.toString(); } public static void main(String[] args) { System.out.println(read("mmdou.txt")); } } /* output: This is mmdou.txt To be or not to be that is a question. */ 从内存输入