1. 程式人生 > >Java語言基礎36-40--輸入流和輸出流

Java語言基礎36-40--輸入流和輸出流

輸入流和輸出流

輸入、輸出流提供一條通道程式,可以使用這條通道讀取源中的資料或把資料傳送到目的地。

把輸入流的指向稱作,程式從指向源的輸入流中讀取源中的資料;

而輸出流的指向是資料要去的一個目的地,程式通過向輸出流中寫入資料把資料傳送到目的地。

 

1. File類

File物件主要用來獲取檔案本身的一些資訊,不涉及對檔案的讀寫操作。

建立一個File物件的構造方法有3個:

   File(String filename);

   File(String directoryPath,String filename);

   File(File f, String filename);

 

1.1. 檔案的屬性

File類的下列方法獲取檔案本身的一些資訊。 

public String getName() 獲取檔案的名字。

public boolean canRead() 判斷檔案是否是可讀的。

public boolean canWrite() 判斷檔案是否可被寫入。

public boolean exits() 判斷檔案是否存在。

public long length() 獲取檔案的長度(單位是位元組)。

public String getAbsolutePath() 獲取檔案的絕對路徑。

public String getParent() 獲取檔案的父目錄。

public boolean isFile() 判斷檔案是否是一個普通檔案,而不是目錄。

public boolean isDirectroy() 判斷檔案是否是一個目錄。

public boolean isHidden() 判斷檔案是否是隱藏檔案。

public long lastModified() 獲取檔案最後修改的時間。

 

1.2. 檔案的建立與刪除

當使用File類建立一個檔案物件後,例如

        File file=new File("c:\\myletter","letter.txt");

◆ 如果c:\myletter目錄中沒有名字為letter.txt檔案,檔案物件file呼叫方法  public boolean createNewFile();可以在c:\myletter目錄中建立一個名字為letter.txt的

◆ 檔案物件呼叫方法  public boolean delete()可以刪除當前檔案,例如:

   file.delete();  

 

1.3. 目錄

1.建立目錄 public boolean mkdir()

2.列出目錄中的檔案 

◆ public String[] list() 用字串形式返回目錄下的全部檔案。

◆ public File [] listFiles() 用File物件形式返回目錄下的全部檔案。 

◆ public String[] list(FilenameFilter obj) 用字串形式返回目錄下的指定型別的所有檔案。

◆ public File [] listFiles(FilenameFilter obj) 用File物件形式返回目錄下的指定型別所有檔案。

   上述兩方法的引數FilenameFilter是一個介面,該介面有一個方法:

    public boolean accept(File dir,String name); 

 

2. 位元組流與字元流

java.io包提供了大量的流類,Java把InputStream抽象類的子類建立的流物件稱作位元組輸入流、OutputStream抽象類的子類建立的流物件稱作位元組輸出流,Java把Reader抽象類的子類建立的流物件稱作字元輸入流、Writer抽象類的子類建立的流物件稱作字元輸出流

針對不同的源或目的地,java.io包為程式提供了相應的輸入流或輸出流,這些輸入、輸出流絕大部分都是InputStream、OutputStream、Reader或Writer的子類。

 

2.1. InputStream類與OutputStream類

InputStream類提供的read方法以位元組為單位順序地讀取源中的資料,只要不關閉流,每次呼叫read方法就順序地讀取源中的其餘內容,直到源的末尾或輸入流被關閉。

InputStream類有如下常用的方法。

    int read() 

    int read(byte b[ ]) 

    int read(byte b[ ], int off, int len)

    void close()

    long skip(long numBytes) 

OutputStream流以位元組為單位順序地寫檔案,只要不關閉流,每次呼叫write方法就順序地向目的地寫入內容,直到流被關閉。

OutputStream類有如下的常用的方法。

      void write(int n)

       void write(byte b[ ])

       void write(byte b[ ], int off, int len)

       void close()

 

2.2. Reader類與Writer類

