?愛在開頭
?博客主頁(yè):努力的小鳴人
?系列專欄:JavaSE超詳總結(jié)??
?歡迎小伙伴們,點(diǎn)贊??關(guān)注??收藏??一起學(xué)習(xí)!
?如有錯(cuò)誤的地方,還請(qǐng)小伙伴們指正!??
??系列傳送門:JavaSE超詳總結(jié)??
【附章5計(jì)算機(jī)字符編碼】多種字符編碼集的說(shuō)明【熱榜】
【11章Java泛型】全面解讀Java泛型【熱榜】
【10章Java集合】幾張腦圖帶你進(jìn)入Java集合的頭腦風(fēng)暴【熱榜】
【09章Java注解】讓你全面認(rèn)識(shí)這未來(lái)潛力巨大的「注解」【熱榜】
??彩蛋:
??牛客網(wǎng)是一個(gè)兼具 面經(jīng)、刷題、求職 的神器,是我們的最佳選擇,我用過(guò)很不錯(cuò)呢~ ??點(diǎn)擊注冊(cè)開始刷題
小鳴人因?yàn)闇?zhǔn)備考研,學(xué)完C++準(zhǔn)備淺練下算法,后續(xù)會(huì)推出??途W(wǎng)刷題記錄專欄
,到時(shí)希望大家多多關(guān)注~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-415599.html
一、Java IO流
I/O是Input/Output的縮寫, I/O技術(shù)是非常實(shí)用的技術(shù),用于處理設(shè)備之間的數(shù)據(jù)傳輸:如讀/寫文件,網(wǎng)絡(luò)通訊等
-
java.io
包下提供了各種“流”類和接口,以獲取不同種類的數(shù)據(jù)并通過(guò)標(biāo)準(zhǔn)的方法輸入或輸出數(shù)據(jù) - ●輸入input:讀取外部數(shù)據(jù)(磁盤、光盤等存儲(chǔ)設(shè)備數(shù)據(jù))到程序(內(nèi)存)中。
●輸出output:將程序(內(nèi)存)數(shù)據(jù)輸出到磁盤、光盤等存儲(chǔ)設(shè)備中。 - Java的IO流共涉及40多個(gè)類,實(shí)際上非常規(guī)則,都是從如下4個(gè)抽象基類派生的
??InputStream
InputStream 和 Reader 是所有輸入流的基類
InputStream 其典型實(shí)現(xiàn):FileInputStream
- FileInputStream用于讀取非文本數(shù)據(jù)之類的原始字節(jié)流
- 方法
??Reader
InputStream 和 Reader 是所有輸入流的基類
Reader 其典型實(shí)現(xiàn):FileReader
- 讀取字符流,需要使用 FileReader
- 方法
??OutputStream
方法
??Writer
方法
二、File類
java.io.File類
文件和文件目錄路徑
- File 能新建、刪除、重命名文件和目錄,但 File 不能訪問(wèn)文件內(nèi)容本身。如果需要訪問(wèn)文件內(nèi)容本身,則需要使用輸入/輸出流,下面會(huì)說(shuō)到
- File對(duì)象可以作為參數(shù)傳遞給流的構(gòu)造器
- 路徑中的每級(jí)目錄之間用一個(gè)路徑分隔符隔開
路徑分隔符和系統(tǒng)有關(guān):
●windows和DOS系統(tǒng)默認(rèn)使用“\”來(lái)表示
●UNIX和URL使用“/”來(lái)表示
File file = new File("D:\\文件.txt");
??常用構(gòu)造器
-
public File(String pathname)
以pathname為路徑創(chuàng)建File對(duì)象,可以是絕對(duì)路徑或者相對(duì)路徑,如果pathname是相對(duì)路徑,則默認(rèn)的當(dāng)前路徑在系統(tǒng)屬性u(píng)ser.dir中存儲(chǔ)
●絕對(duì)路徑:是一個(gè)固定的路徑,從盤符開始
●相對(duì)路徑:是相對(duì)于某個(gè)位置開始 -
public File(String parent,String child)
以parent為父路徑,child為子路徑創(chuàng)建File對(duì)象 -
public File(File parent,String child)
根據(jù)一個(gè)父File對(duì)象和子文件路徑創(chuàng)建File對(duì)象
??常用方法
三、流的分類
- 操作數(shù)據(jù)單位:字節(jié)流(8 bit)、字符流(16 bit)
- 數(shù)據(jù)的流向:輸入流、輸出流
- 流的角色:字節(jié)流、處理流
- 體系結(jié)構(gòu):抽象基類、節(jié)點(diǎn)流、處理流
- 節(jié)點(diǎn)流:直接從數(shù)據(jù)源或目的地讀寫數(shù)據(jù)
-
處理流:不直接連接到數(shù)據(jù)源或目的地,而是“連接”在已存在的流(節(jié)點(diǎn)流或處理流)之上,通過(guò)對(duì)數(shù)據(jù)的處理為程序提供更為強(qiáng)大的讀寫功能
?
??節(jié)點(diǎn)流
文件流
讀取文件步驟
-
建立一個(gè)流對(duì)象,將已存在的一個(gè)文件加載進(jìn)流
FileReader fr = new FileReader(new File(“Test.txt”)); -
創(chuàng)建一個(gè)臨時(shí)存放數(shù)據(jù)的數(shù)組
char[] ch = new char[1024]; -
調(diào)用流對(duì)象的讀取方法將流中的數(shù)據(jù)讀入到數(shù)組中
fr.read(ch); -
關(guān)閉資源
fr.close();
FileReader fr = null;
try {
fr = new FileReader(new File("c:\\test.txt"));
char[] buf = new char[1024];
int len;
while ((len = fr.read(buf)) != -1) {
System.out.print(new String(buf, 0, len));
}
} catch (IOException e) {
System.out.println("read-Exception :" + e.getMessage());
} finally {
if (fr != null) {
try {
fr.close();
} catch (IOException e) {
System.out.println("close-Exception :" + e.getMessage());
}
}
}
寫入文件步驟
-
創(chuàng)建流對(duì)象,建立數(shù)據(jù)存放文件
FileWriter fw = new FileWriter(new File(“Test.txt”)); -
調(diào)用流對(duì)象的寫入方法,將數(shù)據(jù)寫入流
fw.write(“atguigu-songhongkang”); -
關(guān)閉流資源,并將流中的數(shù)據(jù)清空到文件中
fw.close();
FileWriter fw = null;
try {
fw = new FileWriter(new File("Test.txt"));
fw.write("atguigu-songhongkang");
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fw != null)
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
??節(jié)點(diǎn)流注意點(diǎn)
- 定義文件路徑時(shí),注意:
可以用“/”或者“\\”
- 在讀取文件時(shí),必須保證該文件已存在,否則報(bào)異常
- 在寫入一個(gè)文件時(shí),如果使用構(gòu)造器FileOutputStream(file),則目錄下有同名文件將被覆蓋
- 字節(jié)流操作字節(jié);字符流操作字符
??緩沖流
處理流之一
為了提高數(shù)據(jù)讀寫的速度,Java API提供了帶緩沖功能的流類,在使用這些流類時(shí),會(huì)創(chuàng)建一個(gè)內(nèi)部緩沖區(qū)數(shù)組,缺省使用8192個(gè)字節(jié)(8Kb)的緩沖區(qū)
- 緩沖流要**“套接”**在相應(yīng)的節(jié)點(diǎn)流之上,根據(jù)數(shù)據(jù)操作單位可以把
*緩沖流分為*
:
●BufferedInputStream 和 BufferedOutputStream
●BufferedReader 和 BufferedWriter - 舉例代碼:
BufferedReader br = null;
BufferedWriter bw = null;
try {
// 創(chuàng)建緩沖流對(duì)象:它是處理流,是對(duì)節(jié)點(diǎn)流的包裝
br = new BufferedReader(new FileReader("d:\\IOTest\\source.txt"));
bw = new BufferedWriter(new FileWriter("d:\\IOTest\\dest.txt"));
String str;
while ((str = br.readLine()) != null) { // 一次讀取字符文本文件的一行字符
bw.write(str); // 一次寫入一行字符串
bw.newLine(); // 寫入行分隔符
}
bw.flush(); // 刷新緩沖區(qū)
} catch (IOException e) {
e.printStackTrace();
} finally {
// 關(guān)閉IO流對(duì)象
try {
if (bw != null) {
bw.close(); // 關(guān)閉過(guò)濾流時(shí),會(huì)自動(dòng)關(guān)閉它所包裝的底層節(jié)點(diǎn)流
}
} catch (IOException e) {
e.printStackTrace();
}
try {
if (br != null) {
br.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
??轉(zhuǎn)換流
處理流之二
轉(zhuǎn)換流提供了在字節(jié)流和字符流之間的轉(zhuǎn)換
Java API提供了兩個(gè)轉(zhuǎn)換流:
●InputStreamReader:將InputStream轉(zhuǎn)換為Reader
●OutputStreamWriter:將Writer轉(zhuǎn)換為OutputStream
InputStreamReader
- 實(shí)現(xiàn)將字節(jié)的輸入流按指定字符集轉(zhuǎn)換為字符的輸入流
-
構(gòu)造器
●public InputStreamReader(InputStream in)
●public InputSreamReader(InputStream in,String charsetName)
OutputStreamWriter
- 實(shí)現(xiàn)將字符的輸出流按指定字符集轉(zhuǎn)換為字節(jié)的輸出流
-
構(gòu)造器
●public OutputStreamWriter(OutputStream out)
●public OutputSreamWriter(OutputStream out,String charsetName)
FileInputStream fis = new FileInputStream("dbcp.txt");
FileOutputStream fos = new FileOutputStream("dbcp5.txt");
InputStreamReader isr = new InputStreamReader(fis, "GBK");
OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
BufferedReader br = new BufferedReader(isr);
BufferedWriter bw = new BufferedWriter(osw);
String str = null;
while ((str = br.readLine()) != null) {
bw.write(str);
bw.newLine();
bw.flush();
}
bw.close();
br.close();
??標(biāo)準(zhǔn)輸入、輸出流
處理流之三
System.in和System.out分別代表了系統(tǒng)標(biāo)準(zhǔn)的輸入和輸出設(shè)備
System.in的類型是InputStream
System.out的類型是PrintStream,其是OutputStream的子類
??打印流
處理流之四
實(shí)現(xiàn)將基本數(shù)據(jù)類型的數(shù)據(jù)格式轉(zhuǎn)化為字符串輸出
PrintStream和PrintWriter
PrintStream ps = null;
try {
FileOutputStream fos = new FileOutputStream(new File("D:\\IO\\text.txt"));
// 創(chuàng)建打印輸出流,設(shè)置為自動(dòng)刷新模式(寫入換行符或字節(jié) '\n' 時(shí)都會(huì)刷新輸出緩沖區(qū))
ps = new PrintStream(fos, true);
if (ps != null) {// 把標(biāo)準(zhǔn)輸出流(控制臺(tái)輸出)改成文件
System.setOut(ps);
}
for (int i = 0; i <= 255; i++) { // 輸出ASCII字符
System.out.print((char) i);
if (i % 50 == 0) { // 每50個(gè)數(shù)據(jù)一行
System.out.println(); // 換行
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} finally {
if (ps != null) {
ps.close();
}
}
??數(shù)據(jù)流
處理流之五
方便操作Java語(yǔ)言的基本數(shù)據(jù)類型和String的數(shù)據(jù),可以使用數(shù)據(jù)流
DataInputStream 和 DataOutputStream
-
DataInputStream中的方法
boolean readBoolean()
byte readByte()
char readChar()
float readFloat()
double readDouble()
short readShort()
long readLong()
int readInt()
String readUTF()
void readFully(byte[] b) - DataOutputStream中方法將其上read改為writer
??對(duì)象流
處理流之六
ObjectInputStream和OjbectOutputSteam
- ●序列化:用ObjectOutputStream類保存基本類型數(shù)據(jù)或?qū)ο蟮臋C(jī)制
●反序列化:用ObjectInputStream類讀取基本類型數(shù)據(jù)或?qū)ο蟮臋C(jī)制 - 不能序列化static和transient修飾的成員變量
-
序列化
某個(gè)類實(shí)現(xiàn)了 Serializable 接口
●創(chuàng)建一個(gè) ObjectOutputStream
●調(diào)用 ObjectOutputStream 對(duì)象的 writeObject(對(duì)象) 方法輸出可序列化對(duì)象
●注意寫出一次,操作flush()一次 -
反序列化
●創(chuàng)建一個(gè) ObjectInputStream
●調(diào)用 readObject() 方法讀取流中的對(duì)象
??對(duì)象序列化機(jī)制
對(duì)象序列化機(jī)制允許把內(nèi)存中的Java對(duì)象轉(zhuǎn)換成平臺(tái)無(wú)關(guān)的二進(jìn)制流,從而允許把這種二進(jìn)制流持久地保存在磁盤上,或通過(guò)網(wǎng)絡(luò)將這種二進(jìn)制流傳輸?shù)搅硪粋€(gè)網(wǎng)絡(luò)節(jié)點(diǎn)。當(dāng)其它程序獲取了這種二進(jìn)制流,就可以恢復(fù)成原來(lái)的Java對(duì)象
- 序列化好處是可將任何實(shí)現(xiàn)了Serializable接口的對(duì)象轉(zhuǎn)化為字節(jié)數(shù)據(jù),使其保存和傳輸時(shí)可被還原
- 凡是實(shí)現(xiàn)Serializable接口的類都有一個(gè)表示序列化版本標(biāo)識(shí)符的靜態(tài)變量:
private static final long serialVersionUID; - Java的序列化機(jī)制是通過(guò)在運(yùn)行時(shí)判斷類的serialVersionUID來(lái)驗(yàn)證版本一致性的。在進(jìn)行反序列化時(shí),JVM會(huì)把傳來(lái)的字節(jié)流中的serialVersionUID與本地相應(yīng)實(shí)體類的serialVersionUID進(jìn)行比較,如果相同就認(rèn)為是一致的,可以進(jìn)行反序列化,否則就會(huì)出現(xiàn)序列化版本不一致的異常
??隨機(jī)存取文件流
RandomAccessFile類
- RandomAccessFile 對(duì)象包含一個(gè)記錄指針,用以標(biāo)示當(dāng)前讀寫處的位置
- RandomAccessFile 類對(duì)象可以自由移動(dòng)記錄指針:
●long getFilePointer():獲取文件記錄指針的當(dāng)前位置
●void seek(long pos):將文件記錄指針定位到 pos 位置
構(gòu)造器
●public RandomAccessFile(File file, String mode)
●public RandomAccessFile(String name, String mode)
mode 參數(shù)
該參數(shù)指定 RandomAccessFile 的訪問(wèn)模式:
● r: 以只讀方式打開
● rw: 打開以便讀取和寫入
● rwd: 打開以便讀取和寫入;同步文件內(nèi)容的更新
● rws: 打開以便讀取和寫入;同步文件內(nèi)容和元數(shù)據(jù)的更新
??總結(jié):Java IO流在Java編程中的應(yīng)用很廣泛,也非常重要,知識(shí)點(diǎn)也很多,自己整理了一點(diǎn)
?? 作者算是一名Java初學(xué)者,文章如有錯(cuò)誤,歡迎評(píng)論私信指正,一起學(xué)習(xí)~~
??如果文章對(duì)小伙伴們來(lái)說(shuō)有用的話,點(diǎn)贊??關(guān)注??收藏??就是我的最大動(dòng)力!
??不積跬步,無(wú)以至千里,書接下回,歡迎再見??文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-415599.html
??彩蛋:
????途W(wǎng)是一個(gè)兼具 面經(jīng)、刷題、求職 的神器,是我們的最佳選擇,我用過(guò)很不錯(cuò)呢~ ??點(diǎn)擊注冊(cè)開始刷題
小鳴人因?yàn)闇?zhǔn)備考研,學(xué)完C++準(zhǔn)備淺練下算法,后續(xù)會(huì)推出牛客網(wǎng)刷題記錄專欄
,到時(shí)希望大家多多關(guān)注~
到了這里,關(guān)于【12章 Java IO流】程序員必看 IO流 詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!