JAVA-------IO流

2020-08-13 20:43:10

IO流

什麼是流

  • 指一連串流動的字元,是以先進先出方式發送資訊的通道

根據數據的流向分爲:輸入流 和 輸出流

  • 輸入流:把數據從其他裝置上讀取到記憶體中的流
  • 輸出流:把數據從記憶體中寫出到其他裝置上的流

根據數據的型別分爲:位元組流和字元流

  • 位元組流:以位元組爲單位,讀寫數據的流。可以讀寫任何型別的檔案
  • 字元流:以字元爲單位,讀寫數據的流。只能讀寫文字

對應的超類

輸入流 輸出流
位元組流 InputStream OutputStream
字元流 Reader Writer

在这里插入图片描述

位元組流

OutputStream(位元組輸出流)

是所有位元組輸出流的所有類的超類,將指定的位元組資訊寫出到目的地

位元組輸出流的共性功能
public void close() :關閉此輸出流並釋放與此流相關聯的任何系統資源。
public void flush() :重新整理此輸出流並強制任何緩衝的輸出位元組被寫出。
public void write(byte[] b):將 b.length個位元組從指定的位元組陣列寫入此輸出流。
public void write(byte[] b, int off, int len) :從指定的位元組陣列寫入 len位元組,從偏移量 off開始輸出到此輸出流。 也就是說從off個位元組數開始讀取一直到len個位元組結束
 public abstract void write(int b) :將指定的位元組輸出流。
FileOutputStream

檔案輸出流,用於數據寫出到檔案

構造方法

在这里插入图片描述

其中 public FileOutputStream(String name)最常用

類似這樣建立位元組輸出流物件都做了三件事情

  1. 呼叫系統功能去建立檔案【輸出流物件纔會自動建立】
  2. 建立fos物件
  3. 把foutputStream物件指向這個檔案

FileOutputStream寫位元組數據

在这里插入图片描述

通過write方法實現位元組數據的寫入

FileOutputStream的換行實現與追加寫入
換行實現
	windows		\r\n
	Linux		\n
	Mac			\r
eclipse/IDEA 中的記事本軟體以及editplus這樣的第三種軟體都做了平臺的相容

追加寫入
	public FileOutputStream(File file, boolean append)
	public FileOutputStream(String name, boolean append)
這兩個構造方法,第二個參數中都需要傳入一個boolean型別的值,true 表示追加數據,false 表示不追加也就是清空原有數據。這樣建立的輸出流物件,就可以指定是否追加續寫了

程式碼演示

public class Test {
    public static void main(String[] args) throws IOException {
       
       File file = new File("a.txt");
        //當輸出流所關聯的檔案不存在,就會自動建立一個檔案,不會報錯
        FileOutputStream out = new FileOutputStream(file);
       
       //建立一個向具有指定名稱的檔案中寫入數據的輸出位元組流
        FileOutputStream out1 = new FileOutputStream("b.txt");
       
       //一次寫入一個位元組
        out1.write(97);
        out1.write(98);
        out1.write(99);
        out1.flush();
       
       //一次寫入一個位元組陣列  
       //.getBytes()
        byte[] bytes = "我想和你一起闖入森林潛入海底".getBytes();
        out.write(bytes);
        out.flush();
       
       //0表示從位元組陣列的哪個索引開始   12 表示寫了多少個位元組  
       //一個漢字在UTF-8中佔3個位元組
        out.write(butes,0,12);
        out.flush();
        
       //true表示追加寫入,不會造成覆蓋
        FileOutputStream out2 = new FileOutputStream("c.txt",true);
        byte[] bytes1 = "人類的本質".getBytes();
        out2.write(bytes1);
        out2.flush();
        
       // 換行符的使用
        out2.write("\r\n".getBytes());
        out2.flush();
        
       //最後記得關閉
        out.close();
        out1.close();
        out2.close();
    }
}

生成結果

a.txt

我想和你一起闖入森林潛入海底

b.txt

abc

c.txt

程式執行幾次,就會寫幾次,不會造成覆蓋

人類的本質
人類的本質
人類的本質
人類的本質

InputStream(位元組輸入流)

抽象類,是表示位元組輸入流的所有類的超類

位元組輸入流的共性功能
public void close() :關閉此輸入流並釋放與此流相關聯的任何系統資源。
public abstract int read(): 從輸入流讀取數據的下一個位元組。
public int read(byte[] b): 該方法返回的int值代表的是讀取了多少個位元組,讀到幾個返回幾個,讀取不到返回-1
FileInputStream

檔案輸入流,從檔案中讀取位元組

構造方法

在这里插入图片描述

其中 public FileInputStream(String name)最常用

讀取位元組

在这里插入图片描述

**read()**方法

(d.txt)內容爲 abcd

public class Test2 {
    public static void main(String[] args) throws IOException {
        File file = new File("d.txt");
        file.createNewFile();
        FileInputStream in = new FileInputStream(file);
        int r1 = in.read();
        System.out.println(r1);
        int r2 = in.read();
        System.out.println(r2);
        int r3 = in.read();
        System.out.println(r3);
        int r4 = in.read();
        System.out.println(r4);
        int r5 = in.read();
        System.out.println(r5);
        
    }
}
輸出結果
97
98
99
100
-1
使用位元組陣列讀取

read(byte[] b),每次讀取b的長度個位元組到陣列中,返回讀取到的有效位元組個數,讀取到末尾時,返回-1

public class Test2 {
    public static void main(String[] args) throws IOException {
        File file = new File("d.txt");
        file.createNewFile();
        FileInputStream in = new FileInputStream(file);
        byte[] bytes = new byte[1024];
        int len=0;
        int read = in.read(bytes);
        for (byte aByte : bytes) {
            System.out.println(aByte);
        }
        System.out.println(read);
        in.close();
    }
}
輸出結果
97
98
99
100
(1020個0)
4

字元流

Reader(字元輸入流)

抽象類,字元輸入流的所有類的超類,可以讀取字元資訊到記憶體中

字元輸入流的共性方法
public void close() :關閉此流並釋放與此流相關聯的任何系統資源。
public int read(): 從輸入流讀取一個字元。
public int read(char[] cbuf): 從輸入流中讀取一些字元,並將它們儲存到字元陣列 cbuf中
InputStreamReader/FileReader

InputStreamReader是位元組流通向字元流的橋樑

FileReader是讀取字元檔案的便利類

構造方法

在这里插入图片描述

Writer(字元輸出流)

抽象類,字元輸出流的所有類的超類,將指定的字元資訊寫出到目的地

字元輸出流的共性方法
void write(int c) 寫入單個字元
void write(char[] cbuf)寫入字元陣列
abstract void write(char[] cbuf, int off, int len)寫入字元陣列的某一部分,off陣列的開始索引,len寫的字元個數
void write(String str)寫入字串
void write(String str, int off, int len) 寫入字串的某一部分,off字串的開始索引,len寫的字元個數
void flush()重新整理該流的緩衝
void close() 關閉此流,但要先重新整理它
OutputStreamWriter/FileWriter

OutputStreamWriter是字元流通向位元組流的橋樑

FileWriter是寫出字元到檔案的便利類

構造方法
在这里插入图片描述