IO流

1.IO流

以后開發(fā)中會遇到文件的上傳和下載益缠,都是需要用到IO流

咱們電腦上面所有的文件贬养, 文檔 音頻 圖片 視頻 等都是可以進行讀和寫的权烧。他們咋讀的翠肘? 咋寫的檐束?

依靠流的形式進行讀 和寫。很抽象

在讀取的時候束倍,會將咱們的文件(音頻 視頻 等)變成流的形式 一點一點來處理的 拆解開來處理的被丧。

1.1緩沖的概念

看視頻有點卡盟戏?暫停一下,加載緩沖一下甥桂。

快遞:送到物流中轉(zhuǎn)站柿究,然后分批次的發(fā)。物流中轉(zhuǎn)站就是緩沖的概念黄选。

IO流 的本質(zhì)就是對電腦的文件進行讀和寫的

計算機通過CPU內(nèi)存讀取磁盤上面的文件數(shù)據(jù)蝇摸,假如一次讀取1字節(jié)。但是可以加上緩沖的概念办陷,每次讀取4字節(jié)(4kb)貌夕。效率會高點的。

1.2IO流的分類

1.從磁盤讀取數(shù)據(jù)到內(nèi)存(Java代碼) 磁盤>>代碼中????輸入流

2.從內(nèi)存(Java代碼 )寫入到磁盤某一個文件 代碼>>磁盤 ????輸出流

  參照物:是內(nèi)存民镜,就是Java代碼蜂嗽。

              輸入流: 從磁盤讀取到內(nèi)存

              輸出流:從內(nèi)存寫入到磁盤

I:
input: 輸入 從磁盤讀取數(shù)據(jù)到內(nèi)存

使用input輸入流的應(yīng)用場景是啥:比如 磁盤上面有一個1.txt文件,將1.txt文件的內(nèi)容讀取到Java內(nèi)存中殃恒。使用的就是輸入流植旧。

輸入流分為兩種:

1.字節(jié)輸入流 FileInputStream(重點)

2.字符輸入流 FileRead(非重點)

O:

out:輸出 將java代碼寫入到磁盤中某一個文件

輸出流分為兩種:

1.字節(jié)輸出流 FileOutputStream(重點)

2.字符輸出流 FileWrite(非重點)

1.2.1字節(jié)輸入流

字節(jié)輸入流:磁盤上面有一個1.txt文件,現(xiàn)在要將1.txt文件中的內(nèi)容讀取到內(nèi)存(Java代碼中)

Java給咱們封裝好了類: FileInputStream 文件輸入流(字節(jié)輸入流)

package com.wyx.a_fileinputstream;

import java.io.*;
import java.util.Arrays;

