Java學習筆記—第十章 資料輸入與輸出

來源:互聯網
上載者:User

標籤:輸入/輸出流   fileoutputstream   fileinputstream   

第十章  資料輸入與輸出

  1. 輸入資料流與輸出資料流:

    (1)輸入資料流:以程式為基準,向程式中輸入資料的流定義為輸入資料流。從輸入資料流向程式中輸入資料稱為讀資料(read)。

    (2)輸出資料流:以程式為基準,從程式輸出資料的流稱為輸出資料流。從程式中將資料輸出到輸出資料流稱為寫資料(write)。

    650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6B/E6/wKioL1U559bDrdRTAABay7cxCgk667.jpg" title="無標題.png" alt="wKioL1U559bDrdRTAABay7cxCgk667.jpg" />

    650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/6B/EA/wKiom1U55vLz4eWbAABaWeLqq4s763.jpg" title="無標題.png" alt="wKiom1U55vLz4eWbAABaWeLqq4s763.jpg" />

  2. 位元組流和字元流

    (1)位元組流:按照位元組的形式讀/寫資料。Java中抽象類別InputStream和OutputStream及其派生子類用來處理位元組流的輸入和輸出。

    (2)字元流:按照字元的形式讀/寫資料。Java中抽象類別Reader和Writer及其派生子類用來處理字元流的輸入與輸出。

    (3)系統提供用於標準輸入、輸出的System類,以及用來解析各種類型資料(如整數、浮點數、字串等)的Scanner類。

    (4)雖然Java從本質上說是將輸入/輸出流分成位元組流和字元流,但並不表示只能以這兩種最低級的形式來處理輸入/輸出資料。事實上,還可以通過調用很多類的構造方法和成員方法來輸入/輸出各種類型的資料。

  3. 位元組與字元輸入/輸出流類

    (1)位元組輸入資料流類InputStream:用於以位元組形式從資料來源中讀取資料。它是所有位元組輸入資料流類的父類。是一個抽象類別,不能被執行個體化。主要派生子類包括:FileInputStream(按位元組讀取檔案中的資料)、BufferedInputStream(將按位元組形式讀入的資料儲存到緩衝區)等。階層如下:

    InputStream

         ByteArrayInputStream

         FileInputStream

         FilterInputStream

               BufferedInputStream

               DataInputStream

               LineNumberInputStream

               PushbackInputStream

         ObjectInputStream

         PipedInputStream

         SequenceInputStream

         StringBufferInputStream

    其中,BufferedInputStream是一個非常有用的類,它可以緩衝輸入的資料,從而提高資料的輸入效率。其構造方法為:public BufferedInputStream(InputStream in)。其中,in可以是檔案輸入資料流或鍵盤輸入資料流。該類的幾個主要方法有:

    a. public void close():關閉此輸入資料流並釋放與該流關聯的所有系統資源。

    b. public abstract int read():從輸入資料流中讀取資料的下一個位元組。傳回值為整數,如果到達流的末尾,則返回-1。

    c. public int read(byte[] b):將從輸入資料流讀取的內容儲存在位元組數組b中。傳回值為讀入的位元組數。如果到達流末尾不再有資料可用,則返回-1。

    備忘:從鍵盤輸入資料時(即資料來源為System.in),read()方法被阻塞,直至按斷行符號鍵。如果按【Ctrl+Z】按鍵組合,表示輸入資料流結束,此時改行輸入的內容均被忽略,read()傳回值為-1。讀取檔案時(資料來源為FileInputStream類對象),如果到達檔案結尾,read()方法傳回值為-1。

    (2)位元組輸出資料流類OutputStream:用於以位元組形式將資料寫入目的地。主要派生子類包括:FileOutputStream(將資料寫入檔案)、PrintStream(用於輸出各種類型的資料,如整數、浮點數、字元、字串、布爾值等,其主要方法有print()和println())等。階層如下:

    OutputStream

          ByteArrayOutputStream

          FileOutputStream

          FilterOutputStream

                BufferedOutputStream

                DataOutputStream

                PrintStream

          ObjectOutputStream

          PipedOutputStream

    BufferedOutputStream類可以緩衝輸出的資料,提高資料輸出效率。該類的構造方法如下:

    public BufferedOutputStream(OutputStream out)

    表示建立一個新的緩衝輸出資料流,以將資料寫入指定的底層輸出資料流。

    a. public void close():關閉此緩衝輸出資料流並釋放與此流有關的所有系統資源。

    b. public void write(int b):將指定的位元組寫入此緩衝輸出資料流。

    c. public void write(byte[] b):將b.length個位元組寫入此緩衝輸出資料流。

    (3)字元輸入資料流類Reader:以字元形式從資料來源中讀取資料。主要派生子類包括:InputStreamReader(讀取位元組資料並將其解碼為字元)、FileReader(讀取字元檔案的內容)、BufferedReader(從字元輸入資料流中讀取文本,緩衝各個字元,從而實現字元、數組和行的高效讀取)等。其階層如下:

    Reader

       BufferedReader

           LineNumberReader

       CharArrayReader

       FilterReader

           PushbackReader

       InputStreamReader

           FileReader

       PipedReader

       StringReader

    其中,InputStreamReader類的構造方法為:public InputStreamReader(InputStream in);

    其主要成員方法有:

    a. public void close():關閉該流並釋放與之關聯的所有資源。

    b. public int read():讀取單個字元。

    c. public int read(char[] c):將字元讀入數組。傳回值為讀取的字元數。如果已到達末尾,則返回-1。

    BufferedReader類的構造方法為:public BufferedReader(Reader in),它用於建立一個使用預設大小輸入緩衝區的緩衝字元輸入資料流。其成員方法與InputStreamReader類似,只是新增了一個readLine()方法,其聲明方式和作用如下:

    public String readLine():讀取一個文本行。通過下列字元之一即可認為某行已終止:換行(‘\n‘)、斷行符號(‘\r‘)或斷行符號後直接跟著換行。其傳回值為包含該行內容的字串,並且不包含任何行終止符。如果已到達流末尾,則返回null。

    (4)字元輸出資料流類Writer:以字元的形式將資料寫入目的地。Writer類是所有字元輸出資料流類的父類,其主要派生子類包括:OutputStreamWriter(將字元以位元組形式寫入輸出資料流)、FileWriter(將字元資料寫入檔案)、BufferedWriter(將字元資料寫入緩衝區)、PrintWriter(格式化輸出字元資料)等子類。其階層如下:

    Writer

        BufferedWriter

        CharArrayWriter

        FilterWriter

        OutputStreamWriter

            FileWriter

        PipedWriter

        PrintWriter

        StringWriter

    其中,OutputStreamWriter類的構造方法為:public OutputStreamWriter(OutputStream out);

    其主要成員方法包括:

    a. public void close():關閉此流。

    b. public void write(int c):寫入單個字元。

    c. public void write(char[] c):寫入字元數組。

    d. public void write(String str):寫入字串。

    BufferedWriter類的構造方法為:public BufferedWriter(Writer out);其主要成員方法包括:

    a. public void close();關閉流。

    b. public void write(int c);寫入單個字元。

    c. public void write(char[] c);寫入字元數組。

    d. public void write(String str);寫入字串。

    e. public void newLine();寫入一個行分隔字元。

  4. 使用Scanner類輸入各種類型的資料

    Scanner類是一個可以使用Regex來解析基本類型和字串的簡單文本掃描器。該類的重要方法如下:

    (1)nextByte()、nextShort()、nextInt()、nextLong()、nextFloat()、nextDouble()、nextBoolean()等方法分別用來讀取位元組、短整型、整型、長整型、浮點數、雙精確度浮點數和布爾值等。

    (2)hasNextByte()、hasNextShort()、hasNextInt()、hasNextLong()、hasNextFloat()、hasNextDouble()、hasNextBoolean()等方法分別用來判斷要讀入的資料是否是位元組、短整型、整型、長整型、浮點數、雙精確度浮點數或布爾值等。

    (3)nextLine()方法用於讀取一行資料,如果已用nextByte()、nextShort()等方法讀取資料,此方法用於讀取當前行中後續資料;hasNextLine()方法用於確認是否還有下一行資料,此方法主要針對檔案,用於判斷是否到達檔案結尾處。

    如果在一行中輸入多個資料,可以用空格分割各資料。

  5. 掌握檔案的讀寫與管理方法

    (1)檔案位元組輸入/輸出流:指FileInputStream和FileOutputStream類,這兩個類實現了對檔案的順序訪問,並以位元組為單位進行讀/寫操作。Java中,對檔案的讀/寫操作主要步驟是:①.建立檔案輸入/輸出流對象,此時檔案自動開啟或建立;②.用檔案讀寫方法讀寫資料;③.關閉資料流,同時關閉了檔案。

    a. FileInputStream類:構造方法如下:

    FileInputStream(String name)

    FileInputStream(File file)

    其中,name表示要開啟的檔案名稱,file表示檔案類File的對象。例如:

    //建立檔案輸入資料流對象,同時開啟檔案

    FileInputStream fis = new FileInputStream("d:\\test.txt");

    如果沒有找到要開啟的檔案,系統會拋出FileNotFoundException異常。

    b. FileOutputStream類:將資料寫入檔案,構造方法如下:

    FileOutputStream(String name)

    FileOutputStream(String name,boolean append)

    FileOutputStream(File file)

    其中,在FileOutputStream(String name)構造方法中,name表示要建立並開啟的檔案名稱;在FileOutputStream(String name,boolean append)構造方法中,參數append的值為true時,表示在原檔案的尾部添加資料,否則將覆蓋原檔案的內容;在FileOutputStream(File file)構造方法中,file表示檔案類File對象。例如:

    //建立File類對象file

    File file = new File("d:\\test.txt");

    //基於File類對象file建立檔案輸出資料流類對象fos,建立d:\\test.txt對象

    FileOutputStream fos = new FileOutputStream(file);

    備忘:FileInputStream類和FileOutputStream類繼承了InputStream和OutputStream類的read()方法和write()方法,以便可以對開啟的檔案進行讀/寫操作。輸入/輸出流的程式都會拋出非運行時異常IOException,因此,必須在方法的聲明處進行拋出,或者使用try-catch語句進行捕獲。為了避免系統資源的浪費,當不再使用流時,需要使用close()方法關閉流,實際上就是關閉檔案。

    (2)檔案字元輸入/輸出流

    FileReader(File file)

    FileReader(String filename)

    FileWriter(String finename)

    FileWriter(String filename,boolean append)

    FileWriter(File file)

    FileWriter(File file,boolean append)

    其中,file是檔案類File的對象;filename是要開啟的檔案名稱;當參數append值為true時,表示在原     檔案的末尾添加資料,否則將覆蓋原檔案的內容。

    (3)利用File類管理檔案

    Java中File類既可以表示檔案又可以表示目錄,它提供了操作檔案或目錄的一組方法。

    a. 構造方法;

    File(String pathname):通過將給定的路徑字串轉換為抽象路徑名來建立一個新File執行個體。

    File(String parent,String child):根據parent路徑名字串和child路徑名字串建立一個新File執行個體。

    File(File parent,String child):根據parent抽象路徑名和child路徑名字串建立一個新File執行個體。

    備忘:抽象路徑名實際上是一個字串,它以"盤符:"開始,後面跟"\\路徑名或檔案名稱",其中,中間名稱均表示目錄,最後一個名稱可以表示目錄或檔案。另外,抽象路徑中的路徑部分被稱為父目錄(parent)。由於"\\"是一個逸出字元,所以"\\"實際上表示"\"。

    b. 查詢檔案名稱和路徑名

    public String getName():返回此抽象路徑名表示的檔案或目錄的名稱。

    public String getPath():將此抽象路徑名轉換為一個路徑名字串。

    public String getAbsolutePath():返回此抽象路徑名的絕對路徑名字串。

    public String getParent():返回此抽象路徑名父目錄的路徑字串。如果此路徑名沒有指定父目錄,則返回null。

    c. 抽象路徑查詢

    public boolean exists():測試此抽象路徑名表示的檔案或目錄是否存在。如果存在,返回true;否則,返回false。

    public boolean isDirectory():測試此抽象路徑名表示的是否是一個目錄。如果是返回true;否則返回false。

    public boolean isFile():測試此抽象路徑名表示的是否是一個標準檔案。如果是返回true;否則返回false。

    public boolean isHidden():測試此抽象路徑名表示的是否是一個隱藏檔案。如果是返回true;否則返回false。

    d. 檔案與目錄操作

    public boolean createNewFile():若且唯若不存在此抽象路徑名指定的檔案時,建立一個新的空檔案。如果指定的檔案不存在且建立成功,返回true;否則返回false。

    public boolean mkdir():建立此抽象路徑名指定的目錄。如果建立成功,返回true;否則返回false。如果路徑名有多層,必須確保前面路徑有效。例如,嘉定File對象的內容為"c:\\abc\\xyz",則要調用mkdir()方法來建立xyz目錄,必須首先確保"c:\abc"目錄是存在的。唯有如此,才能在"c:\abc"目錄下建立目錄xyz。

    public boolean delete():刪除此抽象路徑名表示的檔案或目錄。如果此抽象路徑名表示一個目錄,則該目錄必須為空白才能刪除。若且唯若成功刪除檔案或目錄時,返回true;否則返回false。

    public String[] list():列出此抽象路徑名表示的目錄中的檔案和目錄。如果此抽象名表示的不是一個目錄,那麼此方法將返回null;否則將返回一個字串數組,每個數組元素對應目錄中的一個檔案或目錄。

    (4)使用RandomAccessFile類隨機讀寫檔案

    位元組輸入/輸出流和字元輸入/輸出流都是順序讀/寫檔案的,而RandomAccessFile類提供了隨機訪問檔案的方法。RandomAccessFile類與輸入/輸出流類有兩個不同點:

    a. RandomAccessFile類直接繼承了對象類Object,同時實現了DataInput介面和DataOutput介面,所以RandomAccessFile類既可以作為輸入資料流,也可以作為輸出資料流。

    b. RandomAccessFile類定義了一個檔案當前位置指標,檔案的讀取都是從檔案當前位置指標指示的位置開始的。通過移動這個指標,就可以從檔案的任何位置開始進行讀/寫操作。與此同時,系統在從檔案中讀取資料或向檔案中寫入資料時,位置指標會自動移動。

    c. 構造方法

    RandomAccessFile(File file,String mode)

    RandomAccessFile(String name,String mode)

    其中,file是一個檔案對象;mode是訪問方式,有三個值:r(讀)、w(寫)、rw(讀寫)。例如下面語句建立了隨機存取檔案對象rd,檔案名稱為a.txt,檔案屬性為唯讀。

    RandomAccessFile rd = new RandomAccessFile("a.txt",r);

    d. 常用方法

    public long getFilePointer():返迴文件指標的位置;

    public long length():返迴文件的長度;

    public void seek(long pos):將檔案指標移到pos位置;

    public int skipBytes(int n):使檔案指標跳過n個位元組;

    public void close():關閉此隨機訪問檔案流並釋放與該流關聯的所有系統資源;

    public int read():從此檔案中讀取一個資料位元組。以整數形式返回此位元組,返回在0到255之間;

    public int read(byte[] b):將最多b.length個資料位元組從此檔案讀入byte數組;

    public final char readChar():從此檔案當前指標處讀取一個字元(兩個位元組);

    public final double readDouble():從此檔案當前指標處讀取一個Double型資料(8個位元組);

    public final float readFloat():從此檔案當前指標處讀取一個Float型資料(4個位元組);

    public final int readInt():從此檔案當前指標處讀取一個有符號的32位整數(4)個位元組。類似的,系統提供了readLong()方法(8個位元組),readShort()方法(2個位元組)等;

    public void write(int b):從檔案當前指標位置開始,向檔案寫入指定的位元組;

    public void write(int[] b):從當前檔案指標位置開始,將b.length個位元組從指定byte數組寫入檔案;

    


Java學習筆記—第十章 資料輸入與輸出

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.