較深入I/O

字節(jié)輸出流OutputStream

  • IO流用來處理設(shè)備之間的數(shù)據(jù)傳輸

  • Java對數(shù)據(jù)的操作是通過流的方式

  • Java用于操作流的類都在IO包中

  • 流按流向分為兩種:輸入流镣陕,輸出流。

  • 流按操作類型分為兩種:

  • 字節(jié)流 : 字節(jié)流可以操作任何數(shù)據(jù),因為在計算機中任何數(shù)據(jù)都是以字節(jié)的形式存儲的

  • 字符流 : 字符流只能操作純字符數(shù)據(jù),比較方便。

.IO流常用父類

* 字節(jié)流的抽象父類:

    * InputStream

    * OutputStream
  • 字符流的抽象父類:

      * Reader
    
      * Writer
    
  • IO程序書寫

      * 使用前,導入IO包中的類
    
      * 使用時抱既,進行IO異常處理
    
      * 使用后,釋放資源
    

void close(): 關(guān)閉此輸出流并釋放與此流有關(guān)的所有系統(tǒng)資源扁誓。

void write(byte[] b): 將 b.length 個字節(jié)從指定的 byte 數(shù)組寫入此輸出流\

void write(byte[] b, int off, int len) :將指定 byte 數(shù)組中從偏移量 off 開始的 len 個字節(jié)寫入此輸出流防泵。

abstract void write(int b) : 將指定的字節(jié)寫入此輸出流。

字節(jié)輸出流FileOutputStream寫字節(jié)

FileOutputStream構(gòu)造方法

  • 作用:綁定輸出的輸出目的

  • FileOutputStream(File file)

  • 創(chuàng)建一個向指定 File 對象表示的文件中寫入數(shù)據(jù)的文件輸出流跋理。

  • FileOutputStream(File file, boolean append)

  • 創(chuàng)建一個向指定 File 對象表示的文件中寫入數(shù)據(jù)的文件輸出流择克,以追加的方式寫入。

  • FileOutputStream(String name)

  • 創(chuàng)建一個向具有指定名稱的文件中寫入數(shù)據(jù)的輸出文件流前普。

  • FileOutputStream(String name, boolean append)

  • 創(chuàng)建一個向具有指定 name 的文件中寫入數(shù)據(jù)的輸出文件流肚邢,以追加的方式寫入。

  • : 流對象使用步驟

  • 1. 創(chuàng)建流子類的對象,綁定數(shù)據(jù)目的

  • 2. 調(diào)用流對象的方法write寫

  • 3. close釋放資源

  • : 注意事項

  • 流對象的構(gòu)造方法,可以創(chuàng)建文件,如果文件存在,直接覆蓋


/*

*  FileOutputStream

*  寫入數(shù)據(jù)文件,學習父類方法,使用子類對象

* 

*  子類中的構(gòu)造方法: 作用:綁定輸出的輸出目的

*    參數(shù):

*      File    封裝文件

*      String  字符串的文件名

* 

*  流對象使用步驟

*    1\. 創(chuàng)建流子類的對象,綁定數(shù)據(jù)目的

*    2\. 調(diào)用流對象的方法write寫

*    3\. close釋放資源

*   

*    流對象的構(gòu)造方法,可以創(chuàng)建文件,如果文件存在,直接覆蓋

*/

public class FileOutputStreamDemo {

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

FileOutputStream fos = new FileOutputStream("c:\\a.txt");

//流對象的方法write寫數(shù)據(jù)

//寫1個字節(jié)

fos.write(97);

//關(guān)閉資源

fos.close();

}

}

字節(jié)輸出流FileOutputStream寫字節(jié)數(shù)組

  • void write(byte[] b): 將 b.length 個字節(jié)從指定的 byte 數(shù)組寫入此輸出流

  • void write(byte[] b, int off, int len) :將指定 byte 數(shù)組中從偏移量 off 開始的 len 個字