public class Demo1 {
    public static void main(String[] args) throws IOException {
        //將磁盤上面的e:/aaa/1.txt文檔內(nèi)容讀取到內(nèi)存(java代碼)中
        //加上緩沖的效果

        //1.創(chuàng)建File對象离唐,是咱們本地磁盤文件的一個file文件
        //為啥要創(chuàng)建這個File對象病附?
        //因為要讀取1.txt這個文件的里面的內(nèi)容,首先先找到文件再說亥鬓。
        File file = new File("e:/aaa/1.txt");

        //2.創(chuàng)建文件字節(jié)流輸入對象完沪,來操作1.txt
        //FileInputStream(File file)
        //通過打開與實際文件的連接創(chuàng)建一個FileInputStream,
        //該文件由文件系統(tǒng)中的 File對象 file命名嵌戈。
        //該對象作用將c:/aaa/1.txt文件轉(zhuǎn)為字節(jié)輸入流的形式覆积,之后可以按照流的形式讀取到內(nèi)存中
        FileInputStream fis = new FileInputStream(file);

        //3.fileInputStream 這個流本身不具備緩沖的效果。
        //但是要加上緩沖的效果J烨骸?淼怠! 咋辦庵朝?使用另外一個流
        //BufferedInputStream
        //一個 BufferedInputStream 為另一個輸入流添加了功能吗冤,即緩沖輸入。
        //咋加九府?將FileInputStream傳給BufferedInputStream
        //此時FileInputStream  就具備緩沖的功能了W滴痢!侄旬!
        BufferedInputStream bis = new BufferedInputStream(fis);

        //使用字節(jié)緩沖流操作1.txt文件
        //當創(chuàng)建BufferedInputStream時肺蔚,
        //將創(chuàng)建一個內(nèi)部緩沖區(qū)數(shù)組,這個數(shù)組是什么數(shù)據(jù)類型的?
        //byte  為啥是byte類型的數(shù)組
        //因為是字節(jié)輸入流  所以是byte  byte 就是字節(jié)

        //4.創(chuàng)建一個緩沖區(qū)的數(shù)組
        byte[] buf = new byte[4 * 1024];//緩沖區(qū):可以存放4096字節(jié)
        //現(xiàn)在數(shù)組是空的

        //5.讀取數(shù)據(jù)
        //public int read(byte[] b)
        //         throws IOException
        //從輸入流讀取一些字節(jié)數(shù)儡羔,并將它們存儲到緩沖區(qū)b 宣羊。
        // 實際讀取的字節(jié)數(shù)作為整數(shù)返回
        //如果b的長度為零声旺,就是輸出容量為0,則不會讀取字節(jié)并返回0 ;
        // 否則段只,嘗試讀取至少一個字節(jié)。
        // 如果沒有字節(jié)可用鉴扫,因為流在文件末尾赞枕,則返回值-1


        //將1.txt文件的內(nèi)容 讀取到緩沖數(shù)組中buf里面
        //之前buf是一個空的數(shù)組,現(xiàn)在通過read方法將1.txt文件中的內(nèi)容讀取到了 buf空的數(shù)組中,返回是int類型的實際讀取字節(jié)數(shù)
//        int read = bis.read(buf);
//        System.out.println("實際讀取字節(jié)數(shù)" + read);//6
        //借助String查看存的內(nèi)容坪创,因為是數(shù)組炕婶,無法直接打印。從0開始莱预,打印前6個柠掂,因為文檔中只存了6個字節(jié)內(nèi)容,所以打印前6個字節(jié)
//        System.out.println(new String(buf, 0, read));



        //當緩沖數(shù)組的容量小于文件字節(jié)數(shù)的時候依沮,
        //發(fā)現(xiàn)數(shù)據(jù)一次性讀取不完涯贞?咋辦?咋解決危喉?
        //倆種思想:
        //一是多讀取幾遍宋渔,不使用,文檔大的時候辜限,重復(fù)代碼多
//        int read1 = bis.read(buf);
//        System.out.println(new String(buf, 0, read1));
//        int read2 = bis.read(buf);
//        System.out.println(new String(buf, 0, read2));
        //二:借助循環(huán)
        int length = -1;
        //如果length=-1  那么就會到達流的末尾  就證明后面沒有數(shù)據(jù)
        //循環(huán)結(jié)束皇拣,不要再讀了
        while ((length = bis.read(buf)) != -1) {
            //數(shù)組中的東西要展示出來  使用String
            //將磁盤上面的內(nèi)容 讀取到 >> 內(nèi)存  buf數(shù)組中
            System.out.println(new String(buf, 0, length));
        }

        //6.是需要關(guān)閉的(要不然占內(nèi)存)
        //關(guān)閉緩沖流
        bis.close();
        //關(guān)閉輸入流
        fis.close();
    }
}

字節(jié)輸入流入門案例

package com.wyx.a_fileinputstream;

import java.io.*;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        //對哪個文件操作,先找到這個文件
        File file = new File("e:/aaa/2.txt");
        //創(chuàng)建輸入流對象
        FileInputStream fis = new FileInputStream(file);
        //添加緩沖效果
        BufferedInputStream bis = new BufferedInputStream(fis);
        //讀取到的數(shù)組存到byte數(shù)組中
        byte[] but = new byte[1024 * 4];
        int length;
        while ((length = bis.read(but)) != -1) {
            //借助String類將數(shù)組打印出來
            System.out.println(new String(but,0, length));
        }
        //關(guān)閉流
        bis.close();
        fis.close();
    }
}

