Java的I/O技術

  程序中,爲了永久的保存創建的數據,需要將其保存在磁盤文件中,以便在其它程序中使用它們。Java的I/O技術可以將數據保存到文本文件、二進制文件甚至是ZIP壓縮文件中,以達到永久性保存數據的要求。

  本篇我們要介紹的內容就是Java的I/O技術,即輸入/輸出。

一、輸入/輸出流

  流是一組有序的數據序列,根據操作的類型,可分爲輸入流和輸出流。

  而專門負責各種方式的輸入、輸出的類,都被放在java.io包中。所有輸入流都是抽象類InputStream(字節輸入流)或抽象類Reader(字符輸入流)的子類;所有輸出流都是抽象類OutputStream(字節輸出流)或抽象類Writer(字符輸出流)的子類。

  1. 字節輸入/輸出流

  下面是一個字節輸入/輸出流的實例。其中,第14行爲從輸入流中讀取字節並存入buffer數組中,最長讀取2500個字節,返回值b爲實際讀取的長度。

複製代碼
 1 import java.io.File;  
 2 import java.io.FileInputStream;  
 3 import java.io.FileOutputStream;  
 4   
 5 public class IOExample {  
 6     public static void main(String[] args) {  
 7         try {  
 8             int b;  
 9             File file = new File("E:\\test.txt");      // 創建一個文件
10            
11             FileInputStream readfile = new FileInputStream(file);   // 創建輸入流     
12 
13             byte buffer[] = new byte[2500];        // 創建字節數組  
14             b = readfile.read(buffer, 1, 2000);    // 1爲buffer數組中的起始偏移量  
15             String str = new String(buffer, 0, b, "Default");  
16             System.out.println(str);  
17             readfile.close();     // 關閉流  
18 
19             FileOutputStream writefile = new FileOutputStream(file, true);      // 創建一個輸出流,true爲保留原有數據,新數據追加至結尾
20             writefile.write(buffer, 0, b);  
21             writefile.close();  
22         } catch (Exception e) {  
23             e.printStackTrace();  
24         }  
25     }  
26 }      
複製代碼

   上述代碼中的FileInputStream類和FileOutputStream類屬於文件輸入輸出流,該類分別繼承自InputStream類和OutputStream類。

  InputStream類常用方法需瞭解read()、close()、reset()等方法;OutputStream類常用方法需瞭解write()、flush()、close()等方法。具體可參照API。

  2. 字符輸入/輸出流

  下面是一個字符輸入/輸出流的實例。

複製代碼
 1 import java.io.FileReader;  
 2 import java.io.FileWriter;  
 3   
 4 public class IOExample {  
 5     public static void main(String[] args) {  
 6         try {  
 7             FileReader fileread = new FileReader("E:\\test.txt");                    // 字符輸入流,讀取文件信息    
 8 
 9             char[] cbuf = new char[500];  
10             int b = fileread.read(cbuf, 0, 500);  
11             System.out.println(String.valueOf(cbuf));  
12             fileread.close();  
13 
14             FileWriter filewriter = new FileWriter("E:\\test.txt", true);             // 字符輸出流,向輸出流中寫入信息,並且保留原有數據,追加數據值末尾處 
15             filewriter.write(cbuf);  
16             filewriter.close();  
17         } catch (Exception e) {  
18             e.printStackTrace();  
19         }  
20     }  
21 }  
複製代碼

  上述代碼中的FileReader類和FileWriter類也屬於文件輸入輸出流。

  3. 文件輸入/輸出流

  上面的代碼中出現了一個新的名詞叫文件輸入/輸出流,也就是FileInputStream、FileOutputStream和FileReader、FileWriter。它們的作用是與指定的文件建立連接,將需要的數據永久保存到文件中。

  FileInputStream類和FileOutputStream類都是用來操作磁盤文件的,如果用戶的文件讀取比較簡單,則可使用該類。但由於漢字在文件中佔用兩個字節,讀取不好可能出現亂碼現象。

  FileReader類和FileWriter類可避免亂碼現象,分別對應了FileInputStream類和FileOutputStream類。

