文件的幾種創(chuàng)建方式和刪除:
IO流的概念:
IO流用來(lái)處理設(shè)備之間的數(shù)據(jù)傳輸
Java對(duì)數(shù)據(jù)的操作是通過(guò)流的方式
Java用于操作流的類都在IO包中
流按流向分為兩種:輸入流创泄,輸出流。
流按操作類型分為兩種:
字節(jié)流 : 字節(jié)流可以操作任何數(shù)據(jù),因?yàn)樵谟?jì)算機(jī)中任何數(shù)據(jù)都是以字節(jié)的形式存儲(chǔ)的
字符流 : 字符流只能操作純字符數(shù)據(jù)铃在,比較方便。
java中流的體系圖:
IO流常用父類:
字節(jié)流的抽象父類:InputStream? ? ? ? ??OutputStream
字符流的抽象父類:Reader? ? ? ? ? ? ? ? ? ?Writer
IO流中的輸入輸出流以及流的關(guān)閉
關(guān)流的正確方式:
輸入流與輸出流的區(qū)別:當(dāng)你去輸出的時(shí)候疤剑,文件不存在會(huì)幫我們自動(dòng)創(chuàng)建白热,當(dāng)我們?nèi)ポ斎氲臅r(shí)候,文件不存在就會(huì)報(bào)錯(cuò)
文件的賦值:
例1:一個(gè)一個(gè)字節(jié)存(很慢)
例2:用數(shù)組存放:
flush和close方法的區(qū)別
flush()方法
用來(lái)刷新緩沖區(qū)的,刷新后可以再次寫(xiě)出
close()方法
用來(lái)關(guān)閉流釋放資源的的,如果是帶緩沖區(qū)的流對(duì)象的close()方法,不但會(huì)關(guān)閉流,還會(huì)再關(guān)閉流之前刷新緩沖區(qū),關(guān)閉后不能再寫(xiě)出
文件加密:
文件追加
BufferedInputStream/BufferOutputStream(僅作了解)
A:緩沖思想
字節(jié)流一次讀寫(xiě)一個(gè)數(shù)組的速度明顯比一次讀寫(xiě)一個(gè)字節(jié)的速度快很多叨粘,
這是加入了數(shù)組這樣的緩沖區(qū)效果,java本身在設(shè)計(jì)的時(shí)候瘤睹,
B.BufferedInputStream
BufferedInputStream內(nèi)置了一個(gè)緩沖區(qū)(數(shù)組)
從BufferedInputStream中讀取一個(gè)字節(jié)時(shí)
BufferedInputStream會(huì)一次性從文件中讀取8192個(gè), 存在緩沖區(qū)中, 返回給程序一個(gè)
程序再次讀取時(shí), 就不用找文件了, 直接從緩沖區(qū)中獲取
直到緩沖區(qū)中所有的都被使用過(guò), 才重新從文件中讀取8192個(gè)
C.BufferedOutputStream
BufferedOutputStream也內(nèi)置了一個(gè)緩沖區(qū)(數(shù)組)
程序向流中寫(xiě)出字節(jié)時(shí), 不會(huì)直接寫(xiě)到文件, 先寫(xiě)到緩沖區(qū)中
直到緩沖區(qū)寫(xiě)滿, BufferedOutputStream才會(huì)把緩沖區(qū)中的數(shù)據(jù)一次性寫(xiě)到文件里
D.拷貝的代碼
```java FileInputStream fis = new FileInputStream("致青春.mp3");
//創(chuàng)建文件輸入流對(duì)象,關(guān)聯(lián)致青春.mp3
BufferedInputStream bis = new BufferedInputStream(fis);
//創(chuàng)建緩沖區(qū)對(duì)fis裝飾
FileOutputStream fos = new FileOutputStream("copy.mp3");
//創(chuàng)建輸出流對(duì)象,關(guān)聯(lián)copy.mp3
BufferedOutputStream bos = new BufferedOutputStream(fos);
//創(chuàng)建緩沖區(qū)對(duì)fos裝飾
int b;
while((b = bis.read()) != -1) {
????????????bos.write(b);
}
bis.close();
//只關(guān)裝飾后的對(duì)象即可 bos.close(); ```
E.小數(shù)組的讀寫(xiě)和帶Buffered的讀取哪個(gè)更快?
定義小數(shù)組如果是8192個(gè)字節(jié)大小和Buffered比較的話
定義小數(shù)組會(huì)略勝一籌,因?yàn)樽x和寫(xiě)操作的是同一個(gè)數(shù)組
而B(niǎo)uffered操作的是兩個(gè)數(shù)組
對(duì)象輸入流:(創(chuàng)建對(duì)象不一定會(huì)調(diào)用構(gòu)造器升敲,調(diào)用構(gòu)造器一定會(huì)創(chuàng)建對(duì)象)
將對(duì)象寫(xiě)入流里面這個(gè)過(guò)程稱為序列化,如果一個(gè)對(duì)象要序列化那么這個(gè)對(duì)象的類就必須實(shí)現(xiàn)序列化接口Serializable 的類所產(chǎn)生的對(duì)象才能夠?qū)懭肓?/b>
當(dāng)把一個(gè)容器序列化轰传,那么該容器的數(shù)據(jù)也會(huì)被序列化
如果一個(gè)對(duì)象要序列化那么這個(gè)對(duì)象的類就必須實(shí)現(xiàn)序列化接口
只有實(shí)現(xiàn)了序列化接口的類所產(chǎn)生的對(duì)象才能寫(xiě)入流
從流中將對(duì)象讀取出來(lái)的過(guò)程被稱為反序列化驴党,不會(huì)去調(diào)用對(duì)象的構(gòu)造器?
序列化與反序列化:
? ??????序列化:將對(duì)象轉(zhuǎn)換成字節(jié)序列
? ? ? ? 反序列化:從字節(jié)序列中恢復(fù)對(duì)象? ? ?從流中讀取對(duì)象
ByteArrayOutPutStream:內(nèi)存輸出流 (輸入流不需要掌握)
DataOutputStream DataInputStream數(shù)據(jù)輸出輸入流(用的不是很多,但是需要掌握):這個(gè)流一般用來(lái)讀取基本數(shù)據(jù)類型获茬,可以寫(xiě)到內(nèi)存中也可以寫(xiě)到文件中? 怎么存就怎么取港庄,例如以byte寫(xiě)入文件,讀文件以byte去讀
字符流:
FileReader:
BufferedReader:
FileWriter:(這個(gè)流已經(jīng)不常用了)
PrintWriter:(常用):
BufferedWriter:(不常用)
兩種方式實(shí)現(xiàn)鍵盤(pán)錄入
A:BufferedReader的readLine方法恕曲。
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
B:Scanner
例:
RandomAccessFile隨機(jī)讀取流(必須掌握):RandomAccessFile類不屬于流鹏氧,是Object類的子類。但它融合了InputStream和OutputStream的功能佩谣。支持對(duì)隨機(jī)訪問(wèn)文件的讀取和寫(xiě)入把还。
Properties
A:Properties的概述
Properties 類表示了一個(gè)持久的屬性集。
Properties 可保存在流中或從流中加載。
屬性列表中每個(gè)鍵及其對(duì)應(yīng)值都是一個(gè)字符串吊履。
B:案例演示Properties作為Map集合的使用?
Properties的特殊功能使用
A:Properties的特殊功能
public Object setProperty(String key,String value)
public String getProperty(String key)
public Enumeration?stringPropertyNames()