java——IO講解(字節(jié)流)

流:流分為字節(jié)流(以字節(jié)為單位)和字符流(以字符為單位)粪摘。字節(jié)流和字符流又有一個共性徘意,兩個都有輸入流和輸出椎咧。本章主要講解字節(jié)流勤讽。
字節(jié)輸出流:使用字節(jié)輸出流必須用到一個類,這個類是所有輸出流的基類:OutputStream向臀。
下面介紹一下OutputStream類的所有方法:

·public abstract void write(int b) throws IOException:
【向指定的文件中寫入內容飒硅,每次寫入一個字節(jié)三娩,因為字節(jié)可以自動轉換成int類型,但是這里需要使用到循環(huán)寫入】

·public void write(byte[] b) throws IOException
【將內容轉換成字節(jié)數(shù)組雀监,之后再寫入】

·public void write(byte[] b, int off, int len) throws IOException
【將字節(jié)數(shù)組的部分輸出,off表示輸出的內容的起始下標匾竿,len表示輸出的長度】

·public void close() throws IOException
【關閉流岭妖,避免浪費資源】

public void flush() throws IOException
【刷新此輸出流并強制寫出所有緩沖的輸出字節(jié)昵慌≌剩】
示例:要想使用字節(jié)輸出流還需要實現(xiàn)OutputStream的子類淳蔼,這個子類java中已近給我們提供了:FileOutputStream

package com.zhaoqian.outputstream;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class Demo2 {

    private static final String LINE_SEPARATOR = System.getProperty("line.separator");

    public static void main(String[] args) throws Exception {
        File f = new File("D:"+File.separator+"Demo"+File.separator+"test.txt");
        
        if (!f.getParentFile().exists()) {
            f.getParentFile().mkdirs();
            f.createNewFile();
        }
        
        // 要寫入文件中的內容鹉梨,換行輸出
        String str = LINE_SEPARATOR+"這是一個測試java字節(jié)輸出流的文件";
        
        // 實例化一個流對象
        OutputStream os = new FileOutputStream(f,true); // 如果不加true進行追加的化析桥,后的內容會覆蓋前面的內容
        
        //將字符串轉換成字節(jié)數(shù)組
        byte[] by = str.getBytes();
        // 第一種寫入方法
        for(byte b:by){
            
            os.write(b);
        }
        
//      第二種方法,寫入一個字節(jié)數(shù)組的內容(把所有內容存放在字節(jié)數(shù)組中)
//      os.write(by);
        
        // 第三種寫法:部分寫入
//      os.write(by, 0, 5);
        
        // 刷新數(shù)據(jù)
        os.flush();
        
        // 關閉資源
        os.close();
        
    }

}


上面是java中字節(jié)輸出流泡仗,下面是字節(jié)輸入流娩怎,和字節(jié)輸出流一樣截亦,輸出流也有一個基類:InputStream.所有的輸入流都是繼承了這個類袍啡。
而要實現(xiàn)字節(jié)輸入流也需要實現(xiàn)InputStream的子類却桶,這個子類同樣java中提供了:FileInputStream:
下面先介紹一下InputStream的常用的方法:

·public abstract int read() throws IOException:
【將文件中的內容讀取出來颖系,每次讀取一個字節(jié)嗅剖,會自動將byte轉換成int返回,如果沒有數(shù)據(jù)返回-1】

·public int read(byte[] b) throws IOException:
【每次讀取一個字節(jié)數(shù)組長度的內容嘁扼,返回的是讀取到的長度信粮,如果沒有數(shù)據(jù)返回-1】

·public int read(byte[] b, int off, int len) throws IOException:
【將內容讀取到數(shù)組的部分元素,off表示起始下標趁啸,len表示長度强缘,返回的是讀取到的長度,如果沒有數(shù)據(jù)返回-1】

示例:

package com.zhaoqiang.inputstream;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

public class Demo2 {

    public static void main(String[] args) throws Exception {
        File f = new File("D:"+File.separator+"Demo"+File.separator+"test.txt");
        
        if (!f.getParentFile().exists()) {
            f.getParentFile().mkdirs();
            f.createNewFile();
        }
        
        // 實例化一個字節(jié)輸入流對象
        InputStream is = new FileInputStream(f);
        
        byte[] by = new byte[2];
        
        int len = 0;
        
        test2(is, by);
        
//      test1(is);
             
    }

    private static void test2(InputStream is, byte[] by) throws IOException {
        int len;
        StringBuffer sb = new StringBuffer();
        while((len = is.read(by)) != -1){
            sb.append(new String(by,0,len));
//          System.out.println(new String(by,0,len));
        }
        System.out.println(sb);
        is.close();
    }