二、File類

  File類是io包中唯一代表磁盤文件本身的對象,可以通過調用File類中的方法,實現創建、刪除、重命名文件等。

  1. 文件的創建與刪除

  可以使用File類創建一個文件對象,三種構造方法的語法格式如下:

new File(String pathname)
new File(String parent, String child)
new File(File f, String child)

   pathname是路徑名稱,parent是父路徑字符串,child是子路徑字符串,f是父路徑對象。如下例:

File file = new File("E:/test.txt");
File file = new File("E:/myword","word.txt");

  如果E:/myword目錄下沒有名稱爲word的文件,File類對象可通過createNewFile()方法創建一個名稱爲word.txt的文件;如果存在,可通過delete()方法將其刪除。

  2. 獲取文件信息

  File類提供了許多方法用於獲取文件本身的一些信息,下表是一些常用方法。

方法 說明
getName() 獲取文件的名稱
canRead() 判斷文件是否可讀
canWrite() 判斷文件是否可以被寫入
exist() 判斷文件是否存在
length() 獲取文件的長度
getAbsolutePath() 獲取文件的絕對路徑
getParent() 獲取文件的父路徑
isFile() 判斷文件是否存在
isDirectory() 判斷文件是否是一個目錄
isHidden() 判斷文件是否是隱藏文件
lastModifed() 獲取文件最後修改時間

  如我們創建一個文件,獲取文件長度等信息如下:

複製代碼
 1 import java.io.File;
 2 
 3 public class FileTest {
 4 
 5     public static void main(String[] args) {
 6         File file = new File("E:/myword", "word.txt");    // 創建文件對象
 7         if(file.exists()) {    // 判斷文件是否存在
 8             String name = file.getName();    // 獲取文件名稱
 9             long length = file.length();    // 獲取文件長度
10             boolean hidden = file.isHidden();    // 判斷文件是否是隱藏文件
11             
12             System.out.println("文件名稱:" + name);
13             System.out.println("文件長度是:" + length);
14             System.out.println("是否是隱藏文件:" + hidden);
15         } else {
16             System.out.println("文件不存在");
17         }
18     }
19 
20 }
複製代碼

三、帶緩存的輸入/輸出流

  緩存是I/O的一種性能優化。緩存流爲I/O流增加了內存緩存區。

  1. BufferedInputStream類與BufferedOutputStream類

  構造函數如下:

BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)
BufferedOutputStream(OutputStream in)
BufferedOutputStream(OutputStream in, int size)

  2. BufferedReader類與BufferedWriter類

  常用方法如下:

方法 說明
read() 讀取單個字符
readLine() 讀取一個文本行,返回爲字符串;若無數據則返回爲null
write(String s, int off, int len) 寫入字符串的某一部分
flush() 刷新該流的緩存
newLine() 寫入一個行分隔符

  這裏要注意,在使用BufferedWriter類的write()方法時,數據並沒有立刻被寫入到輸出流時,而是首先進入緩存區中,如果想立刻將緩衝區中的數據寫入輸出流中,一定要調用flush()方法。 

四、數據輸入/輸出流

  數據輸入/輸出流爲DataInputStream類與DateOutputStream類,允許應用程序以與機器無關的方式從底層輸入流中讀取基本Java數據類型。

  構造方法如下:

DataInputStream(InputStream in)
DataOutputStream(OutputStream out)

  DataOutputStream類提供了以下三種寫入字符串的方法:

writeBytes(String s)
writeChars(String s)
writeUTF(String s)

五、ZIP壓縮輸入/輸出流

  利用ZipOutputStream類對象,可將文件壓縮爲.zip文件。

  構造函數如下:

ZipOutputStream(OutputStream out);

  ZipInputStream類可讀取ZIP壓縮格式的文件,包括對已壓縮和未壓縮條目的支持。

  構造函數如下:

ZipInputStream(InputStream out);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章