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的輸入和輸出幾乎是對應的,每種基本數據類型的讀寫方法可以從其後綴名字識別.例如:
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(),代表文件的結尾.