File是文件和目錄路徑名的抽象表示形式,即File類是文件或目錄的路徑,而不是文件自己,所以File類不能直接訪問文件內容自己,若是須要訪問文件內容自己,則須要使用輸入/輸出流。html
File類的對象用來表示文件和文件夾的對象。java
若是這個路徑名對應的文件或目錄不存在,那麼在堆中的File對象的成員變量就是默認值。程序員
若是這個路徑名對應的文件或目錄存在,那麼在堆中的File對象就根據這個路徑找到對應的文件或目錄,而後將一些信息獲取到爲File對象的成員變量賦值數組
方法簽名 | 方法功能 |
---|---|
File(String pathName) | 根據文件、目錄的路徑名構建File對象 |
File(String parent, String child) | 構建File對象,路徑名經過指定父目錄與子目錄方式來指定 |
public File(File parent,String child) | 從父抽象路徑名和子路徑名字符串建立新的 File實例 |
String getName() | 獲取文件名 |
long length() | 獲取文件大小,沒法直接獲取目錄大小,空目錄返回0 |
String getPath() | 獲取構造路徑 |
String getAbsolutePath() | 獲取絕對路徑 |
String getCanonicalPath() | 獲取規範路徑 |
long lastModified() | 獲取文件最後修改時間 |
boolean isFile() | 判斷是不是文件 |
boolean isDirectory() | 判斷是不是目錄 |
boolean exists() | 判斷文件或目錄是否實際存在 |
boolean isHidden() | 判斷是否隱藏 |
boolean isAbsolute() | 判斷是不是絕對路徑 |
boolean canRead() | 判斷是否可讀 |
boolean canWrite() | 判斷是否可寫 |
createNewFile() | 當且僅當具備該名稱的文件尚不存在時,建立文件 |
mkdir()或mkdirs() | 建立目錄 |
delete() | 刪除文件或空目錄 |
renameTo(File dest) | 重命名文件或目錄 |
String[] list() | 獲取目錄裏面的文件或子目錄,返回String數組 |
File[] listFiles() | 獲取目錄裏面的文件或子目錄,返回File數組 |
File[] listFiles(FileFilter filter) | 根據過濾條件獲取目錄裏面的文件或子目錄 |
不管該路徑下是否存在文件或者目錄,都不影響File對象的建立。app
若是文件或目錄不存在,那麼exists()、isFile()和isDirectory()都是返回false編碼
調用listFiles方法的File對象,表示的必須是實際存在的目錄,不然返回null,沒法進行遍歷。spa
code
相對路徑:相對於項目目錄的路徑,這是一個便捷的路徑,開發中常用。htm
規範路徑:所謂規範路徑名,即對路徑中的「..」等進行解析後的路徑名對象
public static File createTempFile(String prefix,String suffix) throws IOException在默認臨時文件目錄中建立一個空文件,使用給定前綴和後綴生成其名稱。調用此方法等同於調用 createTempFile(prefix, suffix, null)。
prefix - 用於生成文件名的前綴字符串;必須至少三個字符。
suffix - 用於生成文件名的後綴字符串;若是爲 null,默認爲 ".tmp"
public static File createTempFile(String prefix,String suffix,File directory)throws IOException在指定目錄中建立一個新的空文件,使用給定的前綴和後綴字符串生成其名稱。
prefix - 用於生成文件名的前綴字符串;必須至少三個字符。
suffix - 用於生成文件名的後綴字符串;若是爲 null,默認爲 ".tmp"
directory - 將建立的文件所在的目錄;若是使用默認臨時文件目錄,則該參數爲 null
Stream即流向內存的是輸入流(Reader,Input),流出內存的輸出流(Writer,Output)。
以InputStream,Reader結尾
輸出流 :把數據從內存
中寫出到其餘設備
上的流。
以OutputStream、Writer結尾
以InputStream和OutputStream結尾
字符流 :以字符爲單位,讀寫數據的流。
以Reader和Writer結尾
處理流:是對一個已存在的流進行鏈接和封裝,經過所封裝的流的功能調用實現數據讀寫。如BufferedReader.處理流的構造方法老是要帶一個其餘的流對象作參數。而且可進行屢次包裝
int read(byte[] data):一次讀取多個字節,最多讀取data.length個,把讀取的數據放到data中,從data[0]開始存儲,若是流中沒有data.length個,那麼有幾個讀取幾個,返回實際讀取的字節的個數。若是流中沒有數據了,返回-1。
int read(byte[] data, int offset, int count):一次讀取多個字節,最多讀取count個,把讀取的數據放到data中,從data[offset]開始存儲,若是流中沒有count個,那麼有幾個讀取幾個,返回實際讀取的字節的個數。若是流中沒有數據了,返回-1。
void close():關閉流資源
public void flush()
:刷新此輸出流並強制任何緩衝的輸出字節被寫出。
public void write(byte[] b)
:將 b.length字節從指定的字節數組寫入此輸出流。
public void write(byte[] b, int off, int len)
:從指定的字節數組寫入 len字節,從偏移量 off開始輸出到此輸出流。
public abstract void write(int b)
:將指定的字節輸出流。
繼承InoutStream方法同上,文件輸入流,從文件中讀取字節。
FileInputStream(File file)
: 經過打開與實際文件的鏈接來建立一個 FileInputStream ,該文件由文件系統中的 File對象 file命名。
FileInputStream(String name)
: 經過打開與實際文件的鏈接來建立一個 FileInputStream ,該文件由文件系統中的路徑名 name命名。
當你建立一個流對象時,必須傳入一個文件路徑。該路徑下,若是沒有該文件,會拋出FileNotFoundException
。
long skip(long n) :從輸入流中跳過並丟棄 n 個字節的數據。
繼承OutputStream方法同上,文件輸出流,用於將數據寫出到文件。
public FileOutputStream(File file)
public FileOutputStream(String name)
: 建立文件輸出流以指定的名稱寫入文件。
public FileOutputStream(File file, boolean append):指定 File 對象的文件輸出流,append爲true 。
當你建立一個流對象時,必須傳入一個文件路徑。該路徑下,若是沒有這個文件,會建立該文件。若是有這個文件,會清空這個文件的數據,或指定追加。
Windows系統裏,每行結尾是 回車+換行
,即\r\n
;
Unix系統裏,每行結尾只有 換行
,即\n
;
Mac系統裏,每行結尾是 回車
,即\r
。從 Mac OS X開始與Linux統一。
流的關閉原則:先開後關,後開先關。
抽象類以字符爲單位讀寫數據,專門用於處理文本文件
public int read()
: 讀取一個字符,若是已經到達流末尾,沒有數據可讀了,返回-1.
public int read(char[] cbuf)
: 讀取多個字符到data數組中,從data[0]開始存儲,最多讀取data.length個字符。返回的是實際讀取的字符數。若是已經到達流末尾,沒有數據可讀了,返回-1.
public void close()
:關閉此流並釋放與此流相關聯的任何系統資源繼承Reader類是讀取字符文件的便利類。構造時使用系統默認的字符編碼和默認字節緩衝區。
FileReader(File file)
: 建立一個新的 FileReader ,給定要讀取的File對象。
FileReader(String fileName)
: 建立一個新的 FileReader ,給定要讀取的文件的名稱。
當你建立一個流對象時,必須傳入一個文件路徑。其方法同上繼承父類方法
雖然讀取了一個字符,可是會自動提高爲int類型。
抽象類表示用於寫出字符流,將指定的字符信息寫出到目的地
void write(char[] cbuf)
寫入字符數組。
abstract void write(char[] cbuf, int off, int len)
寫入字符數組的某一部分,off數組的開始索引,len寫的字符個數。
void write(String str)
寫入字符串。
void write(String str, int off, int len)
寫入字符串的某一部分,off字符串的開始索引,len寫的字符個數。
void flush()
刷新該流的緩衝。
void close()
關閉此流,但要先刷新它。
繼承Writer類是寫出字符文件的便利類。構造時使用系統默認的字符編碼和默認字節緩衝區。
FileWriter(File file)
: 建立一個新的 FileWriter,給定要讀取的File對象。
FileWriter(String fileName)
: 建立一個新的 FileWriter,給定要讀取的文件的名稱。
未調用close方法,數據只是保存到了緩衝區,並未寫出到文件中,即使是flush方法寫出了數據,操做的最後仍是要調用close方法,釋放系統資源。
(1)建立合適的IO流的對象
(2)讀、寫
(3)關閉IO流
要麼只關閉最外層的IO流,要是都關的話,注意順序,先關外面的再關裏面的。
緩衝流的基本原理,是在建立流對象時,會建立一個內置的默認大小的緩衝區數組,經過緩衝區讀寫,減小系統IO次數,從而提升讀寫的效率。
public BufferedOutputStream(OutputStream out)
: 建立一個新的緩衝輸出流。亦可指定緩衝區大小(OutputStream out, int size)
字符緩衝流:BufferedReader
,BufferedWriter
public BufferedWriter(Writer out)
: 建立一個新的緩衝輸出流。亦可指定緩衝區大小(Writer out, int sz)
字符緩衝流的特有方法。
BufferedWriter:public void newLine()
: 寫一行行分隔符,由系統屬性定義符號。
編碼:字符(能看懂的)-->字節(看不懂的)
InputStreamReader(InputStream in, String charsetName)
: 建立一個指定字符集的字符流。
是Reader的子類,用來解碼包裝字節流,把字節輸入流包裝爲字符輸入流。
應用場景:讀取源爲字符類型的字節流可指定字符集解碼成字符流,以便閱讀
OutputStreamWriter(OutputStream in, String charsetName)
: 建立一個指定字符集的字符流。
是Writer的子類,用來編碼包裝字節流,把字節輸出流包裝爲字符輸出流。
應用場景:可將要寫入的字符源爲字節流的數據轉爲字符類型寫入並可按指定字符集再編碼成字節存儲
轉換流是字節與字符間的橋樑
繼承字節流可直接處理Java的基本數據類型,要求讀寫順序一一對應
DataOutputStream:數據輸出流
writeUTF(String)
writeInt(int)
writeDouble(double)
writeChar(char)
writeBoolean(boolean)
DataInputStream:數據輸入流
String readUTF()
int readInt()
double readDouble()
char readChar()
public final void writeObject (Object obj)
: 將指定的對象寫出到OutputStream流。
若是對象的某個屬性也是引用數據類型,那麼若是該屬性也要序列化的話,也要實現Serializable
接口
該類的全部屬性必須是可序列化的。若是有一個屬性不須要可序列化的,則該屬性必須註明是瞬態的,使用transient
關鍵字修飾。
靜態變量的值不會序列化
public final Object readObject ()
: 讀取一個對象到InputStream流。
另外,當JVM反序列化對象時,能找到class文件,可是class文件在序列化對象以後發生了修改,那麼反序列化操做也會失敗,拋出一個InvalidClassException
異常。發生這個異常的緣由以下:
該類的序列版本號與從流中讀取的類描述符的版本號不匹配
該類包含未知數據類型
Serializable
接口給須要序列化的類,提供了一個序列版本號。serialVersionUID
該版本號的目的在於驗證序列化的對象和對應類是否版本匹配。
實現這個接口,能夠自定義須要被系列化的屬性使得對象可以被序列化,可是要求程序員重寫兩個方法:
void writeExternal(ObjectOutput out) :編寫哪些屬性須要序列化
void readExternal(ObjectInput in) :編寫哪些屬性須要反序列化
注意:讀取的順序要與寫的順序一致,雖然能夠本身決定任意屬性的輸出和讀取,可是仍是建議不要輸出靜態的和transient屬性。
字節流該類
可以方便地打印各類數據類型的值,是一種便捷的輸出方式。System.in:InputStream類型對象
System.out:PrintStream類型對象
System.err:PrintStream類型對象
有多個構造方法可由多種方式生成從指定流的掃描對象,並實現了迭代器接口
Xxx nextXxx(): 將輸入信息的下一個標記掃描爲一個Xxx
語法格式:
try(須要關閉的資源對象的聲明){
業務邏輯代碼
}catch(異常類型 e){
處理異常代碼
}catch(異常類型 e){
處理異常代碼
}
....
它沒有finally,也不須要程序員去關閉資源對象,不管是否發生異常,都會關閉資源對象