/*

*  FileOutputStream

*  寫入數(shù)據(jù)文件,學習父類方法,使用子類對象

* 

*  子類中的構(gòu)造方法: 作用:綁定輸出的輸出目的

*    參數(shù):

*      File    封裝文件

*      String  字符串的文件名

* 

*  流對象使用步驟

*    1\. 創(chuàng)建流子類的對象,綁定數(shù)據(jù)目的

*    2\. 調(diào)用流對象的方法write寫

*    3\. close釋放資源

*   

*    流對象的構(gòu)造方法,可以創(chuàng)建文件,如果文件存在,直接覆蓋

*/

public class FileOutputStreamDemo {

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

FileOutputStream fos = new FileOutputStream("c:\\a.txt");

//流對象的方法write寫數(shù)據(jù)

//寫字節(jié)數(shù)組

byte[] bytes = {65,66,67,68};

fos.write(bytes);

//寫字節(jié)數(shù)組的一部分,開始索引,寫幾個

fos.write(bytes, 1, 2);

//寫入字節(jié)數(shù)組的簡便方式

//寫字符串

fos.write("hello".getBytes());

//關(guān)閉資源

fos.close();

}

}

文件的續(xù)寫和換行符號

文件的續(xù)寫

  • FileOutputStream構(gòu)造方法, 的第二個參數(shù)中,加入true

換行符號

  • 在文件中,寫入換行,符號換行 \r\n

  • \r\n 可以寫在上一行的末尾, 也可以寫在下一行的開頭


/*

*  FileOutputStream 文件的續(xù)寫和換行問題

*  續(xù)寫: FileOutputStream構(gòu)造方法, 的第二個參數(shù)中,加入true

*  在文件中,寫入換行,符號換行  \r\n

*  \r\n 可以寫在上一行的末尾, 也可以寫在下一行的開頭

*/

public class FileOutputStreamDemo1 {

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

File file = new File("c:\\b.txt");

FileOutputStream fos = new FileOutputStream(file,true);

fos.write("hello\r\n".getBytes());

fos.write("world".getBytes());

fos.close();

}

}

字節(jié)輸入流InputStream

  • abstract int read() :

  • 從輸入流中讀取數(shù)據(jù)的下一個字節(jié)拭卿。

  • int read(byte[] b)

  • 從輸入流中讀取一定數(shù)量的字節(jié)骡湖,并將其存儲在緩沖區(qū)數(shù)組 b 中。

  • int read(byte[] b, int off, int len)

  • 將輸入流中最多 len 個數(shù)據(jù)字節(jié)讀入 byte 數(shù)組峻厚。

  • void close()

  • 關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源响蕴。

字節(jié)輸入流FileInputStream讀取字節(jié)

  • a: 方法介紹

  • abstract int read() :

  • 從輸入流中讀取數(shù)據(jù)的下一個字節(jié),返回-1表示文件結(jié)束

  • int read(byte[] b)

  • 從輸入流中讀取一定數(shù)量的字節(jié)惠桃,并將其存儲在緩沖區(qū)數(shù)組 b 中浦夷。

  • 讀入緩沖區(qū)的字節(jié)總數(shù),如果因為已經(jīng)到達文件末尾而沒有更多的數(shù)據(jù)辜王,則返回 -1劈狐。

  • int read(byte[] b, int off, int len)

  • 將輸入流中最多 len 個數(shù)據(jù)字節(jié)讀入 byte 數(shù)組。

  • void close()

  • 關(guān)閉此輸入流并釋放與該流關(guān)聯(lián)的所有系統(tǒng)資源呐馆。


/*

*  FileInputStream讀取文件

* 

*  構(gòu)造方法: 為這個流對象綁定數(shù)據(jù)源

* 

*    參數(shù):

*      File 類型對象

*      String 對象

*  輸入流讀取文件的步驟

*    1\. 創(chuàng)建字節(jié)輸入流的子類對象

*    2\. 調(diào)用讀取方法read讀取

*    3\. 關(guān)閉資源

*   

*    read()方法,

*      read()執(zhí)行一次,就會自動讀取下一個字節(jié)

*      返回值,返回的是讀取到的字節(jié), 讀取到結(jié)尾返回-1

*/