字節(jié)輸出流(從內(nèi)存到磁盤)write(byte[] b)

write(byte[] b); 寫入到磁盤薄嫡,參數(shù)是一個字節(jié)數(shù)組
將str字符串轉(zhuǎn)為字節(jié)數(shù)組:str.getBytes();

代碼運行一次氧急,會把原先內(nèi)容給覆蓋掉

輸出流:如果發(fā)現(xiàn)發(fā)現(xiàn)文件不存在,不會報錯毫深,因為會自動創(chuàng)建文件吩坝,但不會自動創(chuàng)建目錄,
輸入流:找不到文件會報錯

package com.wyx.a_fileinputstream;

import java.io.*;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        //1.創(chuàng)建File對象哑蔫,文件路徑對象  告知編譯器要把數(shù)據(jù)寫到哪個文件中
        File file = new File("e:/aaa/3.txt");
        //2.實例化字節(jié)輸出流對象
        FileOutputStream fos = new FileOutputStream(file);
        //3.對FileOutputStream  加上緩沖的效果
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        String str = "五一假期就我自己沒走";

        //將str字符串轉(zhuǎn)為字節(jié)數(shù)組
        byte[] b = str.getBytes();
        bos.write(b);

        //5.寫完以后一定要刷新流然后關(guān)閉流
        bos.flush();//沒有實際的意義钾恢,可以不寫的
        //6.關(guān)閉流
        //在輸出流的時候一定是先開的后關(guān),后開的先關(guān)
        bos.close();
        fos.close();
    }
}

write的重載方法:write(int a)開發(fā)時候不用

write(int a);傳的是一個int類型的數(shù)
雖然傳的是int類型的鸳址,但是真正寫入的是int類型所對應(yīng)的ASCLL碼所對應(yīng)的字符

package com.wyx.b_fileoutputstream;

import java.io.*;

public class Demo2 {
    public static void main(String[] args) throws IOException {
        File file = new File("e:/aaa/4.txt");
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //void write(int b);
        //傳參是一個int類型瘩蚪,但是真正寫入的時候是int類型所對應(yīng)的字符
        bos.write(97);//開發(fā)時候不用
        bos.flush();
        bos.close();
        fos.close();

    }
}

write的重載方法:write(byte[] b, int off, int len)【重要】(開發(fā)經(jīng)常用)

從指定的字節(jié)數(shù)組中寫入len個字節(jié),從偏移off開始到緩沖的輸出流
如果指定的len長度超過字節(jié)數(shù)組長度稿黍,回報數(shù)組下標越界錯誤

package com.wyx.b_fileoutputstream;

import java.io.*;

public class Demo3 {
    public static void main(String[] args) throws IOException {
        File file = new File("e:/aaa/4.txt");
        FileOutputStream fos = new FileOutputStream(file);
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        String str = "abcdefg";
        //write(byte[] b,int off,int len)
        byte[] bytes = str.getBytes();
        bos.write(bytes, 0, 2);//寫入的是ab
        bos.flush();
        bos.close();
        fos.close();
    }
}

代碼簡寫

package com.wyx.b_fileoutputstream;

import java.io.*;

public class Demo4 {
    public static void main(String[] args) throws IOException {
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("e:/aaa/4.txt")));
        bos.write("寢室就我一個人".getBytes());
        bos.flush();
        bos.close();
    }
}

案例

把E盤aaa文件下的一個視屏復(fù)制到D盤下的aaa文件下
思路:先讀取再寫入
帶緩沖的效果

package com.wyx.b_fileoutputstream;

import java.io.*;

public class Demo5 {
    public static void main(String[] args) throws IOException {
        
        //1.創(chuàng)建一個字節(jié)緩沖輸入流
        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(new File("e:/aaa/java.mp4")));
        //2.創(chuàng)建一個字節(jié)緩沖輸出流,雖然d:/aaa/下面沒有java.mp4這個文件疹瘦,但是不會報錯,他會自動創(chuàng)建
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(new File("d:/aaa/java.mp4")));
        //3.創(chuàng)建緩沖數(shù)組
        byte[] bytes = new byte[1024 * 4];
        //4.借助循環(huán)讀取和寫入
        int length;
        while ((length = bis.read(bytes)) != -1) {
            bos.write(bytes, 0 ,length);
        }
        //5.關(guān)閉流
        bos.flush();
        bis.close();
        bos.close();
    }
}

