1.IO流的基礎(chǔ) File
? ???implements Serializable,Comparable
? ? 1.基本定義 :
? ? ? ? ? ? ? ?IO包中唯一代表磁盤文件本身的對象
? ? 2.基本操作 【這里用文件來做例子瓤漏,而不是文件夾】
? ? ? ? ? ? ? step 1 : 定義一個File : File file = new File("temp.txt");?
? ? ? ? ? ? ? ? ? ? 注意這里只是定義了一個File的對象,文件還并沒有創(chuàng)建
? ? ? ? ? ? step 2 :創(chuàng)建File :
? ? ? ? ? if(!file.exists()){? ? ? ?//判斷文件是否存在
? ? ? ? ? ? ? ? file.createNewFile() ; //這里會拋出一個異常松忍,Try_Catch住
??????????}
? ? ? ? ? ? step 3 : 其它操作
#獲取相對路勁:file.getPath() =>temp.txt??
#獲取絕對路徑 :? file.getAbsolutePath() => C:/demo/temp.txt
注意 :
? ? 如果File file = new File("C:/demo/temp.txt"),那么通過以上兩個方法獲取的路徑就是一樣的
#文件的大小 : file.length();
#文件是否存在 : file.exists();
#刪除文件 : file.delete();
? ? ? ? 注意洞慎,如果file是一個文件夾创南,那么刪除是返回false 失敗的
#路徑分割符? File.separator
????????根據(jù)不同的操作系統(tǒng)取不同操作系統(tǒng)下的分隔符 在window是 “\”
? ? ? ? File.pathSeparator,在window下是“积蜻;”(分號)荐糜,這個得注意
2.字節(jié)流 : InputStream / OutputStream
? ? 1.字節(jié)輸入流 : InputStream implements Closeable
#? 讀取數(shù)據(jù)方法
read() : 如果下一個字節(jié)可讀取论咏,返回一個整形钓瞭,遇到文件末尾浊竟,返回-1
read(byte[])?
read(byte[] byte,int offset,int len)?
這三個read方法怨喘,在輸入數(shù)據(jù)可用,檢測到流末尾或者異常前振定,此方法都將一直阻塞
# 獲取可讀取的文字?jǐn)?shù) : InputStream # int available()?
? ? 2.字節(jié)輸出流 : OutputStream implements Closeable, Flushable
#構(gòu)造方法
FileoutputStream(String) ->FileOutputStream(String path必怜,boolean append);
如果傳入FileoutputStream中的File的文件不存在,那么會在new FileoutputStream(String path)的時候自動創(chuàng)建一個path對應(yīng)的File
#.寫入調(diào)用的API 流程 :
write(byte[]) ->write(byte[] byte,int offset,int byteLength)->write(int)
3.字符流 :Reader / Writer
#.tips : 獲取JDK環(huán)境變量的方法 :
? ? System.getProperties().list(System.out);
? ?查看 file.encoding = Xxx 屬性
#.字符編碼
?//使用GBK編碼的字節(jié)數(shù)組 后频,寫入和讀取的時候梳庆,盡量保持一致
? ? byte[] demo = "Java基礎(chǔ)".getBytes("GBK");?
? ? 1.字符輸入流 : Reader implements Readable, Closeable? ? ? ?
? ? 2.字符輸出流 : Writer implements Appendable, Closeable, Flushable?
4.增加 Buff : BufferedXxx?
? ??????為了達到最高的效率,避免頻繁地進行字符與字節(jié)之間的相互轉(zhuǎn)換卑惜,最好不要直接使用FileReader和FileWriter這兩個類進行讀寫靠益,而使用BufferedWriter包裝OutputStreamWriter,使用BufferedReader包裝InputStreamReader残揉。
注意 :?
? ??1胧后、利用BufferedWriter進行寫操作,寫入的內(nèi)容會放在緩沖區(qū)內(nèi)抱环,直到遇到close()壳快、flush()的時候才會將內(nèi)容一次性寫入文件。另外注意close()的順序镇草,一定要先關(guān)閉BufferedWriter眶痰,再關(guān)閉Writer,不可以倒過來梯啤,因為BufferedWriter的寫操作是通過Writer的write方法寫的竖伯,如果先關(guān)閉Writer的話,就無法將緩沖區(qū)內(nèi)的數(shù)據(jù)寫入文件了因宇,會拋出異常
2七婴、利用BufferedReader進行讀操作,不可以用父類Reader指向它察滑,因為readLine()這個方法是BufferedReader獨有的打厘,readLine()的作用是逐行讀取文件中的內(nèi)容
5.總結(jié)
1.字節(jié)流和字符流的區(qū)別:
? ? ? ? API : 字節(jié)流中write ()是byte[] 或者int , 字符流中確實 char[]
? ? ? ? 本質(zhì): 字節(jié)流直接操作文件贺辰,針對的是單個字節(jié)的操作户盯,而字符是通過StreamDecoder把InputStream讀取數(shù)據(jù)到內(nèi)存中字節(jié)進行解碼成字符嵌施,然后再刷入到指定文件的,所以字符流針對的是字符(2* byte)? ??
2.字符流和添加了BufferedXxx的對應(yīng)字符流莽鸭,都是用到內(nèi)存緩存吗伤,這兩者的區(qū)別?
? ? 首先硫眨,添加BufferedReader之類的作用為了避免FileReader頻繁的字節(jié)轉(zhuǎn)字符的操作
? ? 其次足淆,同樣具有內(nèi)存緩存,區(qū)別就在于捺球,F(xiàn)ileWriter之類的是每次或取數(shù)據(jù)都是字節(jié)先轉(zhuǎn)字符后到內(nèi)存缸浦,而BufferedWriter確實直接先讀到內(nèi)存,滿了之后或者調(diào)用Flush氮兵,再調(diào)用FileWriter把緩存中的數(shù)據(jù)寫入
3.字節(jié)流轉(zhuǎn)字符流
? ? new BufferedReader(new InputSteamReader(new FileInputStream(new File("temp.txt")));
? ? 此外,outputStreamWriter 和 InputStreamReader 的都有主動設(shè)置Charset的構(gòu)造方法
6.一些其它的流 : Other流
對象流 : ObjectOutputStream / ObjectInputStream
DataInputStream / DataOutputStream
RandomAccessFile