public class FileInputStreamDemo {

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

FileInputStream fis = new FileInputStream("c:\\a.txt");

//讀取一個字節(jié),調(diào)用方法read 返回int

//使用循環(huán)方式,讀取文件,  循環(huán)結(jié)束的條件  read()方法返回-1

int len = 0;//接受read方法的返回值

while( (len = fis.read()) != -1){

System.out.print((char)len);

}

//關(guān)閉資源

fis.close();

}

}

/*

* int i = fis.read();

System.out.println(i);

i = fis.read();

System.out.println(i);

i = fis.read();

System.out.println(i);

i = fis.read();

System.out.println(i);

*/

字節(jié)輸入流FileInputStream讀取字節(jié)數(shù)組

  • int read(byte[] b)

  • 從輸入流中讀取一定數(shù)量的字節(jié)肥缔,并將其存儲在緩沖區(qū)數(shù)組 b 中。

  • 讀入緩沖區(qū)的字節(jié)總數(shù)汹来,如果因為已經(jīng)到達文件末尾而沒有更多的數(shù)據(jù)续膳,則返回 -1改艇。

  • int read(byte[] b, int off, int len)

  • 將輸入流中最多 len 個數(shù)據(jù)字節(jié)讀入 byte 數(shù)組。


/*

*  FileInputStream讀取文件

*  讀取方法  int read(byte[] b) 讀取字節(jié)數(shù)組

*  數(shù)組作用: 緩沖的作用, 提高效率

*  read返回的int,表示什么含義 讀取到多少個有效的字節(jié)數(shù)

*/

public class FileInputStreamDemo1 {

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

FileInputStream fis = new FileInputStream("c:\\a.txt");

// 創(chuàng)建字節(jié)數(shù)組

byte[] b = new byte[2];

int len = fis.read(b);

System.out.println(new String(b));// ab

System.out.println(len);// 2

len = fis.read(b);

System.out.println(new String(b));// cd

System.out.println(len);// 2

len = fis.read(b);

System.out.println(new String(b));// ed

System.out.println(len);// 1

len = fis.read(b);

System.out.println(new String(b));// ed

System.out.println(len);// -1

fis.close();

}

}

字節(jié)輸入流FileInputStream讀取字節(jié)數(shù)組的實現(xiàn)原理

image

public class FileInputStreamDemo1 {

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

FileInputStream fis = new FileInputStream("c:\\a.txt");

//創(chuàng)建字節(jié)數(shù)組

byte[] b = new byte[1024];

int len = 0 ;

while( (len = fis.read(b)) !=-1){

System.out.print(new String(b,0,len));

}

fis.close();

}

}

文件復制原理

image

/*

*  將數(shù)據(jù)源 c:\\a.txt

*  復制到 d:\\a.txt  數(shù)據(jù)目的

*  字節(jié)輸入流,綁定數(shù)據(jù)源

*  字節(jié)輸出流,綁定數(shù)據(jù)目的

* 

*  輸入,讀取1個字節(jié)

*  輸出,寫1個字節(jié)

*/

public class Copy {

public static void main(String[] args) {

//定義兩個流的對象變量

FileInputStream fis = null;

FileOutputStream fos = null;

try{

//建立兩個流的對象,綁定數(shù)據(jù)源和數(shù)據(jù)目的

fis = new FileInputStream("c:\\t.zip");

fos = new FileOutputStream("d:\\t.zip");

//字節(jié)輸入流,讀取1個字節(jié),輸出流寫1個字節(jié)

int len = 0 ;

while((len = fis.read())!=-1){

fos.write(len);

}

}catch(IOException ex){

System.out.println(ex);

throw new RuntimeException("文件復制失敗");

}finally{

try{

if(fos!=null)

fos.close();

}catch(IOException ex){

throw new RuntimeException("釋放資源失敗");

}finally{

try{

if(fis!=null)

fis.close();

}catch(IOException ex){

throw new RuntimeException("釋放資源失敗");

}

}

}

}

}

