1. 程式人生 > >201711671212 《JAVA程式設計》第十週學習總結

201711671212 《JAVA程式設計》第十週學習總結

教材學習內容總結

本週學習內容:第10章 輸入、輸出流

1.輸入流的指向稱為它的源,程式通過輸入流讀取源中的資料;所有輸入流都是抽象類InputStream(位元組輸入流)或抽象類Reader(字元輸入流)的子類。

2.輸出流的指向稱為它的目的地,程式通過輸出流把資料傳送到目的地。所有輸出流都是抽象類OutputStream(位元組輸出流)或抽象類Writer(字元輸出流)的子類。

3.File類的物件主要用於獲取檔案本身的一些資訊。

  • 其構造方法有3個:
  • File(Stream filename);File(Stream directoryPath,String filename);File(File dir,Stream filename);
  • 其中,filename是檔名,directoryPath是檔案的路徑,dir為一個目錄。使用File(Stream filename)建立檔案時,該檔案被認為與當前應用程式在同一目錄中。

4.檔案的屬性

  • public String getName() 獲取檔案的名字。
  • public boolean canRead() 判斷檔案是否是可讀的。
  • public boolean canWrite() 判斷檔案是否可被寫入。
  • public boolean exists() 判斷檔案是否存在。
  • public long length() 獲取檔案的長度(單位是位元組)。
  • public String getAbsolutePath() 獲取檔案的絕對路徑。
  • public String getParent() 獲取檔案的父目錄。
  • public boolean isFile() 判斷檔案是否是一個普通檔案,而不是目錄。
  • public boolean isDirectory() 判斷檔案是否是一個目錄。
  • public boolean isHidden() 判斷檔案是否是隱藏檔案。
  • public long lastModified() 獲取檔案最後修改時間(時間是從1970年午夜至檔案最後修改時刻的毫秒數)。

5.目錄

(1)建立目錄

  • File物件呼叫方法public boolean mkdir()建立目錄,建立成功返回true,否則返回false(目錄已存在返回false)。

(2)列出目錄中的檔案

  • public String[] list() 用字串形式返回目錄下的全部檔案。
  • public File [] listFile() 用File物件形式返回目錄下的全部檔案。
  • 列出指定型別的檔案:public String[] list(FilenameFilter obj),public File [] listFiles(FilenameFilter obj)
  • 上述兩方法的引數FilenameFilter是一個介面,該介面有一個方法:

  • public boolean accept(File dir,String name);

6.檔案的建立與刪除

  • 使用File類建立一個檔案物件。
  • 檔案物件file呼叫方法public boolean createNewFile();

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

7.執行可執行檔案

  • 用Runtime 類宣告一個物件。
  • 用該類的getRuntime()靜態方法建立這個物件:

  • ec=Runtime.getRuntime();

  • ec可以呼叫exec(String command)方法開啟本地機的可執行檔案或執行一個操作。

8.文字位元組輸入流

  • 使用輸入流通常包括4個基本步驟:

  (1)設定輸入流的源

  (2)建立指向源的輸入流

  (3)讓輸入流讀取源中的資料

  (4)關閉輸入流。

  • 使用FileInputStream類的下列構造方法建立指向檔案的輸入流。
  • FileInputStream(String name);
  •  FileInputStream(File file);
  • 其中:引數name和file指定的檔案稱為輸入流的源。
  • int read() 讀取單個位元組的資料,返回位元組值(0~255整數),如果未讀出位元組就返回-1。

  • int read(byte b[]) 讀取b.length個位元組到位元組陣列b中,返回實際讀取的位元組數。如果到達檔案的末尾,則返回-1。

  • int read(byte b[], int off, int len) 讀取len個位元組到位元組陣列b中,並返回實際讀取的位元組數目。如果到達檔案的末尾,則返回-1,引數off指定從位元組陣列的某個位置開始存放讀取的資料。

9.文字輸出流

  • 使用輸出流通常包括4個基本步驟:

  (1)給出輸出流的目的地

  (2)建立指向目的地的輸出流

  (3)讓輸出流把資料寫入到目的地

  (4)關閉輸出流。

  • 使用FileOutputStream類的下列具有重新整理功能的構造方法建立指向檔案的輸出流。

  • FileOutputStream(String name);

  • FileOutputStream(File file);

  • 其中:引數name和file指定的檔案稱為輸出流的目的地

  • 輸出流的wirie方法以位元組單位向目的地寫資料。

  •    void write(int n) 向目的地寫入單個位元組。

  •    void write(byte b[]) 向目的地寫入一個位元組陣列。

  •    void write(byte b[],int off,int len) 從位元組陣列中偏移量off處取len個位元組寫到目的地。

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

10.檔案字元輸入、輸出流

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

  • int read(); int read(char b[]); int read(char b[], int off, int len); void close();  long skip(long numBytes);

  •  Writer流以字元為單位順序地寫檔案,每次呼叫write方法就順序地向目的地寫入內容。 

  • Writer類有如下常用的方法:

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

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

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

  4. void close():  關閉輸出流。

11.緩衝流

  • BufferedReader和BufferedWriter類建立的物件稱作緩衝輸入、輸出流。二者的源和目的地必須是字元輸入流和字元輸出流。 
  • 構造方法:BufferedReader(Reader in); BufferedWriter (Writer out);

  • BufferedReader和BufferedWriter類讀寫檔案的方法:readLine() 讀取文字行; write(String s,int off,int len) 把字串s寫到檔案中 ; newLine(); 向檔案寫入一個回行符。