1.Reader類提供的read方法以字元為單位順序地讀取源中的資料。

   int read():

   int read(char b[]):

   int read(char b[], int off, int len):

   void close():

   long skip(long numBytes):

2. Writer流以字元為單位順序地寫檔案,每次呼叫write方法就順序地向目的地寫入內容。 Writer類有如下常用的方法。

    void write(int n):  向輸出流寫入一個字元。

    void write(char b[]):  向輸出流寫入一個字元陣列。

    void write(char b[],int off,int length):  從給定字元陣列中起始於偏移量off處取len個字元寫到輸出流。

    void close():  關閉輸出流。

 

2.3. 關閉流

流都提供了關閉方法close(),儘管程式結束時會自動關閉所有開啟的流,但是當程式使用完流後,顯式地關閉任何開啟的流仍是一個良好的習慣。

通過呼叫close()方法,可以保證作業系統把流緩衝區的內容寫到它的目的地,即關閉輸出流可以把該流所用的緩衝區的內容沖洗掉。   

 

3. 檔案位元組流

由於應用程式經常需要和檔案打交道,所以InputStream專門提供了讀寫檔案的子類:FileInputStream和FileOutputSream類。如果程式對檔案的操作比較簡單,比如只是順序地讀寫檔案,那麼就可以使用FileInputStream和FileOutputSream類建立的流對檔案進行讀寫操作。 

3.1. 檔案位元組輸入流

1.建立檔案位元組輸入流 

   FileInputStream類建立的物件被稱作檔案位元組輸入流。 

 ◆構造方法:

    FileInputStream(String name);

    FileInputStream(File file); 

 ◆讀取一個名為hello.txt的檔案,建立一個檔案輸入流物件,如下所示:

     try { FileInputStream in = new FileInputStream("hello.txt"); 

        }

       catch (IOException e) {

             System.out.println("File read error:"+e );

         } 

2.read方法以位元組為單位讀檔案

    int read(); 

       int read(byte b[]);

       int read(byte b[],int off,int len);  

3.2. 檔案位元組輸出流

1.建立檔案位元組輸出流 

   FileOutputStream類建立的物件被稱作檔案位元組輸出流。 

構造方法:

     FileOutputStream(String name)

     FileOutputStream(File file) 

2.以位元組為單位寫檔案

   FileOutputStream流的目的地是檔案,所以檔案輸出流呼叫write(byte b[ ])方法把位元組寫入到檔案。

 

4. 檔案字元流

位元組輸入流和輸出流的read和write方法使用位元組陣列讀寫資料,即以位元組為基本單位處理資料。因此,位元組不能很好的操作Unicode字元,例如,一個漢字在檔案中佔用了2個位元組,如果使用位元組流,讀取不當就可能會出現“亂碼”現象。

1.FileReader和FileWriter用來建立檔案字元輸入、輸出流,

構造方法:

   FileReader(String filename);

   FileReader(File filename);

   FileWriter (String filename); 

   FileWriter (File filename); 

2.字元輸入流和輸出流的read()和write()方法以字元為基本單位處理資料。 

 

5. 緩衝流

緩衝流增強了讀寫檔案的能力,比如Student.txt是一個學生的名單,每個姓名佔一行。如果我們想要讀取名字,那麼每次必須讀取一行,使用FileReader流很難完成這樣的任務,因為我們不清楚一行有多少字元,FileReader類沒有提供讀取一行的方法。

ps:個人理解,使用filereader無法分辨是否讀了幾行,貌似是讀完的。在需要分行讀的情況下就失效了。

1.BufferedReader和BufferedWriter類建立的物件稱作緩衝輸入、輸出流。二者的源和目的地必須是字元輸入流和字元輸出流。  構造方法:

    BufferedReader(Reader in); 

    BufferedWriter (Writer out); 

2. BufferedReader和BufferedWriter類讀寫檔案的方法:

   readLine() BufferedReader流讀取文字行

   write(String s,int off,int len)BufferedWriter流把字串s寫到檔案中

   newLine(); BufferedWriter流向檔案寫入一個回行符