字節(jié)流復制文件讀取字節(jié)數(shù)組


/*

*  字節(jié)流復制文件

*  采用數(shù)組緩沖提高效率

*  字節(jié)數(shù)組

*  FileInputStream 讀取字節(jié)數(shù)組

*  FileOutputStream 寫字節(jié)數(shù)組

*/

public class Copy_1 {

public static void main(String[] args) {

long s = System.currentTimeMillis();

FileInputStream fis = null;

FileOutputStream fos = null;

try{

fis = new FileInputStream("c:\\t.zip");

fos = new FileOutputStream("d:\\t.zip");

//定義字節(jié)數(shù)組,緩沖

byte[] bytes = new byte[1024*10];

//讀取數(shù)組,寫入數(shù)組

int len = 0 ;

while((len = fis.read(bytes))!=-1){

fos.write(bytes, 0, len);

}

}catch(IOException ex){

System.out.println(ex);

throw new RuntimeException("文件復制失敗");

}finally{

try{

if(fos!=null)

fos.close();

}catch(IOException ex){

throw new RuntimeException("釋放資源失敗");

}finally{

try{

if(fis!=null)

fis.close();

}catch(IOException ex){

throw new RuntimeException("釋放資源失敗");

}

}

}

long e = System.currentTimeMillis();

System.out.println(e-s);

}

}

字符輸出流寫文本FileWriter類

  • void write(int c)

  • 寫入單個字符

  • void write(String str)

  • 寫入字符串

  • void write(String str, int off, int len)

  • 寫入字符串的某一部分

  • void write(char[] cbuf)

  • 寫入字符數(shù)組

  • abstract void write(char[] cbuf, int off, int len)

  • 寫入字符數(shù)組的某一部分


/*

*  字符輸出流

*    java.io.Writer 所有字符輸出流的超類

*  寫文件,寫文本文件

* 

*  寫的方法 write

*    write(int c) 寫1個字符

*    write(char[] c)寫字符數(shù)組

*    write(char[] c,int,int)字符數(shù)組一部分,開始索引,寫幾個

*    write(String s) 寫入字符串

*   

*  Writer類的子類對象 FileWriter

* 

*  構(gòu)造方法:  寫入的數(shù)據(jù)目的

*    File 類型對象

*    String 文件名

*   

*  字符輸出流寫數(shù)據(jù)的時候,必須要運行一個功能,刷新功能

*  flush()

*/

public class WriterDemo {

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

FileWriter fw = new FileWriter("c:\\1.txt");

//寫1個字符

fw.write(100);

fw.flush();

//寫1個字符數(shù)組

char[] c = {'a','b','c','d','e'};

fw.write(c);

fw.flush();

//寫字符數(shù)組一部分

fw.write(c, 2, 2);

fw.flush();

//寫如字符串

fw.write("hello");

fw.flush();

fw.close();

}

}

字符輸入流讀取文本FileReader類

/*

*  字符輸入流讀取文本文件,所有字符輸入流的超類

*    java.io.Reader

*  專門讀取文本文件

* 

*  讀取的方法 : read()

*  int read() 讀取1個字符

*  int read(char[] c) 讀取字符數(shù)組

* 

*  Reader類是抽象類,找到子類對象 FileReader

* 

*  構(gòu)造方法: 綁定數(shù)據(jù)源

*    參數(shù):

*        File  類型對象

*        String文件名

*/

public class ReaderDemo {

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

FileReader fr = new FileReader("c:\\1.txt");

/*int len = 0 ;

while((len = fr.read())!=-1){

System.out.print((char)len);

}*/

char[] ch = new char[1024];

int len = 0 ;

while((len = fr.read(ch))!=-1){

System.out.print(new String(ch,0,len));

}

fr.close();

}

}

