天天看點

BufferedInputStream與BufferedOutputStream用法簡介

BufferedInputStream是帶緩沖區的輸入流,預設緩沖區大小是8M,能夠減少通路磁盤的次數,提高檔案讀取性能;BufferedOutputStream是帶緩沖區的輸出流,能夠提高檔案的寫入效率。BufferedInputStream與BufferedOutputStream分别是FilterInputStream類和FilterOutputStream類的子類,實作了裝飾設計模式。

BufferedInputStream類的例子如下:

import java.io.File;

import java.io.InputStream;

import java.io.FileInputStream;

import java.io.BufferedInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.text.SimpleDateFormat;

import java.util.Date;

public class BufferedInputStreamDemo01{

// 聲明常量
    public static final int SIZE=1024;

public static void main(String[] args){
   //變量聲明
       File f=null;
   InputStream input=null;
   BufferedInputStream bis=null;
       StringBuilder strBuild=null;
   SimpleDateFormat sdf=null;
   Date d=null;
       long start=0L;
   long end=0L; 

      try{
      sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

      strBuild=new StringBuilder();
              start=System.currentTimeMillis();
      d=new Date();
      if(d!=null){
              d.setTime(start);
     }
      System.out.println("程式開始執行時間:"+sdf.format(d));

  f=new File("d:"+File.separator+"demo.txt");
      input=new FileInputStream(f);
      // 指定檔案帶緩沖區的讀取流且指定緩沖區大小為2KB
  bis=new BufferedInputStream(input,2*SIZE);
      int bisLength=bis.available();
      int readLength=0;
      byte[] byteArray=new byte[SIZE];
      int tmp=0;
      while((tmp=bis.read(byteArray))!=-1){ 
            strBuild.append(new String(byteArray,0,tmp));
    System.out.println("每次讀取位元組數量:"+tmp);
    System.out.println("檔案中剩餘位元組數:"+input.available());
 }

      System.out.println(String.format("檔案的大小:%d,緩沖區讀取流傳回的大小:%d",f.length(),bisLength));
  System.out.println("檔案的内容:"+strBuild.toString());
  System.out.println("字元串長度:"+strBuild.toString().length());
  char[] cTmp=strBuild.toString().toCharArray();
  System.out.println("字元串->字元數組長度:"+cTmp.length);

  end=System.currentTimeMillis();
  d=new Date();
  if(d!=null){ 
     d.setTime(end);
  }
  System.out.println("程式執行的結束時間:"+sdf.format(d));
  System.out.println("<-------------******************---------------->");
  System.out.println("程式執行時間(ms):"+(end-start)+"毫秒");

   }catch(FileNotFoundException ex){
      ex.printStackTrace();
   }catch(IOException ex){
      ex.printStackTrace();
   }finally{
     try{
           if(input!=null){
     input.close();
    }
       if(bis!=null){
     bis.close(); 
       }
     }catch(IOException ex){
       ex.printStackTrace();
     }
  }
           

}

}

BufferedOutputStream類的例子如下:

import java.io.File;

import java.io.OutputStream;

import java.io.FileOutputStream;

import java.io.BufferedOutputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

public class BufferedOutputStreamDemo01{

public static final int SIZE=1024;

public static final String DRIVERNAME=”oracle.jdbc.driver.OracleDriver”;

public static final String DBURL=”jdbc:oracle:thin:@IP:1521:DB名稱”;

public static final String USERNAME=”使用者名”;

public static final String PASSWORD=”密碼”;

static{
   try{
        // 加載驅動程式
        Class.forName(DRIVERNAME);
      }catch(ClassNotFoundException ex){
        ex.printStackTrace();
    }
}

public static void main(String[] args){
   // 變量聲明
   File f=null;
   OutputStream output=null; 
   BufferedOutputStream bos=null;
       Connection con=null;
   PreparedStatement pst=null;
       ResultSet rs=null;
   StringBuilder strBuild=null;

       try{
      String sql=" select vendor_no,vendor_name,address,phone,email,zipcode from VENDOR";

      con=new BufferedOutputStreamDemo01().getConnection();
              // 獲得資料庫操作類
              pst=new BufferedOutputStreamDemo01().getPst(con,sql);
              // 獲得結果集
      rs=pst.executeQuery();

      f=new File("F:"+File.separator+"tmp.txt");
      output=new FileOutputStream(f,false);
      bos=new BufferedOutputStream(output,SIZE*4);

      while(rs.next()){
                    strBuild=new StringBuilder();

        // 店号
        strBuild.append(rs.getString("vendor_no"));
        strBuild.append(",");

                    // 店名
        strBuild.append(rs.getString("vendor_name"));
        strBuild.append(",");

        // 位址
        strBuild.append(rs.getString("address"));
        strBuild.append(",");

        // 電話
        strBuild.append(rs.getString("phone"));
        strBuild.append(",");

                    // 郵件
        strBuild.append(rs.getString("email"));
        strBuild.append(",");

                    // 郵政編碼
        strBuild.append(rs.getString("zipcode"));
        strBuild.append("\n");

                    bos.write(strBuild.toString().getBytes("utf-8"));
      }

       }catch(IOException ex1){
           ex1.printStackTrace();
   }catch(SQLException ex){
       ex.printStackTrace();
   }finally{
           try{
         // 關閉流
         if(output!=null){
           output.close(); 
         }
         if(bos!=null){
                        bos.close();
         } 
         //關閉資料庫連接配接
         if(rs!=null){
                        rs.close();
         }
                     if(pst!=null){
                        pst.close();
         }
                     if(con!=null){
           con.close();
         }
             }catch(IOException ex){
            ex.printStackTrace();
             }catch(SQLException ex){
                ex.printStackTrace();
         }
     }
}

/**
    **獲得資料庫連接配接
**
**/
public static Connection getConnection(){
   Connection con=null;
   try{
       // 獲得資料庫連接配接
       con=DriverManager.getConnection(DBURL,USERNAME,PASSWORD);
   }catch(SQLException ex){
       ex.printStackTrace();
   } 

   return con;
}

/**
    **獲得資料庫操作類
**/
public static PreparedStatement getPst(Connection con,String sql){
        PreparedStatement pst=null;
    try{
      pst=con.prepareStatement(sql);
       }catch(SQLException ex){
      ex.printStackTrace();
       } 

    return pst;
}
           

}

以上帶緩沖區的輸入輸出流執行個體希望對初學者有所幫助,望批評指正!