IO流文件的讀取與寫入



【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();




  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章