字符流復制文本文件


/*

*  字符流復制文本文件,必須文本文件

*  字符流查詢本機默認的編碼表,簡體中文GBK

*  FileReader讀取數(shù)據(jù)源

*  FileWriter寫入到數(shù)據(jù)目的

*/

public class Copy_2 {

public static void main(String[] args) {

FileReader fr = null;

FileWriter fw = null;

try{

fr = new FileReader("c:\\1.txt");

fw = new FileWriter("d:\\1.txt");

char[] cbuf = new char[1024];

int len = 0 ;

while(( len = fr.read(cbuf))!=-1){

fw.write(cbuf, 0, len);

fw.flush();

}

}catch(IOException ex){

System.out.println(ex);

throw new RuntimeException("復制失敗");

}finally{

try{

if(fw!=null)

fw.close();

}catch(IOException ex){

throw new RuntimeException("釋放資源失敗");

}finally{

try{

if(fr!=null)

fr.close();

}catch(IOException ex){

throw new RuntimeException("釋放資源失敗");

}

}

}

}

}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末坟岔,一起剝皮案震驚了整個濱河市谒兄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炮车,老刑警劉巖舵变,帶你破解...
    沈念sama閱讀 212,657評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瘦穆,居然都是意外死亡纪隙,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,662評論 3 385
  • 文/潘曉璐 我一進店門扛或,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绵咱,“玉大人,你說我怎么就攤上這事熙兔”妫” “怎么了?”我有些...
    開封第一講書人閱讀 158,143評論 0 348
  • 文/不壞的土叔 我叫張陵住涉,是天一觀的道長麸锉。 經(jīng)常有香客問我,道長舆声,這世上最難降的妖魔是什么花沉? 我笑而不...
    開封第一講書人閱讀 56,732評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮媳握,結(jié)果婚禮上碱屁,老公的妹妹穿的比我還像新娘。我一直安慰自己蛾找,他們只是感情好娩脾,可當我...
    茶點故事閱讀 65,837評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著打毛,像睡著了一般柿赊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上幻枉,一...
    開封第一講書人閱讀 50,036評論 1 291
  • 那天碰声,我揣著相機與錄音,去河邊找鬼展辞。 笑死,一個胖子當著我的面吹牛万牺,可吹牛的內(nèi)容都是我干的罗珍。 我是一名探鬼主播洽腺,決...
    沈念sama閱讀 39,126評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼覆旱!你這毒婦竟也來了蘸朋?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,868評論 0 268
  • 序言:老撾萬榮一對情侶失蹤扣唱,失蹤者是張志新(化名)和其女友劉穎藕坯,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體噪沙,經(jīng)...
    沈念sama閱讀 44,315評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡炼彪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,641評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了正歼。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片辐马。...
    茶點故事閱讀 38,773評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖局义,靈堂內(nèi)的尸體忽然破棺而出喜爷,到底是詐尸還是另有隱情,我是刑警寧澤萄唇,帶...
    沈念sama閱讀 34,470評論 4 333
  • 正文 年R本政府宣布檩帐,位于F島的核電站,受9級特大地震影響另萤,放射性物質(zhì)發(fā)生泄漏湃密。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,126評論 3 317
  • 文/蒙蒙 一仲墨、第九天 我趴在偏房一處隱蔽的房頂上張望勾缭。 院中可真熱鬧,春花似錦目养、人聲如沸俩由。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,859評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幻梯。三九已至,卻和暖如春努释,著一層夾襖步出監(jiān)牢的瞬間碘梢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,095評論 1 267
  • 我被黑心中介騙來泰國打工伐蒂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留煞躬,地道東北人。 一個月前我還...
    沈念sama閱讀 46,584評論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像恩沛,于是被迫代替她去往敵國和親在扰。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,676評論 2 351

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