电竞比分网-中国电竞赛事及体育赛事平台

分享

IO流

 印度阿三17 2019-07-25

目錄:

IO流

IO流概述及其分類

A:IO流概述
	IO流用來處理設(shè)備之間的數(shù)據(jù)傳輸
	Java對(duì)數(shù)據(jù)的操作是通過流的方式
	Java用于操作流的對(duì)象都在IO包中 java.io
B:IO流分類
	a:按照數(shù)據(jù)流向 站在內(nèi)存角度
		輸入流	讀入數(shù)據(jù)
		輸出流	寫出數(shù)據(jù)
	b:按照數(shù)據(jù)類型
		字節(jié)流 可以讀寫任何類型的文件 比如音頻 視頻  文本文件
		字符流 只能讀寫文本文件
		什么情況下使用哪種流呢?
		如果數(shù)據(jù)所在的文件通過windows自帶的記事本打開并能讀懂里面的內(nèi)容,就用字符流。其他用字節(jié)流。
		如果你什么都不知道,就用字節(jié)流

IO流基類概述和FileOutputStream的構(gòu)造方法

A:IO流基類概述
	a:字節(jié)流的抽象基類:
		InputStream ,OutputStream。
	b:字符流的抽象基類:
		Reader , Writer。
	注:由這四個(gè)類派生出來的子類名稱都是以其父類名作為子類名的后綴。
	如:InputStream的子類FileInputStream。
	如:Reader的子類FileReader。
B:FileOutputStream的構(gòu)造方法
	由一個(gè)案例引出使用IO流寫數(shù)據(jù),由于字節(jié)流先出現(xiàn)就先學(xué)習(xí)字節(jié)輸出流基類OutputStream,
	使用具體子類FileOutputStream
	Io流的分類:
	- (1): 按照流向進(jìn)行劃分
 		輸入流
 		輸出流
- (2): 按照操作的數(shù)據(jù)類型進(jìn)行劃分
- 字節(jié)流
- 字節(jié)輸入流	InputStream		讀
- 字節(jié)輸出流	OutputStream	寫
- 字符流
- 字符輸入流 	Reader			讀
- 字符輸出流	Writer			寫
- 
- 需求:	往一個(gè)文本文件中寫一串?dāng)?shù)據(jù) Hello,IO
- 分析:
- a: 我們現(xiàn)在操作的是文本文件,所有按照我們的想法,我們優(yōu)先現(xiàn)在字符流,但是字節(jié)流是優(yōu)先于字符流. 所以先使用字節(jié)流
- b: 因?yàn)槲覀円獙憯?shù)據(jù),所以我們應(yīng)該使用字節(jié)流中輸出流	OutputStream
- 我們發(fā)現(xiàn)OutputStream是一個(gè)抽象類,我們不能對(duì)其進(jìn)行直接實(shí)例化,而我們需要使用子類對(duì)其進(jìn)行實(shí)例化.那么選擇哪個(gè)子類呢?
- 我們現(xiàn)在操作的是文件所以我們選擇的是FileOutputStream

FileOutputStream寫出數(shù)據(jù)

A: 構(gòu)造方法
	FileOutputStream(File file)
	FileOutputStream(String name)
