java的IO操作

??????? 之所以寫這個是因為Hadoop的IO與·這個類似 但要比這個深入峭范,而且都還涉及到網(wǎng)絡(luò)傳輸原理的五個層次纱控。所以其徙,一步一個腳印访锻。


已知: Java程序是通過“流”的形式進行數(shù)據(jù)的輸入和輸出的期犬,輸入和輸出是指應用程序與外部設(shè)備及其他計算機進行數(shù)據(jù)交流的操作龟虎。

流的概念

??? 流是一個抽象的概念沙庐,如同電流鲤妥,可以看做是水流,可以理解是一個輸入輸出途徑拱雏。在Java體系中IO是非常龐大的棉安。

有這些流操作:

1.標準的輸入輸出流。

2.文件的操作铸抑。

3.網(wǎng)路數(shù)據(jù)流操作。

4.字符串流

5.對象流操作鹊汛。




流定義:

流是指一臺計算機或網(wǎng)路中不同的計算機之間有序運動的數(shù)據(jù)序列蒲赂。Java把這些不同來源和目標的數(shù)據(jù)都統(tǒng)一抽象為數(shù)據(jù)流。

流序列中可以使原始數(shù)據(jù)【二進制文件】刁憋,也可以是經(jīng)過編碼符合某種規(guī)定的數(shù)據(jù)滥嘴,Java流分兩種。一種是字節(jié)流至耻,一種是字符流

分別由4個抽象類來表示

【字節(jié)流】 InputStream OutStream


[字符流] Reader Writer



輸入流和輸出流


流可以分為2類氏涩,輸入流和輸出流届囚,用戶可以從輸入流中讀取信息,但不能寫它是尖,相反意系,對于輸出流只能往其中寫,而不能讀它饺汹。說人話就是輸入流支持寫不支持讀蛔添,輸出流支持讀不支持寫。


輸入流:

既然是輸入流就會有信息源的兜辞,信息源可以位于文件迎瞧,內(nèi)存或網(wǎng)絡(luò)套接字等地方【scoket】,信息源類型可包括對象,字符逸吵,圖像凶硅,聲音在內(nèi)的任何類型,一旦打開輸入流后扫皱,程序就可以從輸入流串行的讀取數(shù)據(jù)足绅。

輸出流:

輸出流和輸入流相似, 程序也能夠通過打開一個輸出流并順序地寫入數(shù)據(jù)來將信息送至目的地韩脑。

字節(jié)流和字符流:

Java包括兩種流 字節(jié)流和字符流氢妈。

字節(jié)流:字節(jié)流是通過I/O設(shè)備以字節(jié)數(shù)據(jù)的方式讀入。而字符流則是通過字節(jié)流讀入數(shù)據(jù)轉(zhuǎn)換成字符‘流’的形式由用戶驅(qū)使段多。

字節(jié)流:

?對于字節(jié)流來說首量,InputStream 是所有字節(jié)輸入流的父類。 outputstream是所有字節(jié)輸出流的父類

在Java的I/O流中进苍,所有對字節(jié)流處理的類加缘,都是繼承inputstream和outputstream,這兩個抽象類觉啊。

inputstream類生百。

該類是一個抽象類,作為字節(jié)輸入流的直接或間接父類柄延,它定義了許多有用的,所有子類必須的方法缀程。

inputstream 常用的方法有以下幾種搜吧。

public abstractintread() :------讀取一個byte的數(shù)據(jù),返回值是高位補0的int 類型

public int read(byte b[]):------- 讀取b.length 字節(jié)的數(shù)據(jù)放到b數(shù)組中杨凑,返回值是讀取的字節(jié)數(shù)滤奈,該方法實際是調(diào)用下一個方法的實現(xiàn)。

public int read (byte? b[],int off,int len)----從輸入流中最多讀取len個字節(jié)的數(shù)據(jù)撩满,存放到偏移量為off的b的數(shù)組中

public int avaiable():?? 返回輸入流中可以讀取的字節(jié)數(shù)蜒程;

