java 之 API-IO

異常概述

異常:異常就是Java程序在運行過程中出現的錯誤。
異常由來:問題也是現實生活中一個具體事務,也可以通過java 的類的形式進行描述,並封裝成對象。其實就是Java對不正常情況進行描述後的對象體現。
我們見過的異常,角標越界異常,空指針異常

這裏寫圖片描述

JVM的默認處理方案

把異常的名稱,錯誤原因及異常出現的位置等信息輸出在了控制檯
程序停止執行

異常處理方案

異常處理方案
try…catch…finally
throws

try…catch處理方式

一個異常的情況
多個異常的情況
    平級情況
    存在上下級的情況
    JDK7的新特性及注意事項

編譯時異常和運行時異常的區別

    Java中的異常被分爲兩大類:編譯時異常和運行時異常。所有的RuntimeException類及其子類的實例被稱爲運行時異常,其他的異常就是編譯時異常
編譯時異常
    Java程序必須顯示處理,否則程序就會發生錯誤,無法通過編譯
運行時異常
    無需顯示處理,也可以和編譯時異常一樣處理

Throwable中的方法

getMessage()
    獲取異常信息,返回字符串。
toString()
    獲取異常類名和異常信息,返回字符串。
printStackTrace()
    獲取異常類名和異常信息,以及異常出現在程序中的位置。返回值void。
printStackTrace(PrintStream s)
    通常用該方法將異常內容保存在日誌文件中,以便查閱。 

throws

定義功能方法時,需要把出現的問題暴露出來讓調用者去處理。那麼就通過throws在方法上標識。

throw

在功能方法內部出現某種情況,程序不能繼續運行,需要進行跳轉時,就用throw把異常對象拋出。

throws和throw的區別

throws
    用在方法聲明後面,跟的是異常類名
    可以跟多個異常類名,用逗號隔開
    表示拋出異常,由該方法的調用者來處理
    throws表示出現異常的一種可能性,並不一定會發生這些異常
throw
    用在方法體內,跟的是異常對象名
    只能拋出一個異常對象名
    表示拋出異常,由方法體內的語句處理
    throw則是拋出了異常,執行throw則一定拋出了某種異常

到底該如何處理異常呢

原則:如果該功能內部可以將問題處理,用try,如果處理不了,交由調用者處理,這是用throws
區別:
    後續程序需要繼續運行就try
    後續程序不需要繼續運行就throws
舉例:
    感冒了就自己喫點藥就好了,try
    吃了好幾天藥都沒好結果得了H7N9,那就的得throws到醫院
    如果醫院沒有特效藥就變成Error了

finally的特點作用及面試題

finally的特點
    被finally控制的語句體一定會執行
    特殊情況:在執行到finally之前jvm退出了(比如System.exit(0))
finally的作用
    用於釋放資源,在IO流操作和數據庫操作中會見到
finally相關的面試題
    final,finally和finalize的區別
    如果catch裏面有return語句,請問finally的代碼還會執行嗎?如果會,請問是在return前還是return後。

自定義異常

考試成績必須在0-100之間
很明顯java沒有對應的異常,需要我們自己來做一個異常
自定義異常
    繼承自Exception
    繼承自RuntimeException

異常注意事項

子類重寫父類方法時,子類的方法必須拋出相同的異常或父類異常的子類。(父親壞了,兒子不能比父親更壞)
如果父類拋出了多個異常,子類重寫父類時,只能拋出相同的異常或者是他的子集,子類不能拋出父類沒有的異常
如果被重寫的方法沒有異常拋出,那麼子類的方法絕對不可以拋出異常,如果子類方法內有異常發生,那麼子類只能try,不能throws

File類概述和構造方法

File類的概述
    文件和目錄路徑名的抽象表示形式
構造方法
    public File(String pathname)
    public File(String parent,String child)
    public File(File parent,String child)

File類的成員方法

創建功能
    public boolean createNewFile()
    public boolean mkdir()
    public boolean mkdirs()
刪除功能
    public boolean delete()
重命名功能
    public boolean renameTo(File dest)

File類的成員方法

判斷功能
    public boolean isDirectory()
    public boolean isFile()
    public boolean exists()
    public boolean canRead()
    public boolean canWrite()
    public boolean isHidden()

File類的成員方法

基本獲取功能
    public String getAbsolutePath()
    public String getPath()
    public String getName()
    public long length()
    public long lastModified()
高級獲取功能
    public String[] list()
    public File[] listFiles()

遞歸的思想概述

遞歸
    方法定義中調用方法本身的現象
遞歸注意實現
    要有出口,否則就是死遞歸
    次數不能太多,否則就內存溢出
    構造方法不能遞歸使用

IO流概述

IO流用來處理設備之間的數據傳輸
    上傳文件和下載文件
Java對數據的操作是通過流的方式
Java用於操作流的對象都在IO包中

IO流分類

按照數據流向
    輸入流 讀入數據
    輸出流 寫出數據
按照數據類型
    字節流
    字符流
    什麼情況下使用哪種流呢?
        如果數據所在的文件通過windows自帶的記事本打開並能讀懂裏面的內容,就用字符流。其他用字節流。
        如果你什麼都不知道,就用字節流

IO流常用基類

字節流的抽象基類:
    InputStream ,OutputStream。
字符流的抽象基類:
    Reader , Writer。
    注:由這四個類派生出來的子類名稱都是以其父類名作爲子類名的後綴。
    如:InputStream的子類FileInputStream。
    如:Reader的子類FileReader。

字節流寫數據

OutputStream
    FileOutputStream
