zoukankan      html  css  js  c++  java
  • 带缓存字符输入输出流

    一.带缓存的输入输出流

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

       1.BufferedInputStream类和BufferedOutputStream类

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

                 BufferedInputStream类有两个构造函数:

                                         BufferedInputStream(InputStream  in);

                                         BufferedInputStream(InputStream  in,int  size);

                第一种形式的构造函数创建了一个带有32个字节的缓存流;第二种形式的构造函数按指定的大小来创建缓存区。一个最优的缓存区的大小,取决于它所在的操作系统、可用的内存空间以及机器配置。从构造函数可以看出,BufferedInputStream对象位于InputStream类对象之前。
    (2)BufferedOutputStream输出信息和向OutputStream输入信息完全一样,只不过BufferedOutputStream有一个flush()方法用来将缓存区的数据强制输出完。
                 BufferedOutputStream类也有两个构造方法:
                                           BufferedOutputStream(OutputStream  in);
                                           BufferedOutputStream(OutputStream  in,int  size);
                 第一种构造函数创建一个32个字节的缓存区,第二种形式以指定的大小来创建缓存区。
                 注意:flush()方法就是用于即使缓存区没有满的情况下,也将缓存区的内容强制写入到外设,习惯上称这个过程为刷新。flush()方法只对使用缓存区的OutputStream类的子类有效。当调用close()方法时,系统在关闭流之前,也会将缓存区中信息刷新到磁盘文件中。 

        2.BufferedReader类与BufferedWriter类

           BufferedReader类与BufferedWriter类分别继承Reader类与Writer类。这两个类同样具有内部缓存制,并可以行为单位进行输入/输出。

           根据BufferedReader类的特点,总结出如图所示的字符数据读取文件的过程。

           BufferedReader类常用的方法如下:

    read()方法:读取单个字符;

               readLine()方法:读取一个文本行,并将其返回为字符串;若无数据可读,则返则返回null;

               write( String s,int off,int len)方法:写入字符串的某一部分;

               flush()方法:刷新该流的缓存。 

               newLine()方法:写入一个行分隔符。

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

    带缓存输入输出流代码:

    package com.hanqi;
    
    import java.io.*;
    
    public class TestFile4 {
    
        public static void main(String[] args) {
            
            
            try 
            {
                File f=new File("d:\test.txt");
            
                //带缓存
                //Writer接口的实现类
                FileWriter fw=new FileWriter(f,true);
                
                //缓存写入类,构造时需要传入Writer实例
                BufferedWriter bw=new BufferedWriter(fw);
            
                bw.write("
    这是缓存方式写入的字符串");
            
                //自动管理缓存
                //自动写入:1.缓存满了 2.缓存关闭之前
                
                bw.flush();//主动清空缓存,写入数据
                
                bw.write("
    这是清空后缓存方式写入的字符串");
                
                bw.close();
                fw.close();
                
                System.out.println("写入完成");
                
                //缓存读
                
                FileReader fr=new FileReader(f);
                
                BufferedReader br=new BufferedReader(fr);
                
                
                //第一次读
    //            String str=br.readLine();
    //            
    //            System.out.println(str);
    //            
    //            while(str!=null)
    //            {
    //                System.out.println(str);
    //                
    //                str=br.readLine();
    //            }
                
                while(true)
                {
                    String str=br.readLine();
                    
                    if(str==null)
                    {
                        break;
                    }
                    System.out.println(str);
                }
                
                
                
                
            }
            catch (IOException e)
            {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
            
            
    
        }
    
    }
    View Code

  • 相关阅读:
    webService客户端搭建(三)
    webService服务器端搭建(二)
    electron 编译 sqlite3避坑指南---尾部链接有已经编译成功的sqlite3
    解决网页中Waiting (TTFB)数据加载过慢的问题
    Node-sqlite3多字段插入数据问题
    win上使用nvm管理node版本
    centos系统设置局域网静态IP
    将win平台上的mysql数据复制到linux上报错Can't write; duplicate key in table
    win上配置nginx
    Nodejs解决所有跨域请求
  • 原文地址:https://www.cnblogs.com/cycanfly/p/5281522.html
Copyright © 2011-2022 走看看