Java-輸入輸出資料流,java-輸入輸出
JAVA-輸入輸出資料流
1、輸入輸出:
輸入/輸出(Input/Output)是指對某個裝置或環境進行資料的輸入或輸出.任何語言都有輸入輸出的功能,在Java程式中,是通過流來完成輸入和輸出的,它通過Java輸入輸出系統串連到物理裝置,雖然輸入輸出資料流所串連的實際物理裝置並不一樣,但卻可以以同一種方式工作.例如對硬碟的輸入輸出,對網路主機進行輸入輸出,因此裝置或者環境的不同會有各式各樣的輸入輸出的問題與解決方案.
2、流:
流是指在電腦的輸入與輸出之間運動的資料序列.流序列中的資料既可以是未經加工的原始的位元據,也可以是經一定編碼處理後符合某種格式規定的特定資料.習慣上稱代碼相關的部分為內部,稱與代碼無關的部分為外部.
從資料的傳輸方式劃分,流可分為輸入資料流和輸出資料流;從流的內容上劃分,流可分為位元組流和字元流.
(1) 輸入輸出資料流
輸入資料流的作用是從程式內部向外部讀取資料.
輸出資料流的作用是從程式外部向內部寫入資料.
(2) 位元組流和字元流
位元組流(byte stream)對資料以位元組為單位進行讀寫,既可以一個位元組接一個位元組的讀寫資料,也可以一次讀寫任意長度的位元組塊(即位元組數組).
字元流(character stream)在讀寫流內資料時是以字元為單位,一次一個字元,或者一次一個字元塊.
為了方便流的處理,Java語言的流都封裝在java.io包中,所以要使用流,必須匯入java.io包.
Java的I/O流是建立在四個抽象類別的基礎上,分別是InputStream, OutputStream, Reader和Writer.InputStream類及其子類可用於實現位元組流資料的輸入處理;OutputStream類及其子類可用於實現位元組流資料的輸出處理;Reader類及其子類可用於實現字元流資料的輸入處理;Writer類及其子類可用於實現字元流資料的輸出處理.
一、File類
Java中對檔案的讀寫操作可以通過輸入輸出資料流來實現,但對於檔案目錄、屬性以及管理等資訊Java提供了一個專門的File類來實現.
(1) File類的構造方法
建立一個File類對象的構造方法有:
File (String pathname); //根據路徑名建立.
File (File parent, String child); //在給定File對象下建立.
File (String parent, String child); //根據指定路徑下建立.
File (URL url); //根據一個URL連結建立.
(2) File類的常用方法
boolean canRead():判斷File對象對應的路徑是否可讀.
boolean canWrite():判斷File對象對應的路徑是否可寫.
boolean exists():判斷File對象對應的路徑是否存在.
String getAbsolutePath():擷取File對象對應路徑的絕對路徑.
String getParent():擷取File對象對應路徑的目錄.
String getPath():擷取File對象對應的路徑.
boolean isAbsolute():判斷File對象對應的路徑是否為絕對路徑.
String getName():擷取File對象對應路徑的檔案名稱.
boolean isDirectory():判斷File對象對應的路徑是否為目錄.
boolean isFile():判斷File對象對應的路徑是否為檔案.
boolean isHidden():判斷File對象對應的檔案是否為隱藏屬性.
long length():獲得File對象對應檔案的長度.
long lastModified():獲得File對象對應檔案的最近修改時間.
boolean renameTo(File dest):更改File對象對應檔案的檔案名稱.
boolean setReadOnly():設定File對象對應檔案為唯讀.
(3) 建立檔案
通過建立一個檔案輸出資料流來建立一個新檔案.這種方式不能建立目錄,並且如果要建立的檔案已存在,會建立一個檔案覆蓋原檔案.
FileOutrputStream file = new FileOutputStream(“filename”);
(4) 獲得檔案清單
通過File類的list()或listFiles()方法獲得某個檔案夾的檔案清單.有以下幾種形式:
String[] list();
File[] listFiles();
File[] listFiles(FilenameFilter filter);
File[] listFiles(FileFilter filter);
其中,FileFilter和FilenameFilter都是介面,filter為相應的過濾器.聲明某個類,實現過濾器介面,便可以通過過濾條件來列出所有符合的檔案.
二、InputStream類和OutputStream類
位元組流類是從抽象類別InputStream和OutputStream派生出來的一系列類.這類流以位元組為基本處理單位.InputStream 和 OutputStream類除了可以用來處理二進位檔案的資料之外,也可以用來處理文字檔.
1、InputStream類的常用方法
InputStream類是所有輸入資料流的父類,該類的所有方法在錯誤發生時都會拋出IOException,主要的方法有:
(1) public abstract int read() thows IOException
方法返回一個0至255之間的整數或-1, -1代表遇到了流的結束,其它對應讀入的位元組.
(2) public int read(byte[]b) thows IOException
方法將位元組讀入參數給定的位元組數組,傳回值是實際讀入的位元組數或-1(遇到了流結束).
(3) public int read(byte[]b, int i, int b) thows IOException
方法的後兩個參數分別給出讀入的起始位置和讀入的最大位元組數.
(4) public int available()
返回當前流對象中還沒有被讀取的位元組數量.也就是獲得流中資料的長度.
(5) public long skip(long n)
跳過當前流對象中的n個位元組,而實際跳過的位元組數量則以傳回值的方式返回.
(6) public boolean markSupported()
判斷流是否支援標記(mark),標記可以方便的回到原來讀過的位置.
(7) public void close()
關閉當前流對象,並釋放該流對象佔用的資源.
(8) public void mark(int i)
為流中當前的位置設定標誌,使得以後可以從該位置繼續讀取.
(9) public void reset()
使流讀取的位置回到設定標記的位置.
2、OutputStream類的常用方法
OutputStream類是所有輸出資料流的父類,該類所有方法都返回void,並且在錯誤情況下拋出IOException,主要的方法有:
(1) public void write(int b) throws IOException
向流的末尾寫入一個位元組的資料.
(2) public void write(byte[] b) throws IOException
將數組b中的資料依次寫入當前的流對象中.
(3) public void wirte(byte[]b, int i, int n)
將數組中從開始下標(包含),後續長度的資料依次寫入到流對象中.
(4) public void close()
關閉當前流對象,並釋放該流對象佔用的資源.
(5) public void flush()
將當前流對象中的緩衝資料強制輸出出去.使用該方法可以實現立即輸出.
上面兩個類的大多數方法由InputStream和OutputStream的子類覆蓋,mark()和reset()方法除外.
3、FileInputStream類
FileInputStream類是InputStream的子類,可以用來處理以檔案作為資料輸入源的資料流,實現檔案的讀取操作.
它的構造方法有:
(1) FileInputStream(File f)
以指定名字的檔案對象f為資料來源建立檔案輸入資料流.
如果f存在的話但是它應是一個檔案路徑,如果是目錄則會拋出IOException,但是如果是這個目錄不存在的時候則會拋出:FileNotFoundException.
(2) FileInputStream(String name)
以名為name的檔案為資料來源建立檔案輸入資料流.
(3) FileInputStream(FileDescriptor f)
根據檔案描述符對象f為輸入端建立一個檔案輸入資料流.
它的主要方法是覆蓋了父類(InputStream類)的方法:read()、read(byte[]b)、read(byte[]b , int i, int length)、skip(long n)、available()、close().
4、FileOutputStream類
FileOutputStream類是OutputStream的子類,用來處理以檔案作為資料輸出的資料流,實現對檔案的寫入操作.它的構造方法有:
FileOutputStream(File f);
FileOutputStream(File f, boolean b);
FileOutputStream(String f);
它的主要的方法有覆蓋父類的方法:write(int b)、write(byte[]b)、write(byte[]b,int off,int len)、close()、flush().
5、DataInputStream和DataOutputStream類
DateInputStream和DataOutputStream類建立的對象分別被稱為資料輸入流和資料輸出資料流.它們分別實現了DataInput介面和DataOutput介面.DateInputStream類和DataOutputStream對象允許讀取Java各種類型的資料.
這兩個流屬於過濾流,常以其它流如InputStream或OutputStream作為它們的輸入或輸出.例如:
FileInputStream fis = new FileInputStream("d:\\a.txt");
DataInputStream dis = new DataInputStream(fis);
FileOutputStream fos = new FileOutputStream("d:\\a.txt");
DataOutputStream dos = new DataOutputStream(fos);
DateInputStream和DataOutputStream的輸入和輸出幾乎是對應的,每種基礎資料型別 (Elementary Data Type)的讀寫方法可以從其尾碼名字識別.例如:
readInt(),writeInt() // 讀寫一個int值
readBoolean(),writeBoolean() // 讀寫一個布爾值
readChar(),writeChar() // 讀寫一個字元
readDouble(),writeDouble() // 讀寫一個雙精確度浮點值
readFloat(),writeFloat() // 讀寫一個單精確度浮點值
WriteChars() // 寫一個字串,但沒有直接讀字串的方法
三、Reader類和Writer類
Java中的字元使用的是Unicode編碼,每個字元佔有兩個位元組,即16bit.字元流是以16位的Unicode碼錶示的字元為基本處理單位,進行文本資料的讀寫,可以實現Java程式中的內部格式和文字檔、顯示輸出、鍵盤輸入等外部格式之間的轉換.這種方法尤其適合漢字的操作.如果漢字以位元組形式操作,有可能輸出亂碼.
Reader和Writer是java.io包中所有字元流的抽象父類,定義了實現其他流類的關鍵方法.其中兩個最重要的是read()和write(),它們分別進行字元資料的讀和寫.Reader及Writer類和它們子類的方法,與InputStream類和OutputStream類及它們子類的使用方法非常類似.只不過其中的參數換成字元或字元數組.
1、Reader類和Writer類的常用方法
Reader類是個抽象類別,該類的所有方法在錯誤條件下都會拋出IOException異常.常用方法如下:
(1) abstract void close():關閉輸入源.
(2) void mark(int numChars):放置一個標記到輸入源的當前點.
(3) boolean markSupported():如果這個流支援mark/reset方法,將返回true.
(4) int read():讀取單個字元.
(5) int read(char[] buf):讀字元讀入到字元數組.
(6) abstract int read(char[] buf, int offset, int numChars): 將字元讀入數組的某一部分.
(7) boolean ready():如果下一個輸入請求不必等待,返回true,否則返回false.
(8) void reset():重設輸入指標到前面設定的標記.
(9) long skip(long numChars):跳過n個字元輸入,返回實際跳過的字元數.
Writer類也是個抽象類別,常用方法如下:
(1) abstract void close():關閉輸出資料流.
(2) abstract void flush():確定輸出狀態以便清空任何緩衝.
(3) void write(int ch):寫入單個字元.
(4) void write(char[] buf):寫入字元數組.
(5) abstract void write(char[] buf, int offset, int numChars):寫入字元數組的一部分.
(6) void write(String str):寫入字串.
(7) void write(String str, int offset, int numChars):寫入字串的一部分.
2、FileReader類
FileReader類是繼承自InputStreamReader類,而InputStreamReader類又繼承自Reader類,因此Reader類與InputStreamReader類所提供的方法均可供FileReader類所建立對象使用.FileReader的構造方法有:
FileReader(File file);
FileReader(FileDescriptor e );
FileReader(String filename);
3、FileWriter類
FileWriter類繼承自OutputStreamWriter類,而OutputStreamWriter類又繼承自Writer類,因此Writer類與OutputStreamWriter類所提供的方法均可供FileWriter類所建立對象使用.FileWriter的構造方法有:
FileWrite(File filePath);
FileWrite(File f, boolean append);
FileWrite(FileDescriptor e);
FileWrite(String filename);
FileWrite(String filename,boolean append);
4、BufferedReader類
BufferedReader類繼承自Reader類,BufferedReader類是用來讀取緩衝區裡的資料.BufferedReader類屬於過濾流,常以其它流如FileReader作為它們的輸入或輸出.它的構造方法有:
BufferedReader(Reader in);
BufferedReader(Reader in, int bufSize);
例如:
FileReader fr=new FileReader("d:\1.txt");
BufferedReader buf = new BufferedReader(fr);
BufferedReader提供了readerLine()方法用來讀取文本每一行.
5、BufferedWriter類
BufferedWriter類繼承自Writer類,BufferedWriter類是用來將資料寫入到緩衝區裡.使用BufferedWriter類與使用BufferedReader類過程相似.不同的是,緩衝區內的資料最後必須要用flush()方法將緩衝區清空,也就是將緩衝區中的資料全部寫到檔案內.它的構造方法有:
BufferedWriter(Writer out);
BufferedWriter(Writer out, int bufSize);
四、RandomAccessFile類
Java中的隨機檔案訪問需要用到RandomAccessFile類(該類允許從任意位置訪問,不僅能讀取,而且能寫入),它直接從Object類繼承,並實現介面DataInput和DataOutput.
由於RandomAccessFile類實現了DataInput和DataOutput介面中所定義的所有方法,能夠從檔案中讀取基本類型的資料,也能向檔案寫入基本類型的資料.除了DataInput和DataOutput介面中定義的方法以外,RandomAccessFile類還定義了其他的一些方法來支援隨機訪問.
RandomAccessFile類建立的流與前面的輸入、輸出資料流不同,RandomAccessFile類既不是輸入資料流類InputStream類的子類,也不是輸出資料流類OutputStram類的子類流.但是RandomAccessFile類建立的流的指向既可以作為源也可以作為目的地,換句話說,當對一個檔案進行讀寫操作時,可以建立一個指向該檔案的RandomAccessFile流即可,這樣既可以從這個流中讀取這個檔案的資料,也通過這個流寫入資料給這個檔案.
RandomAccessFile類的兩個構造方法:
(1) RandomAccessFile(String name, String mode)
參數name 用來確定一個檔案名稱,給出建立的流的源(也是流目的地),參數mode取r(唯讀)或rw(可讀寫),決定建立的流對檔案的訪問權利.
(2) RandomAccessFile(File file, String mode)
參數file 是一個File對象,給出建立的流的源(也是流目的地),參數mode取r(唯讀)或rw(可讀寫),決定建立的流對檔案的訪問權利.建立對象時應捕獲FileNotFoundException異常;當流進行讀寫操作時,應捕獲IOException異常.
對象RandomAccessFile讀寫資訊的方法同資料輸入輸出對象的方法相同,它可以訪問類DataInputStream和DataOutputStream中的所有read()、write()方法.
移動檔案讀寫指標的方法:
(1) long getFilePointer():返迴文件指標的當前位置.
(2) void seek(long pos):將檔案指標置於指定的絕對位置.位置值以從檔案開始處的位元組位移量pos來計算,pos為0代表檔案的開始.
(3) long length():返迴文件的長度.位置值為length(),代表檔案的結尾.