往一個文本文件中寫一句話:”helloworld”
    分析發現其實更適合用字符流,但是由於字節流先出現,所以,我們考慮先使用字節流後面再講會什麼出現字符流。
FileOutputStream的構造方法
    FileOutputStream(File file)
    FileOutputStream(String name)

字節流寫數據的方式

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

字節流讀取數據

nputStream
    FileInputStream
把剛纔寫的數據讀取出來顯示在控制檯
FileInputStream的構造方法
    FileInputStream(File file)
    FileInputStream(String name)
FileInputStream的成員方法
    public int read()
    public int read(byte[] b)

字節緩衝流

    字節流一次讀寫一個數組的速度明顯比一次讀寫一個字節的速度快很多,這是加入了數組這樣的緩衝區效果,java本身在設計的時候,也考慮到了這樣的設計思想(裝飾設計模式後面講解),所以提供了字節緩衝區流
字節緩衝輸出流
    BufferedOutputStream
字節緩衝輸入流
    BufferedInputStream

轉換流出現的原因及思想

由於字節流操作中文不是特別方便,所以,java就提供了轉換流。
字符流=字節流+編碼表

編碼表概述和常見的編碼表

編碼表
    由字符及其對應的數值組成的一張表
常見編碼表
    ASCII/Unicode 字符集
    ISO-8859-1
    GB2312/GBK/GB18030
    BIG5
    UTF-8

字符串中的編碼問題

編碼
    把看得懂的變成看不懂的
解碼
    把看不懂的變成看得懂的

轉換流概述

OutputStreamWriter 字符輸出流
    public OutputStreamWriter(OutputStream out)
    public OutputStreamWriter(OutputStream out,String charsetName)
InputStreamReader 字符輸入流
    public InputStreamReader(InputStream in)
    public InputStreamReader(InputStream in,String charsetName)

OutputStreamWriter寫數據

OutputStreamWriter寫數據方法
    public void write(int c)
    public void write(char[] cbuf)
    public void write(char[] cbuf,int off,int len)
    public void write(String str)
    public void write(String str,int off,int len)
字符流操作要注意的問題
    flush()的作用
    flush()和close()的區別

InputStreamReader讀數據

OutputStreamWriter讀數據方法
    public int read()
    public int read(char[] cbuf)

字符流複製文本文件

把當前項目目錄下的a.txt內容複製到當前項目目錄下的b.txt中
把c:\\a.txt內容複製到d:\\b.txt中

轉換流的簡化寫法

轉換流的名字比較長,而我們常見的操作都是按照本地默認編碼實現的,所以,爲了簡化我們的書寫,轉換流提供了對應的子類。
FileWriter
FileReader

FileWriter和FileReader

FileWriter寫數據
FileReader讀取數據
FileWriter和FileReader實現文本文件的複製

字符緩衝流

BufferedWriter基本用法
BufferedReader基本用法
字符緩衝流複製文本文件
特殊功能
    BufferedWriter
        void newLine()
    BufferedReader
        String readLine()
字符緩衝流特殊功能複製文本文件

IO流小結

字節流
    字節輸入流
    字節輸出流
字符流
    字符輸入流
    字符輸出流

操作基本數據類型的流

操作基本數據類型
    DataInputStream
    DataOutputStream

內存操作流

操作字節數組
    ByteArrayInputStream
    ByteArrayOutputStream
操作字符數組
    CharArrayReader
    CharArrayWrite
操作字符串
    StringReader
    StringWriter

打印流

打印流概述
    字節流打印流
    字符打印流
打印流特點
    只能操作目的地,不能操作數據。
    可以操作任意類型的數據。
    如果啓動了自動刷新,能夠自動刷新。
    可以操作文件的流
打印流複製文本文件

標準輸入輸出流

System類中的字段:in,out。
它們各代表了系統標準的輸入和輸出設備。
默認輸入設備是鍵盤,輸出設備是顯示器。
System.in的類型是InputStream.
System.out的類型是PrintStream是OutputStream的子類FilterOutputStream 的子類.

隨機訪問流

RandomAccessFile概述
RandomAccessFile類不屬於流,是Object類的子類。但它融合了InputStream和OutputStream的功能。支持對隨機訪問文件的讀取和寫入。

合併流

SequenceInputStream概述
    SequenceInputStream類可以將多個輸入流串流在一起,合併爲一個輸入流,因此,該流也被稱爲合併流。
SequenceInputStream的構造方法
    SequenceInputStream(InputStream s1, InputStream s2)  
    SequenceInputStream(Enumeration<? extends InputStream> e)
    把多個文件的內容寫入到一個文本文件

序列化流

序列化流
    ObjectOutputStream
反序列化流
    ObjectInputStream
序列化操作問題
    爲什麼要實現序列化?
    如何實現序列化?
    序列化數據後,再次修改類文件,讀取數據會出問題,如何解決呢?
    使用transient關鍵字聲明不需要序列化的成員變量

Properties集合

Properties概述
Properties作爲Map集合的使用
Properties的特殊功能
    public Object setProperty(String key,String value)
    public String getProperty(String key)
    public Set<String> stringPropertyNames()
Properties和IO流的結合使用
    public void load(Reader reader)
    public void store(Writer writer,String comments)

NIO包下的IO流

NIO其實就是新IO的意思。
    JDK4出現NIO。新IO和傳統的IO有相同的目的,都是用於進行輸入輸出的,但新IO使用了不同的方式來處理輸入輸出,採用內存映射文件的方式,將文件或者文件的一段區域映射到內存中,就可以像訪問內存一樣的來訪問文件了,這種方式效率比舊IO要高很多,但是目前好多地方我們看到的還是舊IO的引用,所以我們仍以舊IO爲主,知道NIO即可。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章