一、IO流概述
1.IO:輸入(Input讀取數據)/輸出(Output寫數據)
2.流:是一種抽象概念,是對數據傳輸的總稱,也就是說數據在設備間的傳輸稱為流,流的本質是數據傳輸IO流就是用來處理設備間數據傳輸問題的。
3.常見的應用:文件上傳、下載、復制等。
文件通常是由一連串的字節或字符構成,組成文件的字節序列稱為字節流,組成文件的字符序列稱為字符流。Java中根據流的方向可以分為輸入流和輸出流。輸入流是將文件或其它輸入設備的數據加載到內存的過程;輸出流恰恰相反,是將內存中的數據保存到文件或其他輸出設備,詳見下圖:
?二、IO流分類
2.1? 根據數據流向分類: ?
輸入流:讀數據 ?將硬盤中的數據讀取到內存中 ?
輸出流:寫數據 ?將程序中的數據寫入到硬盤中
2.2? 按照數據類型來分:
字節流: 字節輸入流/字節輸出流 ?
字符流: 字符輸入流/字符輸出流
2.3? IO流應用場景: ?
純文本文件,優先使用字符流 ?
圖片、視頻、音頻等二進制文件,優先使用字節流 ?
不確定文件類型,優先使用字節流,字節流是萬能的流
2.4??InputStream(字節輸入流)、OutputStream(字節輸出流)、Reader(字符輸入流)、Writer(字符輸出流)
2.4.1??InputStream(字節輸入流)
InputStream是字節輸入流,InputStream是一個抽象類,所有繼承了InputStream的類都是字節輸入流,主要了解以下子類即可:
主要方法介紹:?
void | close() |
abstract int | read() |
int | read(byte[] b) |
int | read(byte[] b, int off, int len) |
2.4.2??OutputStream(字節輸出流)
主要方法介紹:?
void | close() |
void | flush() |
void | write(byte[] b) |
void | write(byte[] b, int off, int len) |
abstract void | write(int b) |
2.4.3??Reader(字符輸入流)
所有繼承了Reader都是字符輸如流
主要方法介紹:
abstract void | close() |
int | read() |
int | read(char[] cbuf) |
abstract int | read(char[] cbuf, int off, int len) |
?2.4.4??Writer(字符輸出流)
所有繼承了Writer都是字符輸出流
主要方法介紹:
Writer | append(char c) |
abstract void | close() |
abstract void | flush() |
void | write(char[] cbuf) |
abstract void | write(char[] cbuf, int off, int len) |
void | write(int c) |
void | write(String str) |
void | write(String str, int off, int len) |
?三、文件流
3.1??FileInputStream(文件字節輸入流)
FileInputStream:從文件系統中的文件獲取輸入字節;
FileInputStream(String name):通過打開與實際文件的連接來創建一個FileInputStream,該文件有文件系統中的路徑名name命名;
步驟:
1.創建字節輸入流對象
2.調用字節輸入流對象的讀數據方法
3.釋放資源
字節流讀取數據:
方法名稱 | 說明 |
int?read() | 從該輸入流讀取一個字節數據,返回值為-1時說明文件讀取完畢(多次調用會按順序依次讀取) |
InputStream in = new FileInputStream("d:/a.txt");int c = 0;
while((c = in.read()) != -1){System.out.println(c);
}in.close();
上述代碼在執行時:如果在執行in.read()
時沒有讀取到末尾,即文件還有可讀取的數據,in.read()
方法會返回下一個可用字節的整數值(0-255之間)。如果已經讀取到了文件末尾,in.read()
方法會返回-1。
3.2??FileOutputStream(文件字節輸出流)
字節流寫入數據常用的三種方式:?
方法名稱 | 說明 |
void?write(int?b) | 將指定的字節寫入此文件輸出流?一次寫一個字節數據 |
void?write(byte[]?b) | 將?b.length字節從指定的字節數組寫入此文件輸出流?一次寫一個字節數組數據 |
void?write(byte[]?b,?int?off,?int?len) | 將?len字節從指定的字節數組開始,從偏移量off開始寫入此文件輸出流?一次寫一個字節數組的部分數據 |
void write(byte[] b, int off, int len)
是Java中OutputStream
類的一個方法,用于將指定字節數組中的一部分數據寫入輸出流。
參數解釋:
b
:要寫入的字節數組。off
:寫入的起始偏移量,即從數組的第off
個位置開始寫入數據。len
:要寫入的字節數,即寫入b
數組中從off
位置開始的連續len
個字節。
如何追加寫入數據:
字節流寫入數據通過 new FileOutputStream(new File("mayikt.txt"), true); 表示追加寫入數據。 如果第二個參數為true,則字節流寫入文件的末尾。此方法通過在構造FileOutputStream
對象時將第二個參數設置為true
來實現追加寫入。
InputStream in = new FileInputStream("d:/a.txt");
OutputStream out = new FileOutputStream("d:/aa.txt");int c = 0;
while((c = in.read()) != -1){out.write(c);
}in.close();
out.close();