標籤:輸入/輸出流 fileoutputstream fileinputstream
第十章 資料輸入與輸出
輸入資料流與輸出資料流:
(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" />
位元組流和字元流
(1)位元組流:按照位元組的形式讀/寫資料。Java中抽象類別InputStream和OutputStream及其派生子類用來處理位元組流的輸入和輸出。
(2)字元流:按照字元的形式讀/寫資料。Java中抽象類別Reader和Writer及其派生子類用來處理字元流的輸入與輸出。
(3)系統提供用於標準輸入、輸出的System類,以及用來解析各種類型資料(如整數、浮點數、字串等)的Scanner類。
(4)雖然Java從本質上說是將輸入/輸出流分成位元組流和字元流,但並不表示只能以這兩種最低級的形式來處理輸入/輸出資料。事實上,還可以通過調用很多類的構造方法和成員方法來輸入/輸出各種類型的資料。
位元組與字元輸入/輸出流類
(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();寫入一個行分隔字元。
使用Scanner類輸入各種類型的資料
Scanner類是一個可以使用Regex來解析基本類型和字串的簡單文本掃描器。該類的重要方法如下:
(1)nextByte()、nextShort()、nextInt()、nextLong()、nextFloat()、nextDouble()、nextBoolean()等方法分別用來讀取位元組、短整型、整型、長整型、浮點數、雙精確度浮點數和布爾值等。
(2)hasNextByte()、hasNextShort()、hasNextInt()、hasNextLong()、hasNextFloat()、hasNextDouble()、hasNextBoolean()等方法分別用來判斷要讀入的資料是否是位元組、短整型、整型、長整型、浮點數、雙精確度浮點數或布爾值等。
(3)nextLine()方法用於讀取一行資料,如果已用nextByte()、nextShort()等方法讀取資料,此方法用於讀取當前行中後續資料;hasNextLine()方法用於確認是否還有下一行資料,此方法主要針對檔案,用於判斷是否到達檔案結尾處。
如果在一行中輸入多個資料,可以用空格分割各資料。
掌握檔案的讀寫與管理方法
(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學習筆記—第十章 資料輸入與輸出