一、寫在開頭 在計(jì)算機(jī)領(lǐng)域中百分之九十以上的程序擁有著和外部設(shè)備交互的功能,這就是我們常說(shuō)的IO(Input/Output:輸入/輸出),所謂輸入就是外部數(shù)據(jù)導(dǎo)入計(jì)算機(jī)內(nèi)存中的過(guò)程,輸出則是將內(nèi)存或者說(shuō)程序中的數(shù)據(jù)導(dǎo)入到外部存儲(chǔ)中,如數(shù)據(jù)庫(kù)、文件以及其他本地磁盤等。 二、什么是IO流 這種輸入輸出往
在計(jì)算機(jī)領(lǐng)域中百分之九十以上的程序擁有著和外部設(shè)備交互的功能,這就是我們常說(shuō)的IO(Input/Output:輸入/輸出),所謂輸入就是外部數(shù)據(jù)導(dǎo)入計(jì)算機(jī)內(nèi)存中的過(guò)程,輸出則是將內(nèi)存或者說(shuō)程序中的數(shù)據(jù)導(dǎo)入到外部存儲(chǔ)中,如數(shù)據(jù)庫(kù)、文件以及其他本地磁盤等。
這種輸入輸出往往遵循著先入先出,順序存取的特點(diǎn),像水流一般,因此我們稱這樣的操作為流(Stream),如下我們根據(jù)不同的標(biāo)準(zhǔn),將IO流分為幾個(gè)門類:
根據(jù)數(shù)據(jù)流向:
根據(jù)處理單位:
根據(jù)功能點(diǎn):
在java.io包中多達(dá)40多個(gè)類,它們的基類來(lái)源于InputStream、OutputStream、Reader、Writer這四個(gè),我們一一看過(guò)。
InputStream作為所有字節(jié)輸入流的父類,主要作用是將外部數(shù)據(jù)讀取到內(nèi)存中,主要方法如下(JDK8):
我們使用FileInputStream(文件字節(jié)輸入流)進(jìn)行如上方法的使用測(cè)試:
public class Test {
public static void main(String[] args) throws IOException {
try (InputStream fis = new FileInputStream("E:\\input.txt")) {
System.out.println("可讀取字節(jié)數(shù):"
+ fis.available());
int content;
long skip = fis.skip(3);
System.out.println("忽略字節(jié)數(shù):" + skip);
System.out.print("剩余全量字節(jié):");
while ((content = fis.read()) != -1) {
System.out.print((char) content);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
輸出:
可讀取字節(jié)數(shù):20
忽略字節(jié)數(shù):3
剩余全量字節(jié):name is JavaBuild
outputstream作為所有字節(jié)輸出流的父類,主要?jiǎng)t是將內(nèi)存或者說(shuō)程序中的數(shù)據(jù)以字節(jié)流的方式導(dǎo)入到外部存儲(chǔ)中,如數(shù)據(jù)庫(kù)、文件以及其他本地磁盤等。它的使用方法相比較字節(jié)輸入流要少:
我們同樣以FileOutputStream為例進(jìn)行上述方法的測(cè)試:
public class Test {
public static void main(String[] args) throws IOException {
try (FileOutputStream output = new FileOutputStream("E://output.txt")) {
byte[] array = "JavaBuild".getBytes();
//將一個(gè)字節(jié)數(shù)組寫入本地E盤的外部文件output.txt中
output.write(array);
//換行方式1:Windows下的換行符為"\r\n"
output.write("\r\n".getBytes());
//換行方式2:推薦使用,具有良好的跨平臺(tái)性
String newLine = System.getProperty("line.separator");
output.write(newLine.getBytes());
//輸出字節(jié),這里的數(shù)字會(huì)被轉(zhuǎn)為asicc碼中對(duì)應(yīng)的字符
output.write(64);
output.write(56);
output.write(56);
output.write(56);
//關(guān)閉輸出流
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
效果:
這里可以直接輸出單字節(jié)數(shù)據(jù),也可以輸出指定的字節(jié)數(shù)組。輸出字節(jié)時(shí)以int類型輸出,最終根據(jù)ASCII表轉(zhuǎn)為字符。如十進(jìn)制64的轉(zhuǎn)為@符號(hào)。
在講解字符流之前,我們來(lái)解釋一個(gè)面試問題:
“為什么有了字節(jié)流了還需要使用更耗時(shí)的字符流”
確實(shí),字節(jié)作為信息存儲(chǔ)的最小單元,我們可以通過(guò)字節(jié)流實(shí)現(xiàn)所有信息的輸入與輸出,但有時(shí)候會(huì)存在一些問題,比如中文輸入時(shí)的編碼問題,將上述3.1中的測(cè)試代碼稍微改一下,執(zhí)行結(jié)果如下,中文在控制臺(tái)輸出時(shí)亂碼了。當(dāng)然我們可以通過(guò)設(shè)置編碼來(lái)規(guī)避這個(gè)問題,但有時(shí)候不曉得編碼時(shí),亂碼真的會(huì)帶來(lái)潛在風(fēng)險(xiǎn)!
字符流與字節(jié)流的區(qū)別:
說(shuō)了這么多,我們現(xiàn)在來(lái)看一下Reader這個(gè)字符輸入流提供的主要方法吧,其實(shí)和InputStream差不多,只不過(guò)一個(gè)是以字節(jié)為單位的讀取,一個(gè)是以字符為單位。
我們將上述3.1中的測(cè)試代碼稍作加工,采用FileReader流進(jìn)行輸入,打印結(jié)果:
可以看到即便有中文,輸出在控制臺(tái)也沒有亂碼,因?yàn)樽址髂J(rèn)采用的是 Unicode 編碼。
那么字符流是如何實(shí)現(xiàn)txt文件讀取的呢?通過(guò)FileReader類的繼承關(guān)系我們可以看到它繼承了InputStreamReader,這是一個(gè)字節(jié)轉(zhuǎn)字符輸入流,所以說(shuō)從根本上,字符流底層依賴的還是字節(jié)流!
// 字節(jié)流轉(zhuǎn)換為字符流的橋梁
public class InputStreamReader extends Reader {
}
// 用于讀取字符文件
public class FileReader extends InputStreamReader {
}
writer是將內(nèi)存或者說(shuō)程序中的數(shù)據(jù)以字符流的方式導(dǎo)入到外部存儲(chǔ)中,如數(shù)據(jù)庫(kù)、文件以及其他本地磁盤等。
常用方法也和OutputStream相似:
我們同樣以FileWriter為例,去測(cè)試一下:
public class Test {
public static void main(String[] args) throws IOException {
try (FileWriter fw = new FileWriter("E:\\outwriter.txt")) {
fw.write("大家好。!");
fw.append("我是JavaBuild");
} catch (IOException e) {
e.printStackTrace();
}
}
}
如果本篇博客對(duì)您有一定的幫助,大家記得
留言+點(diǎn)贊+收藏
呀。原創(chuàng)不易,轉(zhuǎn)載請(qǐng)聯(lián)系Build哥!
如果您想與Build哥的關(guān)系更近一步,還可以關(guān)注“JavaBuild888”,在這里除了看到《Java成長(zhǎng)計(jì)劃》系列博文,還有提升工作效率的小筆記、讀書心得、大廠面經(jīng)、人生感悟等等,歡迎您的加入!
機(jī)器學(xué)習(xí):神經(jīng)網(wǎng)絡(luò)構(gòu)建(下)
閱讀華為Mate品牌盛典:HarmonyOS NEXT加持下游戲性能得到充分釋放
閱讀實(shí)現(xiàn)對(duì)象集合與DataTable的相互轉(zhuǎn)換
閱讀鴻蒙NEXT元服務(wù):論如何免費(fèi)快速上架作品
閱讀算法與數(shù)據(jù)結(jié)構(gòu) 1 - 模擬
閱讀5. Spring Cloud OpenFeign 聲明式 WebService 客戶端的超詳細(xì)使用
閱讀Java代理模式:靜態(tài)代理和動(dòng)態(tài)代理的對(duì)比分析
閱讀Win11筆記本“自動(dòng)管理應(yīng)用的顏色”顯示規(guī)則
閱讀本站所有軟件,都由網(wǎng)友上傳,如有侵犯你的版權(quán),請(qǐng)發(fā)郵件[email protected]
湘ICP備2022002427號(hào)-10 湘公網(wǎng)安備:43070202000427號(hào)© 2013~2025 haote.com 好特網(wǎng)