B:案例演示
	FileOutputStream寫出數(shù)據(jù)
	public static void main(String[] args) throws IOException {
        //異常的處理 File
        //I/O InputStream 輸入流  OutPutStream 輸出流  處理設(shè)備之間的一個(gè)數(shù)據(jù)傳輸
        //流按照流向分:分為 輸入流和輸出流
        //按照讀寫文件的類型分:分為字節(jié)流(可以讀寫任意類型的文件)和字符流(讀寫文本文件)
        //字節(jié)流:
       //文件輸入輸出 流
        //文件輸出流:寫出數(shù)據(jù)
        //
        //FileOutputStream(File file)
        //創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫入數(shù)據(jù)的文件輸出流。

        //FileOutputStream(String name)
        //創(chuàng)建一個(gè)向具有指定名稱的文件中寫入數(shù)據(jù)的輸出文件流。
        File file = new File("a.txt");
        //file.createNewFile();
        //輸入流,所關(guān)聯(lián)的文件,如果該文件不存在 ,那么會(huì)自動(dòng)幫你創(chuàng)建
        FileOutputStream out = new FileOutputStream(file);

        FileOutputStream fileOutputStream = new FileOutputStream("b.txt");
        //流用完之后必須釋放資源
        out.close();
        fileOutputStream.close();

    }
	
	注意事項(xiàng):
		創(chuàng)建字節(jié)輸出流對(duì)象了做了幾件事情?
		a:調(diào)用系統(tǒng)資源創(chuàng)建a.txt文件
	  	b:創(chuàng)建了一個(gè)fos對(duì)象
	  	c:把fos對(duì)象指向這個(gè)文件
		為什么一定要close()?

		a: 通知系統(tǒng)釋放關(guān)于管理a.txt文件的資源
		b: 讓Io流對(duì)象變成垃圾,等待垃圾回收器對(duì)其回收

FileOutputStream的三個(gè)write()方法

A:FileOutputStream的三個(gè)write()方法
	public void write(int b):寫一個(gè)字節(jié)  超過一個(gè)字節(jié) 砍掉前面的字節(jié)
	public void write(byte[] b):寫一個(gè)字節(jié)數(shù)組
	public void write(byte[] b,int off,int len):寫一個(gè)字節(jié)數(shù)組的一部分
B:案例演示:	FileOutputStream的三個(gè)write()方法
public static void main(String[] args) throws IOException {
        //通過文件輸出流,往他所關(guān)聯(lián)的件中,寫出數(shù)據(jù)
        FileOutputStream out = new FileOutputStream("a.txt");
        //寫數(shù)據(jù)
        out.write(97); //一次寫入一個(gè)字節(jié)
        out.write(98);
        out.write(99);
        out.write(100);
        out.write(300); //超過了一個(gè)字節(jié),會(huì)丟棄掉多余字節(jié)
        byte[] bytes = {101, 102, 103, 104};
        out.write(bytes);//一次寫入一個(gè)字節(jié)數(shù)組
        out.write(bytes, 2, 2);//一次寫入字節(jié)數(shù)組的一部分,從2索引開始,寫2個(gè)字節(jié)
        String str = "楊家有女初長成,養(yǎng)在深閨人未識(shí)";
        //UTF-8 編碼 一個(gè)漢字占三個(gè)字節(jié)
        byte[] bytes1 = str.getBytes();//將一個(gè)字符串,轉(zhuǎn)換成字節(jié)數(shù)組
        out.write(bytes1);
        out.close();
    }

FileOutputStream寫出數(shù)據(jù)實(shí)現(xiàn)換行和追加寫入

A:案例演示:	FileOutputStream寫出數(shù)據(jù)如何實(shí)現(xiàn)數(shù)據(jù)的換行

		 windows下的換行符只用是 \r\n
		  Linux		\n
 		  Mac		\r

 eclipse/IDEA 中的記事本軟件以及editplus這樣的第三種軟件都做了平臺(tái)的兼容