注意绅你。如輸入阻塞,當前線程將被掛起昭躺,如果inputstream 對象電泳這個方法的話忌锯,它只會返回0,這個方法必須由inputstream 類的子類對象調(diào)用才有用领炫。

public long ship(long n) : 忽略輸入流中的n個字節(jié)偶垮,返回值是實際忽略的字節(jié)數(shù),跳過一些字段來讀取帝洪,

public int close():??? 在使用完后似舵,必須對打開的流進行關(guān)閉。

outputstream類:常用方法

public void write(byte b[])將參數(shù)b中的字節(jié)寫入到輸入流中葱峡。

public void write(byte b[], int off int len):將參數(shù)b中的從偏移量off開始的len個字節(jié)寫入到輸出流中砚哗。

pubic abstract void write (int b ):先將int 轉(zhuǎn)換為byte類形。把低字節(jié)寫入到輸出流中砰奕。

public void flush()蛛芥; 將數(shù)據(jù)緩沖區(qū)中的數(shù)據(jù)全部輸出,并清空緩沖區(qū)脆淹。

public void close ();?? 關(guān)閉輸出流并釋放與流相關(guān)的系統(tǒng)資源常空。


FileInputStream 類:


FileInputStrem 和OutputStream 類中第一個類的源端和第二個類的目的端都是此盤文件,他們的構(gòu)造方法允許通過磁盤文件的路徑名來構(gòu)造相應的流

FileInputStream infile=new FileinputStream("myfile.data");

OutputStream outfile=new OutputStream("results.data")

構(gòu)造Fileinputstream 對象時盖溺,對應的文件必須存在并且是可讀的漓糙,而構(gòu)造后者對象時,如輸出文件已存在烘嘱,則必須是可覆蓋的昆禽。

如果用戶的文件讀取需求比較簡單,那么用戶可以使用FileinputStream類蝇庭,該類是從InputStream 中派生出來的簡單輸入類醉鳖,該類的方法都是從InputStream中繼承的代碼如下:


package fileinputstream;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.IOException;

public class Demo {

public static void main(String[] args) {

try {

FileInputStream in = new FileInputStream("/asd.txt");

int n = 512; // 設(shè)定讀取的字節(jié)數(shù)

byte[] buffer = new byte[n]; // 讀取輸入流

// 讀取n 個字節(jié),放置到以下標0開始字節(jié)數(shù)組buffer中哮内,返回為實際讀取的字節(jié)的數(shù)量

while ((in.read(buffer, 0, n) != -1) && (n > 0)) {

System.out.print(new String(buffer));

}

System.out.println();

in.close();

} catch (FileNotFoundException e) {

// TODO 自動生成的 catch 塊

e.printStackTrace();

} catch (IOException e) {

// TODO 自動生成的 catch 塊

e.printStackTrace();

}

}

}

這是fileinputstream 中的read(buffer)方法盗棵,每次從文件中讀取512B存儲在緩存區(qū)buffer上。再將以buffer中的值構(gòu)造的字符串newString(buffer)顯示到屏幕上北发,使文件輸入流構(gòu)造器建立通往文件的輸入流時纹因,可能出現(xiàn)錯誤,這是應該進行異常處理琳拨。

FileoutStream 類

兩個構(gòu)造器 FileOutputStream(String name)

FileOutputStream(File file)

第一個構(gòu)造器使用給定的文件名name 創(chuàng)建一個FileOutputStream對象瞭恰。第二個構(gòu)造器使用File 對象創(chuàng)建FileOutputStream 對象。 該類是可以使用write 方法把字節(jié)發(fā)送給輸出流 狱庇,使用文件順出流寫入文件惊畏。


package fileinputstream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.OutputStream;

