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類有如下常用的方法:
-
void write(int n): 向輸出流寫入一個字元;
-
void write(byte b[]): 向輸出流寫入一個字元陣列。
-
void write(byte b[],int off,int length): 從給定字元陣列中起始於偏移量off處取len個字元寫到輸出流。
-
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構造方法及常用方法
- ByteArrayInputStream(byte[] buf);
- ByteArrayInputStream(byte[] buf,int offset,int length);
- public int read();順序地從源中讀出一個位元組
- public int read(byte[] b,int off,int len);順序地從源中讀出引數len指定的位元組數
- ByteArrayOutputStream流構造方法及常用方法
-
ByteArrayOutputStream();
-
ByteArrayOutputStream(int size);
-
public void write(int b); 順序地向緩衝區寫入一個位元組
-
public void write(byte[] b,int off,int len); 將引數b中指定的len個位元組順序地寫入緩衝區
-
public byte[] toByteArray(); 返回輸出流寫入到緩衝區的全部位元組
- 字元陣列:CharArrayReader和CharArrayWriter類是字元陣列流,使用字元陣列作為流的源和目標。
14.資料流
-
DataInputStream和DataOutputStream類建立的物件稱為資料輸入流和資料輸出流。
- 構造方法:
- DataInputStream(InputStream in)建立的資料輸入流指向一個由引數in指定的底層輸入流。DataOutputStream(OutnputStream out)建立的資料輸出流指向一個由引數out指定的底層輸出流。
15.物件流
-
ObjectInputStream和ObjectOutputStream類建立的物件稱為物件輸入流和物件輸出流。
-
它的構造方法是:
- ObjectInputStream(InputStream in)
- ObjectOutputStream(OutputStream out)
-
相關方法:
- writeObject(Object obj) 將一個物件obj寫入到一個檔案
- readObject() 讀取一個物件到程式中
-
所謂序列化:一個類如果實現了Serializable介面,那麼這個類建立的物件就是所謂序列化的物件。
16.序列化和物件克隆
-
如果一個“複製品”實體的變化不會引起原物件實體發生變化,反之亦然。這樣的複製品稱為原物件的一個克隆物件或簡稱克隆。
-
一個物件呼叫clone()方法就可以獲取該物件的克隆物件。
-
物件輸入流通過物件的序列化資訊來得到當前物件的一個克隆。
17.使用Scanner解析檔案
- 使用Scanner類和正則表示式來解析檔案。
-
使用預設分隔標記解析檔案
- 建立Scanner物件,並指向要解析的檔案,例如:
- File file = new File("hello.java");
- Scanner sc = new Scanner(file);
- sc將空白作為分隔標記
-
相關方法
- next()依次返回file中的單詞
- hasNext()判斷file最後一個單詞是否已被next()方法返回.
- File file = new File("hello.java");
- Scanner sc = new Scanner(file);
- sc.useDelimiter(正則表示式);
- sc將正則表示式作為分隔標記
- 相關方法 next() 依次返回file中的單詞
- hasNext() 判斷file最後一個單詞是否已被next()方法返回
- File file = new File("hello.java");
- Scanner sc = new Scanner(file);
- sc.useDelimiter(正則表示式);
- sc將正則表示式作為分隔標記
- 相關方法 :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();