Java IO教程 OutputStream InputStream 讀寫字節流

一、首先了解IO流的4個頂級的父類

學到了最頂層的父類它的子類的方法通用。非常的方便。

1. 表格總結.

輸入流 輸出流
字節流 InputStream OutputStream
字符流 Reader Writer

二、先學習OutputStream類 寫流(數據:內存–>硬盤)

寫入數據的原理:Java程序IO流 – JVM – OS(Operate System) – OS調方法–寫入成功.

拓展:字符,字節,01進制的關係?(一切文件皆爲字節)

  1. 字節是一個單位: 1 字節 Byte = 8個01進制
  2. 字符是字母或者符號: 比如: a,b c …1、2、3、A、B、C、~!·#¥%

1.學習一個類,先學習它的構造方法。看文檔。

在這裏插入圖片描述
在這裏插入圖片描述

1.總結構造方法

  1. 帶boolean , 爲true 就是寫入文件的開頭,false反之
    在這裏插入圖片描述
  2. 參數是String就是,路徑,參數是File就是File對象,回顧我之前總結的File類的用法

2.再看Attribute參數,無

3.再看常用方法

在這裏插入圖片描述

4. 步驟

  • 一、步驟
  • 1.創建FileOutputStream對象,抽象類,(可以用多態)
  • 2.寫入數據 fileOutputStream.write(): 3 種方法。
  •  1.abstract void write(int b)
    
  •  將指定的字節寫入此輸出流
    
  •  2.void write(byte[] b)
    
  •  將 b.length字節從指定的字節數組寫入此輸出流。
    
  •  3.void write(byte[] b, int off, int len)
    
  •  從指定的字節數組寫入 len個字節,從偏移 off開始輸出到此輸出流。
    
  • 3.刷新緩存:fileOutputStream.flush();
  • 4.關閉流,節省內存: fileOutputStream.close() ;finally{}中使用更棒

5.代碼

package Java學習.Java高級.IO.IO.OutputStream字節輸出流;

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

/**
 * 寫入數據  內存---------硬盤
 * 一、步驟
 * 1.創建FileOutputStream對象,抽象類,用多態
 *
 * 2.寫入數據 fileOutputStream.write(): 3 種方法。
 *      1.abstract void write(int b)
 *      將指定的字節寫入此輸出流
 *      2.void write(byte[] b)
 *      將 b.length字節從指定的字節數組寫入此輸出流。
 *      3.void write(byte[] b, int off, int len)
 *      從指定的字節數組寫入 len個字節,從偏移 off開始輸出到此輸出流。
 *
 * 3.刷新緩存:fileOutputStream.flush();
 *
 * 4.關閉流,節省內存: fileOutputStream.close()
 */
public class Main {
    public static void main(String[] args)  {
        String url = "D:\\Program Files\\JetBrains\\test1\\Lab\\src\\Java學習\\Java高級\\" +
                "IO\\IO\\OutputStream字節輸出流\\";
        FileOutputStream fileOutputStream = null;
        try {
            System.out.println("-----------單個字符測試----------");
            fileOutputStream = new FileOutputStream(url+"單個字符測試.txt");
            fileOutputStream.write('a');
            fileOutputStream.flush();
            System.out.println("-------字符數組---------");
            System.out.println("如果字節是正數(0-127)顯示的查詢ASCII表");
            System.out.println("如果是負數,就會第一個字節和第二個字節組成中文顯示,查詢默認碼錶(GBK)表");
            FileOutputStream fileOutputStream1 = new FileOutputStream(url + "字符數組.txt");
            byte[] bytes1 = {65,66,67,68,69,'\n'};
            byte[] bytes2 = {-65,-66,-67,-68,-69};
            fileOutputStream1.write(bytes1);//ABCDE
            fileOutputStream1.flush();
            fileOutputStream1.write(bytes2);
            fileOutputStream1.flush();
            fileOutputStream1.close();
            System.out.println("------3.寫入指定部分的字節----");
            FileOutputStream fileOutputStream2 = new FileOutputStream(url + "寫入指定部分的字節.txt");
            fileOutputStream2.write(bytes1,1,2);//索引爲1,長度爲2 BC
            fileOutputStream2.flush();
            fileOutputStream2.close();
            System.out.println("-----4.字符串getByte()轉字節實現寫入字符串---------");
            FileOutputStream fileOutputStream3 = new FileOutputStream(url + "字符串getByte()轉字節實現寫入字符串.txt");
            String string = "半畝方糖";
            byte[] bytes4 = string.getBytes();
            fileOutputStream3.write(bytes4);
            fileOutputStream3.flush();
            fileOutputStream3.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }

        }

    }
}

輸出:
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

6.注意:
(1):沒有文件會創建文件(路徑要對)
(2):會覆蓋之前寫入的文件(你可以自己試試)
7.拓展:寫入文件的原理(寫入01進制)

在這裏插入圖片描述

二、InputStream 讀流

1.構造方法和 一、OutputStream 可以用多態

 InputStream inputStream = new FileInputStream(url);

url爲文件的路徑

2. Attribute屬性,無(同上)

3.常用方法

  • 1.read();讀取一個字節
  • 2.int read(Byte[]);一次緩存多個字節,依次讀取多個,建議1024*n
  • 3.close() 關閉讀流。

4,拓展:字節數組Byte[]變爲String的方法

初始化對象的時候用

