1. 程式人生 > >黑馬程式設計師—JAVA IO(Buffer和Stream)

黑馬程式設計師—JAVA IO(Buffer和Stream)

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>、期待與您交流! ----------------------

輸入輸出流(I/O)分為兩類:

1、位元組流:InputStream(位元組輸入流)   OutputStream(位元組輸出流)

2、字元流:Reader(字元讀取流)   Writer(字元輸入流)

InputStream

OutputStream主要用於非文字的資料的讀寫操作

ReaderWriter主要用於文字資料的讀寫操作

與輸入輸出流相關:

讀取鍵盤錄入

 System.out:對應的是標準輸出裝置,控制檯

 System.in:對應的是標準輸入裝置,鍵盤

舉例如下:

public class ReadIn

{

         public static void main(String[] args) throws IOException

         {

                   //定義一個輸入位元組流

                   InputStream in = System.in;

                   //定義一個字串容器

                   StringBuilder sb = new StringBuilder();

                   //迴圈

                   while(true)

                   {

                            //定義一個int型來存放字元(之後會強轉)

                            int ch = in.read();

                            //如果讀到了換行符的第一個字元‘\r’

就繼續

                            //因為換行符是由兩個轉義字元\r\n組成的

                            if(ch == '\r')

                                     continue;

                            //如果讀到了換行符的第二個轉義字元'\n'

                            //就把輸入的字元轉化成字串輸出

                            if(ch == '\n')

                            {

                                     String str = sb.toString();

                                     //如果輸入的字串是over就結束輸入

                                     if(str.equals("over"))

                                               break;

                                     System.out.println(str);

                                     //輸出字串之後清空字元容器

                                     sb.delete(0, sb.length());

                            }

                            else

                                     sb.append((char)ch);

                   }

         }

}

這個例子是通過鍵盤錄入資料當錄入一行,就將該行資料進行列印如果錄入的資料是over,那麼停止錄入。

BuffeedrReaderBufferedWriter(緩衝流)

緩衝區的出現提高了對資料的讀寫效率

對應類

     BufferedWriter

      BufferedReader

緩衝區要結合流才可以使用在流的基礎上對流的功能進行了增強緩衝區的出現是為了提高流的操作效率而出現的所以在建立緩衝區之前,必須要先有流物件

字元讀取流緩衝區

該緩衝區提供了一個一次讀取一行的方法readline()方便於對文字資料的獲取

當返回null時,表示讀到的檔案末尾

   readline()方法返回的時候只返回回車符之前的資料內容,並不返回回車符

   readline()方法的原理:

無論是讀一行,獲取讀取的多個字元,其實最終都是在硬碟上一個一個讀取

所以最終使用的還是read方法一次讀一個的方法

下面是一個BufferedReader的例子,其中使用到了FileReader

public class BRDemo

{

         public static void main(String[] args)throws IOException

         {

                   //建立一個讀取流物件和檔案相關聯

                   FileReader fr = new FileReader("test.txt");

                   //為了提高效率,加入緩衝技術,將字元讀取流物件作為引數

                   //傳遞給緩衝物件的建構函式

                   BufferedReader br = new BufferedReader(fr);

                   String line = null;

                   while((line = br.readLine())!=null)

                   {

                            System.out.println(line);

                   }

                   br.close();

         }

}

明白了BufferedReader類中特有的方法readline()的原理後可以自定義一個類中包含一個功能和readline()一樣的方法來模擬一下BufferedReader

class MyBufr

{

         private FileReader fr;

         public MyBufr(FileReader fr)

         {

                   this.fr = fr;

         }

         //可以一次讀取一行資料的方法

         public String myreadline()throws IOException

         {

                   //定義一個臨時容器,原BufferedReader封裝的是字元陣列

                   //定義一個StringBuilder容器,因為最終還是要將資料變成字串

                   StringBuilder sb = new StringBuilder();

                   int ch = 0;

                   while((ch = fr.read())!=-1)

                   {

                            if(ch=='\r')

                                     continue;

                            if(ch=='\n')

                                     return sb.toString();

                            else

                                     sb.append((char)ch);

                   }

                   if(sb.length()!=0)

                            return sb.toString();

                   return null;

         }

         public void myclose()throws IOException

         {

                   fr.close();

         }

}

 class MyBR

{

         public static void main(String[] args)throws IOException

         {

                   FileReader fr = new FileReader("test.txt");

                   MyBufr m = new MyBufr(fr);

                   String line = null;

                   while((line = m.myreadline())!=null)

                   {

                            System.out.println(line);

                   }

                   m.myclose();

         }

}

要點:

1、  只要用到緩衝區都要把資料從緩衝區刷出來

2、  關閉緩衝區就是在關閉緩衝區中的流物件,所以不用再去關閉流物件

關於流的總結:

字元流:

 FileReader   FileWriterBufferedReader   BufferedWriter

位元組流

InputStream  OutputStream  BufferedInputStream     BufferedOutputStream

轉換流

InputStreamReader  OutputStreamWriter  FileInputStream  FileOutputStream

轉換流是字元和位元組之間的橋樑,通常涉及到字元編碼轉換時需要用到

轉換流

---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS開發</a>、<a href="http://edu.csdn.net"target="blank">.Net培訓</a>、期待與您交流! ----------------------