一、首先了解IO流的4個頂級的父類
學到了最頂層的父類它的子類的方法通用。非常的方便。
1. 表格總結.
輸入流 | 輸出流 | |
---|---|---|
字節流 | InputStream | OutputStream |
字符流 | Reader | Writer |
二、先學習OutputStream類 寫流(數據:內存–>硬盤)
寫入數據的原理:Java程序IO流 – JVM – OS(Operate System) – OS調方法–寫入成功.
拓展:字符,字節,01進制的關係?(一切文件皆爲字節)
- 字節是一個單位: 1 字節 Byte = 8個01進制
- 字符是字母或者符號: 比如: a,b c …1、2、3、A、B、C、~!·#¥%
1.學習一個類,先學習它的構造方法。看文檔。
1.總結構造方法
- 帶boolean , 爲true 就是寫入文件的開頭,false反之
- 參數是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