public static void main(String[] args) throws IOException {
FileOutputStream out = new FileOutputStream(“b.txt”);
out.write(“回眸一笑百媚生,六宮粉黛無顏色”.getBytes());
out.write("\r\n".getBytes());//寫入一個(gè)回車換行符
out.write(“回眸一笑百媚生,六宮粉黛無顏色”.getBytes());
out.write("\r\n".getBytes());//寫入一個(gè)回車換行符
out.write(“回眸一笑百媚生,六宮粉黛無顏色”.getBytes());
out.write("\r\n".getBytes());//寫入一個(gè)回車換行符
out.write(“回眸一笑百媚生,六宮粉黛無顏色”.getBytes());

    //各個(gè)平臺(tái)的換行符,都不一樣
    //windows 平臺(tái) \r\n
    //Linux		\n
    //Mac		\r
    //流用完之后,必須釋放資源
    out.close(); //關(guān)閉流
}
B:案例演示:	FileOutputStream寫出數(shù)據(jù)如何實(shí)現(xiàn)數(shù)據(jù)的追加寫入

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

        //注意事項(xiàng):
        //創(chuàng)建字節(jié)輸出流對(duì)象了做了幾件事情 ?
        //        a : 調(diào)用系統(tǒng)資源創(chuàng)建a.txt文件
        //b:
        //創(chuàng)建了一個(gè)fos對(duì)象
        //c:
        //把fos對(duì)象指向這個(gè)文件
        //為什么一定要close() ?
        //
        //        a : 通知系統(tǒng)釋放關(guān)于管理a.txt文件的資源
        //b:
        //讓Io流對(duì)象變成垃圾, 等待垃圾回收器對(duì)其回收

        //FileOutputStream(File file, boolean append)
        //創(chuàng)建一個(gè)向指定 File 對(duì)象表示的文件中寫入數(shù)據(jù)的文件輸出流。
        //
        //
        //FileOutputStream(String name, boolean append)
        //創(chuàng)建一個(gè)向具有指定 name 的文件中寫入數(shù)據(jù)的輸出文件流。
        //參數(shù)2:true 代表追加寫入,false 不追加
        FileOutputStream out = new FileOutputStream("c.txt",true);
        out.write("回眸一笑百媚生,六宮粉黛無顏色".getBytes());
        out.write("\r\n".getBytes());//寫入一個(gè)回車換行符
        out.write("回眸一笑百媚生,六宮粉黛無顏色".getBytes());
        //釋放資源
        out.close();
    }

FileOutputStream寫出數(shù)據(jù)加入異常處理

A:案例演示:FileOutputStream寫出數(shù)據(jù)加入異常處理
public static void main(String[] args) throws IOException {

        //
        //FileInputStream(String name)
        //通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè) FileInputStream,該文件通過文件系統(tǒng)中的路徑名 name 指定。
        //
        //FileInputStream(File file)
        //通過打開一個(gè)到實(shí)際文件的連接來創(chuàng)建一個(gè) FileInputStream,該文件通過文件系統(tǒng)中的 File 對(duì)象 file 指定。
        //文件輸入流
        File file = new File("e.txt");
        //輸入流所關(guān)聯(lián)的文件,如果不存在,就會(huì)報(bào)錯(cuò)
        FileInputStream in = new FileInputStream(file);

        FileInputStream in2 = new FileInputStream("e.txt");


    }

FileInputStream讀取數(shù)據(jù)一次一個(gè)字節(jié)

A:案例演示:	int read():一次讀取一個(gè)字節(jié)
                如果沒有數(shù)據(jù)返回的就是-1
public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("e.txt");
        //讀取文件中的數(shù)據(jù)
        int len = in.read();//一次讀取一個(gè)字節(jié)
        System.out.println(len);
        len = in.read();//一次讀取一個(gè)字節(jié)
        System.out.println(len);
        len = in.read();//一次讀取一個(gè)字節(jié)
        System.out.println(len);
        len = in.read();//一次讀取一個(gè)字節(jié)
        System.out.println(len);
        len = in.read();//一次讀取一個(gè)字節(jié)
        System.out.println(len);
        len = in.read();//一次讀取一個(gè)字節(jié)
        System.out.println(len);
        len = in.read();//一次讀取一個(gè)字節(jié)
        System.out.println(len); //讀取不到返回-1

        in.close();//記得流用完之后,釋放資源
    }

字節(jié)流復(fù)制文本文件

A:案例演示:	字節(jié)流一次讀寫一個(gè)字節(jié)復(fù)制文本文件

 分析:
 - a: 創(chuàng)建字節(jié)輸入流對(duì)象和字節(jié)輸出流對(duì)象
