IO技術(shù)
對(duì)于任何程序設(shè)計(jì)語(yǔ)言而言,輸入輸出(Input/Output)系統(tǒng)都是非常核心的功能。程序運(yùn)行需要數(shù)據(jù),數(shù)據(jù)的獲取往往需要跟外部系統(tǒng)進(jìn)行通信,外部系統(tǒng)可能是文件、數(shù)據(jù)庫(kù)、其他程序、網(wǎng)絡(luò)、IO設(shè)備等等。
外部系統(tǒng)比較復(fù)雜多變,那么我們有必要通過(guò)某種手段進(jìn)行抽象、屏蔽外部的差異,從而實(shí)現(xiàn)更加便捷的編程。
輸入(Input)指的是:可以讓程序從外部系統(tǒng)獲得數(shù)據(jù)(核心含義是“讀”,讀取外部數(shù)據(jù))。常見(jiàn)的應(yīng)用:
1) 讀取硬盤(pán)上的文件內(nèi)容到程序。例如:播放器打開(kāi)一個(gè)視頻文件、word打開(kāi)一個(gè)doc文件。
2) 讀取網(wǎng)絡(luò)上某個(gè)位置內(nèi)容到程序。例如:瀏覽器中輸入網(wǎng)址后,打開(kāi)該網(wǎng)址對(duì)應(yīng)的網(wǎng)頁(yè)內(nèi)容;下載網(wǎng)絡(luò)上某個(gè)網(wǎng)址的文件。
3) 讀取數(shù)據(jù)庫(kù)系統(tǒng)的數(shù)據(jù)到程序。
4) 讀取某些硬件系統(tǒng)數(shù)據(jù)到程序。例如:車(chē)載電腦讀取雷達(dá)掃描信息到程序;溫控系統(tǒng)
輸出(Output)指的是:程序輸出數(shù)據(jù)給外部系統(tǒng)從而可以操作外部系統(tǒng)(核心含義是“寫(xiě)”,將數(shù)據(jù)寫(xiě)出到外部系統(tǒng))。常見(jiàn)的應(yīng)用有:
5) 將數(shù)據(jù)寫(xiě)到硬盤(pán)中。?例如:我們編輯完一個(gè)word文檔后,將內(nèi)容寫(xiě)到硬盤(pán)上進(jìn)行保存。
6) 將數(shù)據(jù)寫(xiě)到數(shù)據(jù)庫(kù)系統(tǒng)中。例如:我們注冊(cè)一個(gè)網(wǎng)站會(huì)員,實(shí)際就是后臺(tái)程序向數(shù)據(jù)庫(kù)中寫(xiě)入一條記錄。
7)將數(shù)據(jù)寫(xiě)到某些硬件系統(tǒng)中。例如:導(dǎo)彈系統(tǒng)導(dǎo)航程序?qū)⑿碌穆窂捷敵龅斤w控子系統(tǒng),飛控子系統(tǒng)根據(jù)數(shù)據(jù)修正飛行路徑。
java.io包為我們提供了相關(guān)的API,實(shí)現(xiàn)了對(duì)所有外部系統(tǒng)的輸入輸出操作,這就是我們這章所要學(xué)習(xí)的技術(shù)。
基本概念和IO入門(mén)
數(shù)據(jù)源
數(shù)據(jù)源data source,提供數(shù)據(jù)的原始媒介。
常見(jiàn)的:數(shù)據(jù)庫(kù)、文件、其他程序、內(nèi)存、網(wǎng)絡(luò)連接、IO設(shè)備。
數(shù)據(jù)源分為:源設(shè)備、目標(biāo)設(shè)備。
源設(shè)備:為程序提供數(shù)據(jù),一般對(duì)應(yīng)輸入流。
目標(biāo)設(shè)備:程序數(shù)據(jù)的目的地,一般對(duì)應(yīng)輸出流。
流的概念
數(shù)據(jù)源就像水箱,流(stream)就像水管中流著的水流,程序就是我們最終的用戶(hù)。?流是一個(gè)抽象、動(dòng)態(tài)的概念,是一連串連續(xù)動(dòng)態(tài)的數(shù)據(jù)集合。
圖1?流與源數(shù)據(jù)源和目標(biāo)數(shù)據(jù)源之間的關(guān)系
第一個(gè)簡(jiǎn)單的IO流程序及深入
當(dāng)程序需要讀取數(shù)據(jù)源的數(shù)據(jù)時(shí),就會(huì)通過(guò)IO流對(duì)象開(kāi)啟一個(gè)通向數(shù)據(jù)源的流,通過(guò)這個(gè)IO流對(duì)象相關(guān)方法可以順序讀取流中的數(shù)據(jù)。
【示例1】?通過(guò)流對(duì)象從一個(gè)文件中讀取數(shù)據(jù)(只用于測(cè)試,不規(guī)范的寫(xiě)法)
import?java.io.*;
public?class?Demo01 {
????public?static?void?main(String[]?args) {
????????try?{
???????????? FileInputStream??fis?=?new? ? FileInputStream("d:/a.txt");??//文件內(nèi)容是:abc
?????????????int?s1?=?fis.read();? ??//打印輸入字符a對(duì)應(yīng)的ascii碼值97
?????????????int?s2?=?fis.read();?? ??//打印輸入字符a對(duì)應(yīng)的ascii碼值98
?????????????int?s3?=?fis.read();?? ??//打印輸入字符a對(duì)應(yīng)的ascii碼值99
?????????????int?s4?=?fis.read();?? ??//由于文件內(nèi)容已經(jīng)讀取完畢,返回-1
???????????? System.out.println(s1);
???????????? System.out.println(s2);
???????????? System.out.println(s3);
???????????? System.out.println(s4);
?????????????fis.close();????????????
????????//流對(duì)象使用完,必須關(guān)閉!不然,總占用系統(tǒng)資源,最終會(huì)造成系統(tǒng)崩潰!
??????? }?catch?(Exception?e) {
?????????????e.printStackTrace();
??????? }
??? }
}
【示例2】通過(guò)流對(duì)象從一個(gè)文件中讀取數(shù)據(jù)(經(jīng)典代碼,一定要掌握)
import?java.io.*;
public?class?Demo02 {
????public?static?void?main(String[]?args) {
??????? FileInputStream??fis?=null;
????????try?{
?????????????fis?=?new? ? FileInputStream("d:/a.txt");??//內(nèi)容是:abc
???????????? StringBuilder?sb?=?new?StringBuilder();
?????????????int?temp?= 0;
?????????????while((temp=fis.read())!=-1){
?????????????????sb.append((char)temp);
???????????? }
???????????? System.out.println(sb);?
??????? }?catch?(Exception?e) {
?????????????e.printStackTrace();
??????? }finally{
?????????????try{
?????????????????if(fis!=null){
?????????????????????fis.close();
//流對(duì)象,使用完后必須關(guān)閉!!這種寫(xiě)法,保證了即使遇到異常情況,也會(huì)關(guān)閉流對(duì)象。
??????? ??????? ? }??
???????????? }catch(IOException?e){
?????????????????e.printStackTrace();
???????????? }
??????? }
??? }
}
老鳥(niǎo)建議:
????如上代碼是一段非常典型的IO流代碼,其他流對(duì)象的使用也基本是同樣的模式!
本節(jié)我們先講到這里,下節(jié)我們繼續(xù)聊~~
「全棧Java筆記」是一部能幫大家從零到一成長(zhǎng)為全棧Java工程師系列筆記。筆者江湖人稱(chēng) Mr. G,10年Java研發(fā)經(jīng)驗(yàn),曾在神州數(shù)碼、航天院某所研發(fā)中心從事軟件設(shè)計(jì)及研發(fā)工作,從小白逐漸做到工程師、高級(jí)工程師、架構(gòu)師。精通Java平臺(tái)軟件開(kāi)發(fā),精通JAVAEE,熟悉各種流行開(kāi)發(fā)框架。
?筆記包含從淺入深的六大部分:
? A-Java入門(mén)階段
? B-數(shù)據(jù)庫(kù)從入門(mén)到精通
? C-手刃移動(dòng)前端和Web前端
? D-J2EE從了解到實(shí)戰(zhàn)
? E-Java高級(jí)框架精解
? F-Linux和Hadoop?