不帶緩沖效果

package com.wyx.b_fileoutputstream;

import java.io.*;

public class Demo6 {
    public static void main(String[] args) throws IOException {
        //獲取當前系統(tǒng)時間
        long start = System.currentTimeMillis();
        
        FileInputStream fis = new FileInputStream(new File("c:/bbb/3.mp4"));
        FileOutputStream fos = new FileOutputStream(new File("c:/aaa/goudan.mp4"));
        int length = -1;
        //一次讀取一個字節(jié)
        while ((length = fis.read()) != -1) {
            fos.write(length);
        }
        fos.close();
        fis.close();
        //運行完之后代碼時間
        long end = System.currentTimeMillis();
        //相減得出代碼運行時間
        System.out.println(end - start);
    }
}

帶緩沖效果與不帶緩沖新效果相比較巡球,發(fā)現(xiàn)帶緩沖效果好言沐,運行時間短邓嘹,而不帶緩沖效果的,一次只能讀取一個字節(jié)险胰,運行時間長汹押。當然,也并不是緩沖數(shù)組長度越大越好起便,緩沖數(shù)組越大棚贾,在內(nèi)存開辟的空間就越大,占的內(nèi)存就越大榆综。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末妙痹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鼻疮,更是在濱河造成了極大的恐慌怯伊,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件判沟,死亡現(xiàn)場離奇詭異耿芹,居然都是意外死亡,警方通過查閱死者的電腦和手機挪哄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進店門猩系,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人中燥,你說我怎么就攤上這事寇甸。” “怎么了疗涉?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵拿霉,是天一觀的道長。 經(jīng)常有香客問我咱扣,道長绽淘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任闹伪,我火速辦了婚禮沪铭,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘偏瓤。我一直安慰自己杀怠,他們只是感情好,可當我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布厅克。 她就那樣靜靜地躺著赔退,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上硕旗,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天窗骑,我揣著相機與錄音,去河邊找鬼漆枚。 笑死创译,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的墙基。 我是一名探鬼主播软族,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碘橘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吱肌,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤痘拆,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后氮墨,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體纺蛆,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年规揪,在試婚紗的時候發(fā)現(xiàn)自己被綠了桥氏。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡猛铅,死狀恐怖字支,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情奸忽,我是刑警寧澤堕伪,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站栗菜,受9級特大地震影響欠雌,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疙筹,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一富俄、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧而咆,春花似錦霍比、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至馍驯,卻和暖如春阁危,著一層夾襖步出監(jiān)牢的瞬間玛痊,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工狂打, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留擂煞,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓趴乡,卻偏偏與公主長得像对省,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子晾捏,可洞房花燭夜當晚...
    茶點故事閱讀 45,047評論 2 355

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

  • 學(xué)習目的 了解java流的概念 了解java對流的分類 掌握java流的對象創(chuàng)建蒿涎,以及常用方法的使用 掌握java...
    從前的小余兒閱讀 245評論 0 0
  • 1 IO流基礎(chǔ) javaIO就是輸入輸出體系,簡單的理解就是java對于文件內(nèi)存網(wǎng)絡(luò)資源的操作惦辛,在java傳統(tǒng)的I...
    上善若淚閱讀 1,056評論 0 2
  • 一劳秋、IO概述 概念I(lǐng)O流用來處理設(shè)備之間的數(shù)據(jù)傳輸,包括上傳文件和下載文件胖齐。Java對數(shù)據(jù)的操作是通過流的方式玻淑。J...
    Anwfly閱讀 546評論 0 2
  • 原文鏈接:http://blog.163.com/zhang-_-jie/blog/static/16178437...
    Herman7z閱讀 486評論 0 1
  • 1.概述 IO參照物是當前程序使用內(nèi)存 I : input 從硬盤讀取數(shù)據(jù)到內(nèi)存! read 讀 O ...
    啥名字都有人取嗎閱讀 224評論 0 0