new String(Byte[])
```
#### 5. 代碼
```java
package Java學習.Java高級.IO.IO.InputStream字節讀取流;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;

/**
 * 一、構造方法
 *       InputStream inputStream = new FileInputStream(url+"test1.txt");
 * 二、常用方法
 *  1.read();讀取一個字節
 *  2.int read(Byte[]);一次緩存多個字節,依次讀取多個,建議1024*n
 *  3.close()  關閉讀流。
 *  返回讀取的字節數量.int
 * 三、拓展把 字節數組變爲字符串--
 * 1. new String(byte[])
 * 2.new String(byte[],index,length )重索引index 開始,轉換長度 Length
 *
 */
public class Main {
    public static void main(String[] args) throws IOException {
        String url = "D:\\Program Files\\JetBrains\\test1\\Lab\\src\\Java學習\\Jav" +
                "a高級\\IO\\IO\\InputStream字節讀取流\\";
        System.out.println("-------1.read()單個字節讀取.----------");
        InputStream inputStream = new FileInputStream(url+"test1.txt");
        int indexByte;//文件接受
        while ((indexByte = inputStream.read())!=-1){
            System.out.println("單個字節爲: "+indexByte);
        }
        System.out.println("---------2.read(byte[])多個字節讀取--------");
        inputStream = new FileInputStream(url+"test1.txt");
        byte[] bytes = new byte[2];
        int length;
        length = inputStream.read(bytes);//記錄讀取的字節數量
        System.out.println("讀取的字節數: "+length);
        System.out.println("讀取的字節數組:"+ Arrays.toString(bytes));
        System.out.println("字節數組轉化爲字符串: "+new String(bytes));
        System.out.println("=====2次讀取,指針後移====");
        length = inputStream.read(bytes);//記錄讀取的字節數量
        System.out.println("讀取的字節數: "+length);
        System.out.println("讀取的字節數組:"+ Arrays.toString(bytes));
        System.out.println("字節數組轉化爲字符串: "+new String(bytes));
        System.out.println("-----3.循環連續讀取字符數組------");
        inputStream = new FileInputStream(url+"test1.txt");
        bytes = new byte[1024];
        length = 0;
        while ((length = inputStream.read(bytes))!=-1){
            System.out.println("讀取的字節數組轉化爲擁有長度的字符串: "+new String(bytes,0,length));
        }
    }
}

```
Run輸出:
-------1.read()單個字節讀取.----------
單個字節爲: 97
單個字節爲: 98
單個字節爲: 99
單個字節爲: 100
單個字節爲: 101
---------2.read(byte[])多個字節讀取--------
讀取的字節數: 2
讀取的字節數組:[97, 98]
字節數組轉化爲字符串: ab
=====2次讀取,指針後移====
讀取的字節數: 2
讀取的字節數組:[99, 100]
字節數組轉化爲字符串: cd
-----3.循環連續讀取字符數組------
讀取的字節數組轉化爲擁有長度的字符串: abcde

Process finished with exit code 0

### 四、練習,字節讀寫完成圖片的複製.
```java
package Java學習.Java高級.IO.IO.InputStream字節讀取流.練習讀寫複製文件;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 注意先關閉寫的流,因爲寫完了,就一定讀取完了,不然會數據丟失
 */
public class Demo {
    public static void main(String[] args) throws IOException {
        String url = "D:\\Program Files\\JetBrains\\test1\\Lab\\src\\Java學習\\Java" +
                "高級\\IO\\IO\\InputStream字節讀取流\\練習讀寫複製文件\\";
        System.out.println("---------1.單個字節讀寫效率慢-----");
        FileInputStream fileInputStream1 = new FileInputStream(url + "img.png");
        FileOutputStream fileOutputStream1 = new FileOutputStream(url + "單字節慢複製.png");
        byte[] bytes1 = new byte[1];
        long startTime = System.currentTimeMillis();
        while (fileInputStream1.read(bytes1) != -1){//開始單個字節的讀取
            fileOutputStream1.write(bytes1);//單個文件的寫入
        }
        System.out.println("複製單個字節圖片文件用時:"+(System.currentTimeMillis()-startTime)+" 毫秒");
        fileOutputStream1.close();//先關閉寫
        fileInputStream1.close();//再關閉讀
        System.out.println("----------1024*n 的字節讀取效率快-----");
        FileInputStream fileInputStream2 = new FileInputStream(url + "img.png");
        FileOutputStream fileOutputStream2 = new FileOutputStream(url + "多字節快複製.png");
        byte[] bytes2 = new byte[1024*100];
        long startTime2 = System.currentTimeMillis();
        while (fileInputStream2.read(bytes2) != -1){//開始1024*100字節的讀取
            fileOutputStream2.write(bytes2);//1024*100字節的的寫入
        }
        System.out.println("複製800KB,80_0000字節圖片文件用時:"+(System.currentTimeMillis()-startTime2)+" 毫秒");
        fileOutputStream2.close();//先關閉寫
        fileInputStream1.close();//再關閉讀
    }
}

Run:
---------1.單個字節讀寫效率慢-----
複製單個字節圖片文件用時:4954 毫秒
----------1024*n 的字節讀取效率快-----
複製800KB,80_0000字節圖片文件用時:0 毫秒

Process finished with exit code 0

可見,讀取多個字節相當的快,這裏已經可以忽略不記時間了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章