public class Demo1 {

public static void main(String[] args) throws IOException {

try {

System.out.print("輸入保存的內(nèi)容");

int count ,n=512;

byte [] buffer =new byte[n];? ? ? ? // 定義存放讀入信息的字節(jié)數(shù)組

count=System.in.read(buffer); // 讀取標準輸入流

FileOutputStream out=new FileOutputStream("asd.txt");? ? ? // 創(chuàng)建文件輸出對象

out.write(buffer,n,count);? //這是開始寫入恶耽,把字節(jié)數(shù)組buffer中從下標0開化寺,長度為count的字節(jié)寫入流中

out.close();

System.out.print("文件已保存");

} catch (FileNotFoundException e) {

// TODO 自動生成的 catch 塊

e.printStackTrace();

}

}

}

BuffererInputStream 類和BufferedOutputStream 類

前者主要是提供在流的輸入過程中提供了緩存的功能颜启,它是和其他類一起搭配使用的偷俭,兩者類一樣,不同的是农曲,前者讀數(shù)據(jù)社搅,后者寫數(shù)據(jù)。

字符流

?? Reader 類和Writer 類

??


FileReader 類

該類是用于讀取文件乳规,每次讀取文件中第一個未讀去過的字符形葬,然后以ASCII碼或者utf-8 碼的形式輸入到程序中

語法格式:? FileReader fr=new FileReader(filename);

其中,文件名必須是文件的完整路徑和文件名暮的,如果程序和該文件保存在同一目錄下笙以,則可以只用文件名而不需要其路徑,該類中的read()方法用來讀取字符并返回一個相應的int 類型數(shù)據(jù)冻辩。



package fileinputstream;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.IOException;

public class Demo2 {

public static void main(String[] args) throws IOException {

try {

FileReader fr = new FileReader("love.txt");

int c = fr.read();

while (c != -1) {

System.out.println((char) c);

c = fr.read();

}

fr.close();

} catch (FileNotFoundException e) {

// TODO 自動生成的 catch 塊

e.printStackTrace();

}

}

}



這段代碼中猖腕,構(gòu)建了一個文件閱讀器FileReader 的對象實例fr。通過while循環(huán)語句調(diào)用其read()方法依次讀取一個字符恨闪。并判斷是否到了文件的結(jié)束處倘感。

FileWrite 類

該類是用于將數(shù)據(jù)寫入到文件,語法格式如下:

FileWrite fr= new FileWrite(filename);

其中咙咽,文件名必須是文件的完整路徑名和文件名老玛,如果該程序和該文件保存在同一目錄下,則可以只用文件名而不需要其路徑名钧敞,如果該文件存在蜡豹,則系統(tǒng)會自動創(chuàng)建該文件,F(xiàn)ileWrite類中的write()方法溉苛,可以將字符或者字符串寫入到文件中去镜廉,當數(shù)據(jù)寫入操作完后,使用close方法愚战,關(guān)閉文件娇唯。



package fileinputstream;

import java.io.FileWriter;

import java.io.IOException;

public class Demo3 {

public static void main(String[] args) {

try {

FileWriter fw = new FileWriter("完整路徑名+文件名");

fw.write("my");

fw.write("dream");

fw.write("will");

fw.write("come");

fw.write("true");

fw.write("one");

fw.write("day");

fw.close();

} catch (IOException e) {

// TODO 自動生成的 catch 塊

e.printStackTrace();

}

}

}


File 代表一個文件或者文件夾

File(String pathname)

File(String parent,String child)

File(File file寂玲,String child)

createNewFile 創(chuàng)建文件

mkdirs 生成多層文件夾

mkdir? 生成一層文件夾

delete 刪除一個文件或文件夾

deleteOnExite 刪除文件或文件夾在程序退出時

isDirectory 判斷file是否代表一個文件夾

isFile? 判斷file是否代表一個文件

getPath? 獲得文件路徑

getAbsoultePath 獲得絕對路徑

getCanonicalPath 獲得規(guī)格化以后的路徑

listFiles 返回當前文件夾下的所有文件

Io:

方向: 輸出/輸入

單位: 字節(jié)流(可以傳輸一切數(shù)據(jù))/字符流(主要文本文檔)