12.隨機流

  • 使用RandomAccessFile類來建立一個隨機訪問檔案流。

  • RandomAccessFile類建立的流的指向既可以作為源也可以作為目的地。    

  • 構造方法:RandomAccessFile(String name,String mode) ; RandomAccessFile(File file,String mode) ;

  • seek(long a)  定位RandomAccessFile流的讀寫位置 ; getFilePointer() 獲取流的當前讀寫位置 ;

13.陣列流

  • 位元組陣列輸入流ByteArrayInputStream 作為流的源
  • 位元組陣列輸出流ByteArrayOutputStream作為流的源目標。
  • ByteArrayInputStream構造方法及常用方法

  1.   ByteArrayInputStream(byte[] buf);
  2.   ByteArrayInputStream(byte[] buf,int offset,int length);
  3.   public int read();順序地從源中讀出一個位元組
  4.   public int read(byte[] b,int off,int len);順序地從源中讀出引數len指定的位元組數
  • ByteArrayOutputStream流構造方法及常用方法
  1.   ByteArrayOutputStream();

  2.   ByteArrayOutputStream(int size);

  3.   public void write(int b); 順序地向緩衝區寫入一個位元組  

  4.   public void write(byte[] b,int off,int len); 將引數b中指定的len個位元組順序地寫入緩衝區

  5.   public byte[] toByteArray(); 返回輸出流寫入到緩衝區的全部位元組

  • 字元陣列:CharArrayReader和CharArrayWriter類是字元陣列流,使用字元陣列作為流的源和目標。

14.資料流

  • DataInputStream和DataOutputStream類建立的物件稱為資料輸入流和資料輸出流。

  • 構造方法:
  • DataInputStream(InputStream in)建立的資料輸入流指向一個由引數in指定的底層輸入流。DataOutputStream(OutnputStream out)建立的資料輸出流指向一個由引數out指定的底層輸出流。

15.物件流

  • ObjectInputStream和ObjectOutputStream類建立的物件稱為物件輸入流和物件輸出流。

  • 它的構造方法是:

  1.     ObjectInputStream(InputStream in)
  2.    ObjectOutputStream(OutputStream out)
  •  相關方法:

  1.      writeObject(Object obj) 將一個物件obj寫入到一個檔案
  2.     readObject() 讀取一個物件到程式中 
  • 所謂序列化:一個類如果實現了Serializable介面,那麼這個類建立的物件就是所謂序列化的物件。

16.序列化和物件克隆

  • 如果一個“複製品”實體的變化不會引起原物件實體發生變化,反之亦然。這樣的複製品稱為原物件的一個克隆物件或簡稱克隆。

  • 一個物件呼叫clone()方法就可以獲取該物件的克隆物件。

  • 物件輸入流通過物件的序列化資訊來得到當前物件的一個克隆。 

17.使用Scanner解析檔案

  • 使用Scanner類和正則表示式來解析檔案。
  • 使用預設分隔標記解析檔案

  1.       建立Scanner物件,並指向要解析的檔案,例如:
  2.       File file = new File("hello.java");
  3.       Scanner sc = new Scanner(file);
  4.       sc將空白作為分隔標記
  • 相關方法

  1. next()依次返回file中的單詞
  2. hasNext()判斷file最後一個單詞是否已被next()方法返回.
  3.  File file = new File("hello.java");
  4. Scanner sc = new Scanner(file);
  5. sc.useDelimiter(正則表示式);
  6. sc將正則表示式作為分隔標記
  7. 相關方法 next()    依次返回file中的單詞
  8. hasNext() 判斷file最後一個單詞是否已被next()方法返回
  9. File file = new File("hello.java");
  10. Scanner sc = new Scanner(file);
  11. sc.useDelimiter(正則表示式);
  12. sc將正則表示式作為分隔標記
  13. 相關方法 :next() 依次返回file中的單詞,hasNext() 判斷file最後一個單詞是否已被next()方法返回

18.檔案對話方塊

  • 構造方法JFileChooser()建立初始不可見的有模式的檔案對話方塊。
  • showSaveDialog(Component a);  showOpenDialog(Component a);

19.帶進度條的輸入流

  • 如果讀取檔案時希望看見檔案的讀取進度可以使用javax.swing包提供的輸入流類:ProgressMonitorInputStream。

  • 它的構造方法是:ProgressMonitorInputStream(Conmponent c,String s,InputStream);

20.檔案鎖

  • RondomAccessFile建立的流在讀寫檔案時使用檔案鎖的步驟如下:

(1)先使用RondomAccessFile流建立指向檔案的流物件,該物件的讀寫屬性必須是rw,例如:

      RandomAccessFile input=new          RandomAccessFile("Example.java","rw");

(2)input流呼叫方法getChannel()獲得一個連線到地層檔案的FileChannel物件(通道),例如

      FileChannel channel=input.getChannel();

 (3)通道呼叫tryLock()或lock()方法獲得一個FileLock(檔案鎖)物件,這一過程也稱作對檔案加鎖.

      例如:FileLock lock=channel.tryLock();