- b: 頻繁的讀寫操作
- c: 釋放資源
public static void main(String[] args) throws IOException {
        //我們可以使用文件輸入輸出流,進(jìn)行文件的復(fù)制
        //方式:讀取一個(gè)字節(jié),寫入一個(gè)字節(jié)來復(fù)制
        FileInputStream in = new FileInputStream("MyTest.java");
        FileOutputStream out = new FileOutputStream("E:\\MyTest.java");
        //循環(huán)的讀寫
        //定義一個(gè)變量
        int len=0; //表示讀取到的字節(jié)
        while ((len=in.read())!=-1){
            out.write(len);
            out.flush();//刷新
        }
        //釋放資源
        in.close();
        out.close();
    }

字節(jié)流復(fù)制MP3

A:案例演示:	字節(jié)流一次讀寫一個(gè)字節(jié)復(fù)制MP3

public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("demo.mp3");
        FileOutputStream out = new FileOutputStream("E:\\曾經(jīng)的你.mp3");
        int len=0;
        long start = System.currentTimeMillis();
        while ((len=in.read())!=-1){
           out.write(len);
           out.flush();
        }
        long end = System.currentTimeMillis();
        System.out.println((end-start) "毫秒");
        in.close();
        out.close();
    }

FileInputStream讀取數(shù)據(jù)一次一個(gè)字節(jié)數(shù)組

A:案例演示:	int read(byte[] b):一次讀取一個(gè)字節(jié)數(shù)組
		返回的int類型的值表示的意思是讀取到的字節(jié)的個(gè)數(shù),如果沒有數(shù)據(jù)了就返回-1
public static void main(String[] args) throws IOException {
        //很顯然,一次讀寫一個(gè)字節(jié)的方式 ,復(fù)制文件,效率太低
        //我們可以一次讀寫一個(gè)字節(jié)數(shù)組的方式來復(fù)制文件
        FileInputStream in = new FileInputStream("demo.mp3");
        FileOutputStream out = new FileOutputStream("E:\\曾經(jīng)的你2.mp3");
        //定義一個(gè)字節(jié)數(shù)組,充當(dāng)緩沖區(qū)
        byte[] bytes = new byte[1024 * 8];
        int len = 0;//記錄每次讀取到的有效字節(jié)個(gè)數(shù)
        long start = System.currentTimeMillis();
        while ((len = in.read(bytes)) != -1) {
            out.write(bytes, 0, len);
            out.flush();
        }
        long end = System.currentTimeMillis();
        System.out.println((end - start)   "毫秒");
        in.close();
        out.close();
    }

FileInputStream讀取數(shù)據(jù)的兩種方式比較圖解

A:畫圖演示:	FileInputStream讀取數(shù)據(jù)的兩種方式比較圖解

BufferedOutputStream寫出數(shù)據(jù)

A:緩沖思想
	字節(jié)流一次讀寫一個(gè)數(shù)組的速度明顯比一次讀寫一個(gè)字節(jié)的速度快很多,
	這是加入了數(shù)組這樣的緩沖區(qū)效果,java本身在設(shè)計(jì)的時(shí)候,
	也考慮到了這樣的設(shè)計(jì)思想(裝飾設(shè)計(jì)模式后面講解),所以提供了字節(jié)緩沖區(qū)流
B:BufferedOutputStream的構(gòu)造方法
	查看API
	BufferedOutputStream(OutputStream out)
C:案例演示
	BufferedOutputStream寫出數(shù)據(jù)

20.21_IO流(BufferedInputStream讀取數(shù)據(jù))(掌握)

A:BufferedInputStream的構(gòu)造方法
	查看API
	BufferedInputStream(InputStream in)
B:案例演示
	BufferedInputStream讀取數(shù)據(jù)
BufferedInputStream bfr = new BufferedInputStream(new FileInputStream("demo.mp3"));
        BufferedOutputStream bfw = new BufferedOutputStream(new FileOutputStream("demo2.mp3"));
        //讀取一個(gè)字節(jié)寫入一個(gè)字節(jié)
        int len=0;
        byte[] bytes = new byte[1024 * 8];
        while ((len=bfr.read(bytes))!=-1){
            bfw.write(bytes,0,len);
        }
        bfr.close();
        bfw.close();
來源:https://www./content-4-354451.html

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多