功能: 節(jié)點流/過濾流

InputStream/OutputStream 所有節(jié)點流的父類

FileInputStream/FileOutputStream 實現(xiàn)類

FileInputStream(String pathname)塔插;

FileInputStream(File file)

read() 返回讀到的字節(jié)? 直到讀到末尾返回-1

close() 關(guān)閉流,釋放流資源

raad(byte[]) 讀入一個數(shù)組長度的數(shù)據(jù)

read(byte[],start,len) 從起始下標讀入len長度字節(jié)到byte數(shù)組

FileOutputStream

FileOutputStream(File file敢茁,boolean append) true代表追加

FileOutputStream(String pathname,boolean append)留美; false代表不追加

異常的處理:

1.創(chuàng)建io對象時

2.進行讀入操作時

3.關(guān)閉資源時? 放在finally代碼塊中

過濾流:

1.DataInputStream/DataOutputStream 讀寫八種基本類型

1.創(chuàng)建節(jié)點流對象

2.包裝過濾流

3.讀寫操作

4.關(guān)閉流資源

2.BufferedInputStream/BufferOutputStream? 緩沖流

1.關(guān)閉流操作? 緩沖區(qū)數(shù)據(jù)寫出

2.緩沖區(qū)滿的時候 緩沖區(qū)數(shù)據(jù)寫出

3.調(diào)用flush? 清空緩沖區(qū)

3.ObjectInputStream/ObjectOutputStream? 讀寫對象

NotSerizableException? 未序列化對象錯誤

Serializable? 序列化對象

transient? 不序列化






以下是借鑒的





Java的IO類操作主要包括如下幾類

1彰檬、File類的使用伸刃。

2、字節(jié)操作流:OutputStream逢倍、InputStream

3捧颅、字符操作流:Reader、Writer

4较雕、對象序列化:serializable

從定義看碉哑,F(xiàn)ile類是Object的直接子類,同時它繼承了Comparable接口可以進行數(shù)組的排序亮蒋。

File類的操作包括文件的創(chuàng)建扣典、刪除、重命名慎玖、得到路徑贮尖、創(chuàng)建時間等,以下是文件操作常用的函數(shù)趁怔。

File類的操作:

(1)創(chuàng)建文件湿硝,注意File.separator可以解決跨操作系統(tǒng)的問題。

下面的例子是一創(chuàng)建一個文件润努,如果該文件存在則刪除关斜,否則創(chuàng)建該文件。


(2)文件的類型函數(shù)

file.isFile(); //判斷是不是文件

file.isDirectory();//判斷是不是目錄

(3)列出目錄的內(nèi)容

pulbic String[] list();//列出所有文件名和目錄名

public File[] listFiles();//列出所有文件和目錄

(2)字節(jié)操作流(byte)

(1)字節(jié)輸出流OutputStream






(2)字節(jié)輸入流InputStream


(3)字符輸出流Write





(4)字符輸入流Reader






(5)字節(jié)流和字符流的區(qū)別(重點)

字節(jié)流沒有緩沖區(qū)铺浇,是直接輸出的痢畜,而字符流是輸出到緩沖區(qū)的。因此在輸出時随抠,字節(jié)流不調(diào)用colse()方法時裁着,信息已經(jīng)輸出了,而字符流只有在調(diào)用close()方法關(guān)閉緩沖區(qū)時拱她,信息才輸出二驰。要想字符流在未關(guān)閉時輸出信息,則需要手動調(diào)用flush()方法秉沼。

(6)轉(zhuǎn)換流:在io中還存在一類是轉(zhuǎn)換流桶雀,將字節(jié)流轉(zhuǎn)換為字符流,同時可以將字符流轉(zhuǎn)化為字節(jié)流唬复。

OutputStreamWriter(OutStream out):j將字節(jié)流以字符流輸出矗积。

InputStreamReader(InputStream in):將字節(jié)流以字符流輸入。

(7)打印流 PrintStream

