1. 程式人生 > >Java學習筆記--異常處理、File類、IO流介紹

Java學習筆記--異常處理、File類、IO流介紹

異常處理

  • 格式:
try {
    可能出現問題的程式碼;
}catch(異常類名 變數名) {//catch語句可以有多個,子類異常放前面,父類異常放後面
    針對問題的處理;
}finally {
    釋放資源;
}
  • jdk7新特性
try {
    可能出現問題的程式碼;
}catch(異常類名1 | 異常類名2 | ... 變數名) {//這種方式只能多個異常處於平級關係
    針對問題的處理;
}
  • 異常分為編譯期間異常和執行期間異常,所有屬於RuntimeException的子類都是執行期間異常,其餘一場都是編譯期間異常。而需要通過try…catch語句處理的異常通常都是編譯期間異常。
  • 另外一種處理異常的方式是丟擲異常
    1. 在方法的括號後面加上throws 異常類名1, 異常類名2…
    2. 在方法的內部通過throw後面跟上new出來的異常物件來主動拋異常
  • finally語句體中的語句一定會執行,即便try或者catch中存在return,它們會在return前一刻執行完成,然後再回到return語句。
  • 自定義異常需要繼承Exception類,帶參構造方法中的引數表示錯誤提示資訊。
public class MyException extends Exception {
	public MyException() {
	}

	public MyException(String message)
{ super(message); } }
  • 異常注意事項:
    1. 子類重寫父類方法時,子類的方法必須丟擲相同的異常或父類異常的子類。
    2. 如果父類丟擲了多個異常,子類重寫父類時,只能丟擲相同的異常或者是他的子集,子類不能丟擲父類沒有的異常。
    3. 如果被重寫的方法沒有異常丟擲,那麼子類的方法絕對不可以丟擲異常,如果子類方法內有異常發生,那麼子類只能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