學習記錄之基礎API(流)
File類的每一個實例可以表示硬盤(文件系統(tǒng))中的一個文件或目錄(實際上表示的是一個抽象路徑)
使用File可以做到:
????1:訪問其表示的文件或目錄的屬性信息,例如:名字,大小,修改時間等等
????2:創(chuàng)建和刪除文件或目錄
????3:訪問一個目錄中的子項
常用方法:
????length():返回一個long值,表示占用的磁盤空間,單位為字節(jié)。
????canRead():File表示的文件或目錄是否可讀
????canWrite():File表示的文件或目錄是否可寫
????isHidden():File表示的文件或目錄是否為隱藏的
????createNewFile():創(chuàng)建一個新文件,如果指定的文件所在的目錄不存在會拋出異常????????????????java.io.FileNotFoundException
????mkdir:創(chuàng)建一個目錄
????mkdirs:創(chuàng)建一個目錄,并且會將所有不存在的父目錄一同創(chuàng)建出來,推薦使用。
????delete():刪除當前文件或目錄,如果目錄不是空的則刪除失敗。
????exists():判斷File表示的文件或目錄是否真實存在。true:存在 ? false:不存在
????isFile():判斷當前File表示的是否為一個文件。
????isDirectory():判斷當前File表示的是否為一個目錄
????listFiles():獲取File表示的目錄中的所有子項
????listFiles(FileFilter filter):獲取File表示的目錄中滿足filter過濾器要求的所有子項
java io可以讓我們用標準的讀寫操作來完成對不同設備的讀寫數(shù)據(jù)工作.
java將IO按照方向劃分為輸入與輸出,參照點是我們寫的程序.
輸入:用來讀取數(shù)據(jù)的,是從外界到程序的方向,用于獲取數(shù)據(jù).
輸出:用來寫出數(shù)據(jù)的,是從程序到外界的方向,用于發(fā)送數(shù)據(jù).
java io可以讓我們用標準的讀寫操作來完成對不同設備的讀寫數(shù)據(jù)工作.
java將IO按照方向劃分為輸入與輸出,參照點是我們寫的程序.
輸入:用來讀取數(shù)據(jù)的,是從外界到程序的方向,用于獲取數(shù)據(jù).
輸出:用來寫出數(shù)據(jù)的,是從程序到外界的方向,用于發(fā)送數(shù)據(jù).
Java定義了兩個超類(抽象類):
java.io.InputStream:所有字節(jié)輸入流的超類,其中定義了讀取數(shù)據(jù)的方法.因此將來不管讀取的是什么設備(連接該設備的流)都有這些讀取的方法,因此我們可以用相同的方法讀取不同設備中的數(shù)據(jù)
????java.io.OutputStream:所有字節(jié)輸出流的超類,其中定義了寫出數(shù)據(jù)的方法.
java將流分為兩類:節(jié)點流與處理流:
節(jié)點流:也稱為低級流.節(jié)點流的另一端是明確的,是實際讀寫數(shù)據(jù)的流,讀寫一定是建立在節(jié)點流基礎上進行的.
處理流:也稱為高級流.處理流不能獨立存在,必須連接在其他流上,目的是當數(shù)據(jù)流經(jīng)當前流時對數(shù)據(jù)進行加工處理來簡化我們對數(shù)據(jù)的該操作.
實際應用中,我們可以通過串聯(lián)一組高級流到某個低級流上以流水線式的加工處理對某設備的數(shù)據(jù)進行讀寫,這個過程也成為流的連接,這也是IO的精髓所在.
文件流是一對低級流,用于讀寫文件的流
java.io.FileOutputStream文件輸出流,繼承自java.io.OutputStream
常用構造器
覆蓋模式對應的構造器
覆蓋模式是指若指定的文件存在,文件流在創(chuàng)建時會先將該文件原內(nèi)容清除。
FileOutputStream(String pathname):創(chuàng)建文件輸出流用于向指定路徑表示的文件做寫操作
FileOutputStream(File file):創(chuàng)建文件輸出流用于向File表示的文件做寫操作。
注:如果寫出的文件不存在文件流自動創(chuàng)建這個文件,但是如果該文件所在的目錄不存在會拋出異常:java.io.FileNotFoundException
追加寫模式對應的構造器
追加模式是指若指定的文件存在,文件流會將寫出的數(shù)據(jù)陸續(xù)追加到文件中。
FileOutputStream(String pathname,boolean append):如果第二個參數(shù)為true則為追加模式,false則為覆蓋模式
FileOutputStream(File file,boolean append):同上
常用方法:
void write(int d):向文件中寫入一個字節(jié),寫入的是int值2進制的低八位。
void write(byte[] data):向文件中塊寫數(shù)據(jù)。將數(shù)組data中所有字節(jié)一次性寫入文件。
void write(byte[] data,int off,int len):向文件中快寫數(shù)據(jù)。將數(shù)組data中從下標off開始的連續(xù)len個字節(jié)一次性寫入文件。
java.io.FileInputStream文件輸入流,繼承自java.io.InputStream
常用構造器
FileInputStream(String pathname) 創(chuàng)建讀取指定路徑下對應的文件的文件輸入流,如果指定的文件不存在則會拋出異常java.io.FileNotFoundException
FileInputStream(File file) 創(chuàng)建讀取File表示的文件的文件輸入流,如果File表示的文件不存在則會拋出異常java.io.IOException。
常用方法
int read():從文件中讀取一個字節(jié),返回的int值低八位有效,如果返回的int值為整數(shù)-1則表示讀取到了文件末尾。
int read(byte[] data):塊讀數(shù)據(jù),從文件中一次性讀取給定的data數(shù)組總長度的字節(jié)量并從數(shù)組第一個元素位置開始存入數(shù)組中。返回值為實際讀取到的字節(jié)數(shù)。如果返回值為整數(shù)-1則表示讀取到了文件末尾。
緩沖流
緩沖流是一對高級流,在流鏈接中鏈接它的目的是加快讀寫效率。緩沖流內(nèi)部默認緩沖區(qū)為8kb,緩沖流總是塊讀寫數(shù)據(jù)來提高讀寫效率。
java.io.BufferedOutputStream緩沖字節(jié)輸出流,繼承自java.io.OutputStream
常用構造器
????BufferedOutputStream(OutputStream out):創(chuàng)建一個默認8kb大小緩沖區(qū)的緩沖字節(jié)輸出流,并連接到參數(shù)指定的字節(jié)輸出流上。
????BufferedOutputStream(OutputStream out,int size):創(chuàng)建一個size指定大小(單位是字節(jié))緩沖區(qū)的緩沖字節(jié)輸出流,并連接到參數(shù)指定的字節(jié)輸出流上。
常用方法
flush():強制將緩沖區(qū)中已經(jīng)緩存的數(shù)據(jù)一次性寫出
緩沖流的寫出方法功能與OutputStream上一致,需要知道的時write方法調用后并非實際寫出,而是先將數(shù)據(jù)存入緩沖區(qū)(內(nèi)部的字節(jié)數(shù)組中),當緩沖區(qū)滿了時會自動寫出一次。
java.io.BufferedInputStream緩沖字節(jié)輸出流,繼承自java.io.InputStream
常用構造器
????BufferedInputStream(InputStream in):創(chuàng)建一個默認8kb大小緩沖區(qū)的緩沖字節(jié)輸入流,并連接到參數(shù)指定的字節(jié)輸入流上。
????BufferedInputStream(InputStream in,int size):創(chuàng)建一個size指定大小(單位是字節(jié))緩沖區(qū)的緩沖字節(jié)輸入流,并連接到參數(shù)指定的字節(jié)輸入流上。
常用方法
緩沖流的讀取方法功能與InputStream上一致,需要知道的時read方法調用后緩沖流會一次性讀取緩沖區(qū)大小的字節(jié)數(shù)據(jù)并存入緩沖區(qū),然后再根據(jù)我們調用read方法讀取的字節(jié)數(shù)進行返回,直到緩沖區(qū)所有數(shù)據(jù)都已經(jīng)通過read方法返回后會再次讀取一組數(shù)據(jù)進緩沖區(qū)。即:塊讀取操作
對象流
對象流是一對高級流,在流鏈接中的作用是完成對象的序列化與反序列化
序列化:是對象輸出流的工作,將一個對象按照其結構轉換為一組字節(jié)的過程。
反序列化:是對象輸入流的工作,將一組字節(jié)還原為對象的過程。
java.io.ObjectInputStream對象輸入流,繼承自java.io.InputStream
常用構造器
ObjectInputStream(InputStream in):創(chuàng)建一個對象輸入流并連接到參數(shù)in這個輸入流上。
常用方法
Object readObject():進行對象反序列化,將讀取的字節(jié)轉換為一個對象并以Object形式返回(多態(tài))。
如果讀取的字節(jié)表示的不是一個java對象會拋出異常:java.io.ClassNotFoundException
java.io.ObjectOutputStream對象輸出流,繼承自java.io.OutputStream
常用構造器
ObjectOutputStream(OutputStream out):創(chuàng)建一個對象輸出流并連接到參數(shù)out這個輸出流上
常用方法
void writeObject(Object obj):進行對象的序列化,將一個java對象序列化成一組字節(jié)后再通過連接的輸出流將這組字節(jié)寫出。
如果序列化的對象沒有實現(xiàn)可序列化接口:java.io.Serializable就會拋出異常:java.io.NotSerializableException
序列化接口java.io.Serrializable
該接口沒有任何抽象方法,但是只有實現(xiàn)了該接口的類的實例才能進行序列化與反序列化。
實現(xiàn)了序列化接口的類建議顯示的定義常量:static final long serialVersionUID = 1L;
可以為屬性添加關鍵字transient,被該關鍵字修飾的屬性在序列化是會被忽略,達到對象序列化瘦身的目的。
字符流
java將流按照讀寫單位劃分為字節(jié)與字符流。字節(jié)流以字節(jié)為單位讀寫,字符流以字符為單位讀寫。
轉換流java.io.InputStreamReader和OutputStreamWriter
功能無需掌握,了解其核心意義:
1:銜接其它字節(jié)與字符流
2:將字符與字節(jié)進行轉換
相當于是現(xiàn)實中的"轉換器"
PrintWriter
具有自動行刷新功能的緩沖字符輸出流
構造器:
PrintWriter(String filename)
PrintWriter(File file)
常用方法:
void println(String line):按行寫出字符串
緩沖字符輸出流需要記住的是PrintWriter和BufferedReader
作用:
1:塊寫或塊讀文本數(shù)據(jù)加速
2:可以按行寫或讀字符串
java.io.PrintWriter 具有自動行刷新的緩沖字符輸出流
常用構造器
PrintWriter(String filename) :可以直接對給定路徑的文件進行寫操作
PrintWriter(File file):可以直接對File表示的文件進行寫操作
上述兩種構造器內(nèi)部會自動完成流連接操作。
PrintWriter(OutputStream out):將PW鏈接在給定的字節(jié)流上(構造方法內(nèi)部會自行完成轉換流等流連接)
PrintWriter(Writer writer):將PW鏈接在其它字符流上
PrintWriter(OutputStream out,boolean autoflush)
PrintWriter(Writer writer,boolean autoflush)
上述兩個構造器可以在鏈接到流上的同時傳入第二個參數(shù),如果該值為true則開啟了自動行刷新功能。
常用方法
void println(String line):按行寫出一行字符串
特點
自動行刷新,當打開了該功能后,每當使用println方法寫出一行字符串后就會自動flush一次
java異常處理機制:
異常處理機制是用來處理那些可能存在的異常,但是無法通過修改邏輯完全規(guī)避的場景。
而如果通過修改邏輯可以規(guī)避的異常是bug,不應當用異常處理機制在運行期間解決!應當在編碼時及時修正
try語句塊用來包含可能出錯的代碼片段
catch用來捕獲并處理對應的異常,可以定義多個,也可以合并多個異常在一個catch中。
finally是異常的最后一塊,只要程序執(zhí)行到try中則必走。一般用于釋放資源這類操作。
throw用于主動對外拋出異常。要么是滿足語法不滿足業(yè)務主動拋出異常,要么就是實際發(fā)生了異常但是不應當在當前代碼片段被解決是拋出。具體情況要結合實際業(yè)務分析。