在操作中要求輸出信息時敞咧,可以采用PrintStream進行輸出棘捣,它包括PrintWrite和PrintReader

(3)對象序列化

對象序列化是指將一個對象可以轉(zhuǎn)化為二進制的byte流,可以以文件的方式進行保存休建。

將對象保存在文件的操作叫做對象的序列化操作乍恐。

將對象從文件中恢復的操作叫做反序列化操作评疗。

一個對象如果要能序列化,它必須繼承Serizliable茵烈。在實現(xiàn)序列化是則需要ObjectOurputStream完成百匆,而需要反序列化時則采用ObjectInputStream。

transient關(guān)鍵字:變量聲明為Transient后呜投,該變量不可序列化加匈。

(4)內(nèi)存流

在項目的開發(fā)過程中,有時希望只產(chǎn)生臨時文件仑荐,將信息輸出的內(nèi)存中雕拼,此時會用到內(nèi)存流,內(nèi)存流基本方法如下:





(5)System類對IO的支持

(6)緩存讀取

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末释漆,一起剝皮案震驚了整個濱河市悲没,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌男图,老刑警劉巖示姿,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異逊笆,居然都是意外死亡栈戳,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進店門难裆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來子檀,“玉大人,你說我怎么就攤上這事乃戈」犹担” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵症虑,是天一觀的道長缩歪。 經(jīng)常有香客問我,道長谍憔,這世上最難降的妖魔是什么匪蝙? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮习贫,結(jié)果婚禮上逛球,老公的妹妹穿的比我還像新娘。我一直安慰自己苫昌,他們只是感情好颤绕,可當我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般奥务。 火紅的嫁衣襯著肌膚如雪涕烧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天汗洒,我揣著相機與錄音,去河邊找鬼父款。 笑死溢谤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的憨攒。 我是一名探鬼主播世杀,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼肝集!你這毒婦竟也來了瞻坝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤杏瞻,失蹤者是張志新(化名)和其女友劉穎所刀,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捞挥,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡浮创,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了砌函。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片斩披。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖讹俊,靈堂內(nèi)的尸體忽然破棺而出垦沉,到底是詐尸還是另有隱情,我是刑警寧澤仍劈,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布厕倍,位于F島的核電站,受9級特大地震影響耳奕,放射性物質(zhì)發(fā)生泄漏绑青。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一屋群、第九天 我趴在偏房一處隱蔽的房頂上張望闸婴。 院中可真熱鬧,春花似錦芍躏、人聲如沸邪乍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽庇楞。三九已至榜配,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吕晌,已是汗流浹背蛋褥。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留睛驳,地道東北人烙心。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像乏沸,于是被迫代替她去往敵國和親淫茵。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,685評論 2 360

推薦閱讀更多精彩內(nèi)容

  • tags:io categories:總結(jié) date: 2017-03-28 22:49:50 不僅僅在JAVA領(lǐng)...
    行徑行閱讀 2,181評論 0 3
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理蹬跃,服務(wù)發(fā)現(xiàn)匙瘪,斷路器,智...
    卡卡羅2017閱讀 134,707評論 18 139
  • 1 IONo18 1.1IO框架 【 IO:Input Output 在程序運行的過程中蝶缀,可能需要對一些設(shè)備進...
    征程_Journey閱讀 966評論 0 1
  • 一丹喻、流的概念和作用。 流是一種有順序的翁都,有起點和終點的字節(jié)集合驻啤,是對數(shù)據(jù)傳輸?shù)目偝苫虺橄蟆<磾?shù)據(jù)在兩設(shè)備之間的傳輸...
    布魯斯不吐絲閱讀 10,061評論 2 95
  • 1 在好萊塢大片云集的6月下旬,一部國產(chǎn)電影悄悄上映先煎,悄悄收獲了貓眼9.1的高分贼涩。 我沒看到其他平臺的分數(shù)。但貓眼...
    柴門內(nèi)外閱讀 667評論 0 4