Java學習筆記--異常處理、File類、IO流介紹
阿新 • • 發佈:2018-12-12
異常處理
- 格式:
try {
可能出現問題的程式碼;
}catch(異常類名 變數名) {//catch語句可以有多個,子類異常放前面,父類異常放後面
針對問題的處理;
}finally {
釋放資源;
}
- jdk7新特性
try {
可能出現問題的程式碼;
}catch(異常類名1 | 異常類名2 | ... 變數名) {//這種方式只能多個異常處於平級關係
針對問題的處理;
}
- 異常分為編譯期間異常和執行期間異常,所有屬於RuntimeException的子類都是執行期間異常,其餘一場都是編譯期間異常。而需要通過try…catch語句處理的異常通常都是編譯期間異常。
- 另外一種處理異常的方式是丟擲異常
- 在方法的括號後面加上throws 異常類名1, 異常類名2…
- 在方法的內部通過throw後面跟上new出來的異常物件來主動拋異常
- finally語句體中的語句一定會執行,即便try或者catch中存在return,它們會在return前一刻執行完成,然後再回到return語句。
- 自定義異常需要繼承Exception類,帶參構造方法中的引數表示錯誤提示資訊。
public class MyException extends Exception {
public MyException() {
}
public MyException(String message) {
super(message);
}
}
- 異常注意事項:
- 子類重寫父類方法時,子類的方法必須丟擲相同的異常或父類異常的子類。
- 如果父類丟擲了多個異常,子類重寫父類時,只能丟擲相同的異常或者是他的子集,子類不能丟擲父類沒有的異常。
- 如果被重寫的方法沒有異常丟擲,那麼子類的方法絕對不可以丟擲異常,如果子類方法內有異常發生,那麼子類只能try,不能throws。
File類
- 建立一個File物件:
File file = new File("E:\\demo\\a.txt");
File file2 = new File("E:\\demo", "a.txt");
File file3 = new File("e:\\demo");
File file4 = new File(file3, "a.txt");
//file、file2和file4是等效的
- 一些常用的方法:
public boolean canRead()//判斷檔案是否可讀
public boolean createNewFile() throws IOException//建立檔案
public boolean mkdir()//建立資料夾
public boolean mkdirs()//建立巢狀資料夾
public boolean delete()//刪除檔案或資料夾
public String getAbsolutePath()//輸出絕對路徑
public String getName()//檔案或資料夾的名稱
public boolean isDirectory()//判斷是否是資料夾
public boolean isFile()//判斷是否是檔案
public long length()//輸出檔案大小,單位為位元組
public boolean renameTo(File dest)//效果等同於Linux下的mv命令,包含重新命名和剪下雙重含義
public String[] list()//返回資料夾下所有檔案和資料夾的名稱陣列
public File[] listFiles()//返回資料夾下所有檔案和資料夾的File物件陣列
- 高階方法:
public String[] list(FilenameFilter filter)
:返回所有滿足條件的檔案或資料夾名稱陣列。FilenameFilter是一個介面,所以傳入的引數必須是其子類物件,並且需要重寫其中的accept方法,用來逐個判斷檔案或者資料夾是否滿足要求。當然,傳入的filter引數可以不另外建立類,而是直接用匿名內部類的方式建立子類物件。
IO流
- 分類
- 按照流向可以分為輸入流和輸出流。
- 按照資料型別可以分為位元組流可字元流。
- 所以組合起來總共有四種流:位元組輸入流、位元組輸出流、字元輸入流、字元輸出流。
- 分別對應的抽象基類時:InputStream, OutputStream, Reader, Writer。
- 使用IO流讀寫資料,最後一定要呼叫close()方法,這樣就能讓流物件變成垃圾,可以被垃圾回收器回收;第二點就是通知系統去釋放跟該檔案有關的資源。
- 使用FileInputStream和FileOutputStream讀寫資料的方式如下:
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestDemo {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("e:\\movie.avi");
FileOutputStream fos = new FileOutputStream("movie.avi");
byte[] b = new byte[1024];//一次最多讀取的量
int len = 0;//記錄一次實際讀取的量
while((len = fis.read(b))!=-1){//以byte陣列的方式讀取
fos.write(b,0,len);//以byte陣列的方式寫入
}
fis.close();
fos.close();
}
}
- BufferedOutputStream:該類實現緩衝輸出流。通過設定這樣的輸出流,應用程式可以將位元組寫入基礎輸出流,而不必為寫入的每個位元組呼叫底層系統。提高了讀寫效率。使用時只需要用該類對輸出流進行包裝即可。使用BufferedOutputStream和BufferedInputStream的協資料的方式如下:
import java.io.*;
public class TestDemo {
public static void main(String[] args) throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("movie.avi"));
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("e:\\movie.avi"));
byte[] b = new byte[1024];
int len = 0;
while((len = bis.read(b))!=-1){
bos.write(b,0,len);
}
bis.close();
bos.close();
}
}
- 前面講到的四個類都屬於位元組流,而讀寫文字檔案還有一類流叫做字元流:Reader, Writer
- 使用方法與位元組流大致相同:
import java.io.*;
public class TestDemo {
public static void main(String[] args) throws IOException {
InputStreamReader isr = new InputStreamReader(new FileInputStream("a.txt"));//字元轉換流
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("b.txt"));
//下面這兩個類是上面類的簡化版本,屬於其子類
//FileReader isr = new FileReader("a.txt");
//FileWriter osw = new FileWriter("b.txt");
//下面這兩個類是提供高效讀寫的緩衝流
//BufferedReader isr = new BufferedReader(new FileReader("a.txt"));
//BufferedWriter osw = new BufferedWriter(new FileWriter("b.txt"));
char[] ch = new char[1024];
int len = 0;
while ((len = isr.read(ch))!=-1){
osw.write(ch,0,len);
osw.flush();
}
isr.close();
osw.close();
}
}
- 下面利用緩衝流的特殊方法來完成檔案內容的複製:
public String readLine()throws IOException
通過下列字元之一即可認為某行已終止:換行 (’\n’)、回車 (’\r’) 或回車後直接跟著換行。返回包含該行內容的字串,不包含任何行終止符,如果已到達流末尾,則返回null。
import java.io.*;
public class TestDemo {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
String line = null;
while ((line = br.readLine())!=null){
bw.write(line);
bw.newLine();//插入一個由系統決定的換行符
bw.flush();
}
br.close();
bw.close();
}
}
- DataInputStream和DataOutputStream是讀寫基本資料型別的輸入輸出流,它們的讀寫方法中除了能夠是位元組陣列,還可以是Java中的任意基本資料型別。儲存在檔案中的資料型別不是字串形式,所以不可讀;但他們儲存了原有的資料型別,使用輸入流讀入時依然是原來的資料型別。
- PrintWriter是列印輸出流,能夠將任意資料型別列印在文字檔案中。呼叫的方法不再是write()而是print()或println()。列印流將其他資料型別以字串的形式儲存下來,已經不再是以前的資料型別,這一點需要與前面兩個流進行區分。
- 隨機訪問流RandomAccessFile可以同時具備讀和寫的功能,且支援各種資料型別;還能夠獲取檔案指標和設定檔案指標來從中間任意位置進行讀寫。
- 合併流SequenceInputStream能夠將多個InputStream合併為一個,按照順序挨個檔案讀取。
- ObjectOutputStream和ObjectInputStream稱為序列化流和反序列化流。能夠實現物件的序列化和反序列化,物件要具備被序列化的能力,必須實現Serializable介面。在成員變數前面加上transient關鍵字就能夠防止其被序列化。
Properties類
- 該類是Hashtable類的子類,它也實現了Map介面,具有基本的與Map類相同的功能,但是它限制了鍵和值的型別必須為字串形式。
- 該類有一些特殊的方法:
public String getProperty(String key)//根據鍵來找值
public Object setProperty(String key,String value)//新增鍵值對,實質上呼叫了Hashtable的put方法
public Set<String> stringPropertyNames()//得到鍵的集合,實際上呼叫了Hashtable的keySet方法。
- 與IO流結合的兩個方法:
//讀取檔案中的鍵值對,載入到Properties物件中,以Map形式儲存
public synchronized void load(Reader reader) throws IOException
//將Properties物件中的鍵值對以能夠被正確讀取的方式寫入檔案當中,第二個引數是Properties物件描述資訊
public void store(Writer writer, String comments) throws IOException