带缓存的输入/输出流

来源:互联网 发布:客机纸模型图纸淘宝 编辑:程序博客网 时间:2024/06/05 19:20

缓 存 可 以 说 是 的 一 种 性 能 优 化 。 缓 存 流 为 I/O 流 增 加 了 内 存 缓 存 区 。 有 了 缓 存 区 , 使 得 在 流 上 执 行 skip() 、 mark() 和 reset() 方 法 都 成 为 可 能 。

BufferedInputStream 类 与 BufferedOutputStream 类

BufferedInputStream 类 可 以 对 任 意 的 InputStream 类 进 行 带 缓 存 区 的 包 装 以 达 到 性 能 的 优 化 。

BufferInputStream 类 有 两 个 构 造 函 数 :
■ BufferedInputStream(InputStreamin)
■ BufferedInputStream(InputStream in , int size)

第 一 种 形 式 的 构 造 函 数 创 建 了 一 个 带 有 32 个 字 节 的 缓 存 流 : 第 二 种 形 式 的 构 造 函 数 按 指 定 的 大 小 来 创 建 缓 存 区 。 一 个 最 优 的 缓 存 区 的 大 小 , 取 决 于 它 所 在 的 操 作 系 统 、 可 用 的 内 存 空 间 以 及 机 器 配 置 。 从 构 造 函 数 可 以 看 出 , BufferedInputStream 对 象 位 于 InputStream 类 对 象 之 前 。
下图 描 述 了 字 节 数 据 读 取 文 件 的 过 程 。
这里写图片描述

使 用 BufferedOutputStream 输 出 信 息 和 向 Outputstream 输 入 信 息 完 全 一 样 , 只 不 过 BufferedOutputStream 有 一 个 flush() 方 法 用 来 将 缓 存 区 的 数 据 强 制 输 出 完 。BufferedOutputStream类 也 有 两 个 构 造 方 法 :

■  BufferedOutputStream(OutputStream in) ■  BufferedOutputStream(OutputStream inint size) 

第 一 种 构 造 函 数 创 建 一 个 32 个 字 节 的 缓 存 区 , 第 二 种 形 式 以 指 定 的 大 小 来 创 建 缓 存 区 ·

〖! 注 意〗

flush() 方 法 就 是 用 于 即 使 缓 存 区 没 有 满 的 情 况 下 , 也 将 缓 存 区 的 内 容 强 制 写 入 到 外 设 ,
习 惯 上 称 这 个 过 程 为 刷 新 。flush()方 法 只 对 使 用 缓 存 区 的 OutputStream 类 的 子 类 有 效 · 当 调 用 close()方法时 , 系 统 在 关 闭 流 之 前 , 也 会 将 缓 存 区 中 信 息 刷 新 到 磁 盘 文 件 中。


BufferedReader 类 与 BufferedWriter 类

BufferedReader 类 与 BufferedWriter 类 分 别 继 承 Reader 类 与 Writer 类 。 这 两 个 类 同 样 具 有 内 部 缓 存 机 制 , 并 可 以 行 为 单 位 进 行 输 入 / 输 出 · 根 据 BufferedReader 类 的 特 点 , 总 结 出 如 图 12 . 19 所 示 的 字 符 数 据 读 取 文 件 的 过 程 。

下图是BufferedReader 类 读 取 文 件 的 过 程

这里写图片描述
BufferedReader 类 常 用 的 方 法 如 下 。
『 read()方法:读取单个字符。
『 readLine()方法:读取一个文本行,并将其返回为字符串;若无数据可读,则返回null。
『 write(Strings , int off, int len) 方 法 : 写 入 字 符 串 的 某 一 部 分 。
『 flush() 方 法 : 刷 新 该 流 的 缓 存 。
『 newLine() 方 法 : 写 入 一 个 行 分 隔 符 。

在 使 用 BufferedWriter类 的 Write() 方 法 时 , 数 据 并 没 有 立 刻 被 写 入 至 输 出 流 中 , 而 是 首 先 进 入 缓 存 区 中 。 如 果 想 立 刻 将 缓 存 区 中 的 数 据 写 入 输 出 流 中 , 一 定 要 调 用 flush() 方 法 。

〖 例 〗 本 实 例 向 指 定 的 磁 盘 文 件 中 写 入 数 据 , 并 通 过 BufferedReader 类 将 文 件 中 的 信 息 分
行 显 示 。

/* * 导入Java.io包 */import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileNotFoundException;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Student {   //创建类     public static void main(String[] args) {  //主方法        String content[]={"你好","我是小猫","你是谁啊"};  //定义字符串        File file=new File("d:/123.txt");   //创建文件对象        /*         * 写         */        FileWriter fw=null;   //声明对象        BufferedWriter bw=null; //声明对象         try {            fw=new FileWriter(file);   //创建对象            bw=new BufferedWriter(fw);            //遍历数组            for(int k=0;k<content.length;k++){                //将字符数组中 元素写入到磁盘文件                bw.write(content[k]);                //将数组中的单个元素以单行的形式写入文件。                bw.newLine();            }        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }finally{            try {                bw.close();  //关闭流                fw.close();            } catch (IOException e) {                // TODO Auto-generated catch block                e.printStackTrace();            }        }        /*         * 写         */        FileReader fr=null;        BufferedReader br=null;        try {            fr=new FileReader(file);            br=new BufferedReader(fr);            String s=null;            int  i=1;            while((s=br.readLine())!=null){                System.out.println("第"+(i++)+"行:"+s);            }        } catch (FileNotFoundException e) {            // TODO Auto-generated catch block            e.printStackTrace();        } catch (IOException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}

结果:
第1行:你好
第2行:我是小猫
第3行:你是谁啊

原创粉丝点击