天天看點

javaSE24-- IO流--字元FileReader/FileWriter

目錄

  • ​​字元FileReader/FileWriter​​
  • ​​FileReader​​
  • ​​建立流通道new FileReader​​
  • ​​讀取文本檔案内容,一次讀取一個字元數組, 異常處理, 自動關閉​​
  • ​​FileWriter​​
  • ​​InputStreamReader/OutputStreamWriter轉換流讀寫​​

字元FileReader/FileWriter

以字元為機關讀寫檔案内容, 隻能讀寫純文字檔案, 要求文本檔案的編碼格式要與目前環境的編碼格式相容

FileReader

建立流通道new FileReader

FileReader fr  = new FileReader("d:/abc.txt");
//abc.txt雖然是GBK編碼, 目前環境是UTF8編碼, abc.txt檔案中都是英文字元, 英文字元不管是GBK還是UTF8編碼都是一個位元組
//如果檔案是GBK格式, 檔案中有中文, 讀取時會出現亂碼    
//一般使用FileReader讀取與目前環境編碼一緻的檔案      
private static void m1() throws IOException {
    FileReader fr  = new FileReader("d:/Test08.java");
        //read()一次讀取一個字元, 傳回字元的碼值,讀到檔案末尾傳回-1
        int cc = fr.read();
        while( cc != -1 ){
        //把讀到的字元列印到螢幕上
        System.out.print(  (char)cc );
        cc = fr.read();
    }

    fr.close();
}      

讀取文本檔案内容,一次讀取一個字元數組, 異常處理, 自動關閉

private static void m2() {
    try (
        FileReader fr = new FileReader("d:/test08.java");
        ){
      char [] contents = new char[1024];
      int len = fr.read(contents);
      while( len != -1 ){
        //把讀到的len個字元進行處理,  轉換為字元串列印
        System.out.print( new  String(contents , 0 , len) );
        len = fr.read(contents);
      }      
    } catch (Exception e) {
      e.printStackTrace();
    }
  }      

FileWriter

//檔案不存在就建立, 檔案已存在,以追加的方式打開

fw = new FileWriter(“d:/xyz.txt”, true);

public static void main(String[] args) {

        //字元流 每次直接讀取一個字元,底層有一個轉換流
        //字元流隻能讀純文字檔案
        FileReader reader = null;
        FileWriter writer = null;
        try {
            reader = new FileReader("E:\\nihao.txt");
            writer = new FileWriter("E:\\b.txt", true);
//        System.out.println((char) reader.read());
//        System.out.println(reader.read());
//        System.out.println(reader.read());
//        System.out.println(reader.read());
            int c = reader.read();
            System.out.println((char) c);
            while (true) {
                if (c == -1) break;
                System.out.print((char) c);
                writer.write(c);
                c = reader.read();

            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            writer.close();//必須關閉對應的流才能顯示
        } catch (IOException e) {
            e.printStackTrace();
        }

//
//        //字元流 每次直接讀取一個字元,底層有一個轉換流
//        //字元流隻能讀純文字檔案
//        FileReader reader = new FileReader("E:\\nihao.txt");
//        FileWriter writer = new FileWriter("E:\\b.txt");
        System.out.println((char) reader.read());
        System.out.println(reader.read());
        System.out.println(reader.read());
        System.out.println(reader.read());
//       int  c=reader.read();
//        System.out.println((char)c);
//        while (true){
//            if (c==-1) break;
//            System.out.print((char)c);
//            writer.write(c);
//            c=reader.read();
//
//        }
//        reader.close();
//        writer.close();//必須關閉對應的流才能顯示
//
//

    }
}      

文本檔案的複制

一次複制一個字元, 異常處理, 自動關閉流

一次複制一個字元數組, 異常處理, 手動關閉流

InputStreamReader/OutputStreamWriter轉換流讀寫

FileReader/FileWriter隻能讀寫與目前環境編碼相容的文本檔案

如果文本檔案與目前環境編碼不相容, 使用InputStreamReader/OutputStreamWriter轉換流讀寫

轉換流采用了擴充卡設計模式

OutputStream out = new FileOutputStream("d:/def.txt", true );
    OutputStreamWriter osw = new OutputStreamWriter(out, "GBK");

//在目前程式與指定的檔案之間建立位元組流通道
  InputStream in = new FileInputStream("d:/def.txt");
  //使用GBK編碼,把in位元組流中的資料轉換為字元流
  InputStreamReader isr = new InputStreamReader(in, "GBK");      
//當操作的檔案編碼與目前環境編碼不相容, 使用OutputStreamWriter把字元以指定的編碼轉換為位元組
  private static void m2() throws IOException {
    //把字元儲存到d:/def.txt檔案, 該檔案是GBK編碼, 目前環境是UTF8編碼, 把字元轉換為GBK格式再儲存
    OutputStream out = new FileOutputStream("d:/def.txt", true );
    OutputStreamWriter osw = new OutputStreamWriter(out, "GBK");
    
    osw.write("\r\n");
    osw.write("目前的内容是使用轉換流儲存到檔案中的, 工作區編碼是UTF8, 該檔案使用GBK編碼 ");
    
    osw.close();
  }      
private static void m1() throws IOException {
    //讀取d:/def.txt檔案, 該檔案使用GBK編碼,目前環境使用UTF8編碼
    //在目前程式與指定的檔案之間建立位元組流通道
    InputStream in = new FileInputStream("d:/def.txt");
    //使用GBK編碼,把in位元組流中的資料轉換為字元流
    InputStreamReader isr = new InputStreamReader(in, "GBK");
    
    int cc = isr.read();
    while( cc != -1){
      System.out.print((char)cc);
      cc = isr.read();
    }
    
    isr.close();
  }