【IO流】:Input Output
連接文件和應用程序的管道
【按照流向來說:參照物是應用程序:】
1. 輸入流: input 從硬盤(存儲設備)到內存
2. 輸出流: output 從內存到硬盤(存儲設備)
【 按照處理的單位:】
字節流:
就是按照文件的二進制編碼,一個字節爲一個操作單位來進行讀寫操作
字符流:
也是按照字節操作的,但是多了一個翻譯的功能
0011 0001 0010 0111
我 們 最 強
字符流 = 字節流 + 解碼
操作的單位是一個字符!
【【字節流:】】
輸入字節流:從硬盤到內存
----| InputStream 這是所有輸入字節流的基類 抽象類
--------| FileInputStream 讀取文件的輸入字節流
讀取文件操作步驟:
1. 找到文件:
File 類對象
String 文件路徑
2. 創建FileInputStream 輸入管道
3. 讀取文件
4. 關閉管道(資源)
【代碼片實例】
//1.找到文件
File file=new File("D:\\bbb\\1.txt");
//2.判斷文件是否存在
if(!file.exists()){
throw new FileNotFoundException("文件是否存在");
}
//3.建立輸入管道
FileInputStream input=new FileInputStream(file);
//4.創建byte緩衝數組
byte[] buffer=new byte[1024];
int count=-1;
//5.利用循環讀取文件
while((count=input.read(buffer))!=-1){
// String(byte[] bytes, int offset, int length)
// 通過使用平臺的默認字符集解碼指定的字節子陣列來構造新的 String 。
System.out.print(new String(buffer,0,count));
}
//6.關閉資源
input.close();
*****************************************************
---- |OutputStream 輸出字節流的基類
----------|FileOutputStream 文件的輸出字節流
寫入文件的流程:
1. 找到要操作的文件
2. 創建輸出通道
3. 寫入數據
4. 關閉資源
FileOutputStream 注意事項;
1. 如果是規規矩矩創建的FileOutputStream的輸出管道,在寫入數據的時候,首先會清空文件(不管原來有沒有數據),在來寫入數據(原來的數據也會回來的)
2. 在寫入文件的時候,如果操作文件不存在,創建文件,寫入
3. FileOutputStream如果在創建的時候,添加的true,表示是追加寫入
4. 用FileOutputStream中的write方法,寫入數據的時候,如果寫入的是一個int類型數據
只寫入該int類型的低8位
0100 0000 0000 0000 0000 0000 0111 1100 =》1073741948
真正寫入數據爲:
0111 1100 該int的低八位
【代碼片實例】
//1.找到文件
File file=new File("D:\\bbb\\1.txt");
//2.建立輸出管道
FileOutputStream output=new FileOutputStream(file,true);
//3.寫入數據(追加)
output.write("\r\n有驚無險到了六點,上午下午不如週五".getBytes());
//4.關閉資源
output.close();
*****************************************************
【【字節流實現文件的拷貝】】
//1.找到源文件
File srcFile=new File("D:\\Study\\ascii.jpg");
//2.目標文件
File destFile=new File("D:\\bbb\\temp.jpg");
//3.建立文件的輸入通道
FileInputStream input=new FileInputStream(srcFile);
//4.建立文件的輸出通道
FileOutputStream output=new FileOutputStream(destFile);
//5.讀取文件,寫入文件,這裏寫入的要求是追加的形式
int count=-1;
byte[] buffer=new byte[1024];
while((count=input.read(buffer))!=-1){
output.write(buffer);
}
//6.關閉資源,先開後關,後開先關
output.close();
input.close();
****************************************************************
【【字符流:】】
----| Reader 輸入字節流的基類,抽象類
---------| FileReader 讀取文件的輸入字符流
FileReader 使用方式:
1. 找到文件
2. 建立reader讀取通道
3. 讀取數據
4. 關閉資源
【代碼片的實例】
//1.找到文件
File file=new File("D:\\bbb\\1.txt");
if(!file.exists()){
throw new FileNotFoundException();
}
//2.建立Reader
FileReader reader=new FileReader(file);
//準備一個char類型的數組緩衝區
char[] buffer=new char[1024];
int count=0;
//3.讀取文件
while((count=reader.read(buffer))!=-1){
//將字符數組轉化爲String類型的
System.out.println(new String(buffer,0,count));
}
//4.關閉資源
reader.close();
*******************************************************
輸出字符流:
----| Writer 輸出字符流的基類,抽象類
--------| FileWriter 向文件寫入數據的字符流
FileWriter的使用流程:
1. 找到目標文件
2. 建立數據輸出通道
3. 寫入數據
4. 關閉資源
FileWriter的注意事項:
1. 使用FileWriter寫入數據的生活,FileWriter內部是默認維護了一個1024個字符的數組,
如果要求寫入的數據,會首先保存到這個數中,如果需要真正的寫入到硬盤中, 可以使用三種方式,
第一種,調用flush方法
第二種,關閉資源
第三種,填滿當前的1024字節的數組
2. 使用FileWriter的時候,如果目標文件不存在,會自動創建
3. 使用FileWriter寫入數據的時候,如果文件存在,會首先清空文件,再來做寫入操作,如果想要追加寫
可以調用FileWriter(File file, boolean append); append傳值爲true標書追加寫
************************************************************
------| InputStream 輸入字節流基類
-----------| FileInputStream 文件操作的輸入字節流
-----------| BufferedInputStream 緩衝輸入字節流,在緩衝字節流對象中,底層維護了
一個大小爲8KB的緩衝字節數組
BufferedInputStream裏面構造函數需要一個InputStream的子類類對象,這個類對象是用來提供
讀寫能力
【注意】所有的緩衝流都是沒有讀寫能力!!!
使用流程:
1. 找到目標文件
2. 建立管道
---- 首先創建當前文件的InputStream的子類類對象
---- 使用InputStream的子類類對象,創建緩衝字節輸入流對象
3. 讀取數據
4. 關閉緩衝字節流
5. 關閉資源InputStream
使用緩衝字節流,比自定義的緩衝數據要快一點點 8KB
原因 內存的讀取效率遠高於硬盤
*********************************************************************************
BufferedReader 底層維護的是一個元素個數爲8192(即8k)的字符數組 -----緩衝流都是沒有讀寫能力,
File file=new File("D:\\bbb\\1.txt");
if(!file.exists()){
throw new FileNotFoundException();
}
FileReader reader=new FileReader(file);
BufferedReader br=new BufferedReader(reader);
int count=-1;
char[] buffer=new char[1024];
while((count=br.read(buffer))!=-1){
System.out.println(new String(buffer,0,count));
}
br.close();
*********************************************************************************************
File file = new File("D:\\bbb\\1.txt");
FileWriter writer = new FileWriter(file);
BufferedWriter br = new BufferedWriter(writer);
br.write("fsgsegwregsdgsdgs");
// 數據不會立即寫入,是保存在BufferedWriter的緩衝字符數組中,除非資源關閉,數組填滿或者調用了
// flush 纔會真正的把數據寫入到硬盤當中,這樣的方式,是爲了保護硬盤,提高效率
br.close();