    private static void test1(InputStream is) throws IOException {
        // 定義一個字節(jié)數(shù)組.用于接受讀取到的字節(jié),數(shù)組長度必須大于或等于所讀內容的字節(jié)數(shù)
        //byte[] by = new byte[1024];
            // 一個自己數(shù)組和文件字節(jié)大小一樣莲绰,不建議這樣使用.因為一個文件過大,內存容易溢出
        byte[] by = new byte[is.available()]; 
        int temp = 0;
        int index = 0;
        
        while((temp = is.read()) != -1){
            by[index++] = (byte)temp;
        }
        
        
        
        // 將一個字節(jié)數(shù)組轉換成字符串輸出
//      System.out.println(new String(by));
        System.out.println(new String(by,0,index));
        is.close();
    }

}

IO中異常處理示例:

package com.zhaoqiang.inputstream;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Demo3 {

    /*
     *  異常處理
     * */
    
    public static void main(String[] args) {
        File file = new File("D:"+File.separator+"Demo"+File.separator+"test.txt");
        if (!file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        
        OutputStream os = null;
        try {
            os = new FileOutputStream(file);
            os.write("測試數(shù)據(jù)".getBytes());
        } catch (IOException e) {
//          e.printStackTrace();
            System.out.println(e.toString());
            throw new RuntimeException("文件創(chuàng)建錯誤");
            
        }finally{
            // 關閉資源時候發(fā)生了IO異常
            
            if (os == null) {
                System.out.println("文件創(chuàng)建失敗");
            }else{
                try {
                    // 這個地方的情況必須是文件創(chuàng)建成功之后
                    os.close();
                } catch (IOException e) {
                    throw new RuntimeException("底層出錯");
                }
            }
            
        }
        
    }

}

示例:通過字節(jié)流復制文件

package com.zhaoqiang.inputstream;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class Demo4 {

    /*
     *  用字節(jié)流復制一個文件
     * */
    public static void main(String[] args) throws IOException {
        
        // 源文件
        File file = new File("D:"+File.separator+"Demo"+File.separator+"1.jpg");
        // 目的地
        File fe = new File("F:"+File.separator+"Demo"+File.separator+"11.jpg");
    
![無標題.png](http://upload-images.jianshu.io/upload_images/5193081-3420e89a5143b87a.png)

        // 創(chuàng)建流
        OutputStream os = new FileOutputStream(fe);
        InputStream in = new FileInputStream(file);
        
        // 使用輸入流的讀取方式讀取字節(jié)姑丑,并將字節(jié)寫入到目的中
        int len = 0;
        byte[] by = new byte[1024];
        // 讀一個寫一個
        while((len = in.read(by))!=-1){
            os.write(by);
        }
        // 關閉資源
        in.close();
        os.close();
        
        
    }

}

上面的代碼解釋圖形:


無標題.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末震肮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌豪嚎,老刑警劉巖格嘁,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件扭粱,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機贺奠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來眉孩,“玉大人凛虽,你說我怎么就攤上這事钉迷。” “怎么了枷颊?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵题造,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任肪凛,我火速辦了婚禮衡奥,結果婚禮上譬淳,老公的妹妹穿的比我還像新娘绎秒。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布怕午。 她就那樣靜靜地躺著,像睡著了一般搔体。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天零酪,我揣著相機與錄音,去河邊找鬼。 笑死辜窑,一個胖子當著我的面吹牛所禀,可吹牛的內容都是我干的色徘。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斤寂!你這毒婦竟也來了遍搞?” 一聲冷哼從身側響起诊县,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎衔沼,沒想到半個月后混巧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體秘蛔,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年傍衡,在試婚紗的時候發(fā)現(xiàn)自己被綠了深员。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛙埂,死狀恐怖辨液,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情箱残,我是刑警寧澤滔迈,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站被辑,受9級特大地震影響燎悍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜盼理,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一谈山、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧宏怔,春花似錦奏路、人聲如沸畴椰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽斜脂。三九已至,卻和暖如春触机,著一層夾襖步出監(jiān)牢的瞬間帚戳,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工儡首, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留片任,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓蔬胯,卻偏偏與公主長得像对供,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子氛濒,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內容

  • IO簡單概述 IO解決問題 : 解決設備與設備之間的數(shù)據(jù)傳輸問題(硬盤 -> 內存 內存 -> 硬盤) 讀和寫文...
    奮斗的老王閱讀 3,429評論 0 53
  • 一犁钟、流的概念和作用。 流是一種有順序的泼橘,有起點和終點的字節(jié)集合涝动,是對數(shù)據(jù)傳輸?shù)目偝苫虺橄蟆<磾?shù)據(jù)在兩設備之間的傳輸...
    布魯斯不吐絲閱讀 10,018評論 2 95
  • 1. Java基礎部分 基礎部分的順序:基本語法炬灭,類相關的語法醋粟,內部類的語法,繼承相關的語法重归,異常的語法米愿,線程的語...
    子非魚_t_閱讀 31,581評論 18 399
  • 1 IONo18 1.1IO框架 【 IO:Input Output 在程序運行的過程中,可能需要對一些設備進...
    征程_Journey閱讀 948評論 0 1
  • 昨晚躺下后鼻吮,一直在想試題袋的問題育苟,到后來想清楚了,竟有點小激動椎木,結果卻失眠了违柏。 早晨老董一早就起來了,我可能因為生...
    暫且這樣吧閱讀 275評論 0 1