JavaI/O流你需要熟練掌握的字符轉換流(功能、代碼實現、圖文)

說明:
在JDK中,提供了兩個類用於實現將字節流轉換爲字符流,它們分別是InputStreamReader和OutputStreamWriter。

InputStreamReader是Reader的子類,它可以將一個字節輸入流轉換成字符輸入流,方便直接讀取字符。
OutputStreamWriter是Writer的子類,它可以將一個字節輸出流轉換成字符輸出流,方便直接寫入字符。
轉換流操作文件示意圖:
在這裏插入圖片描述
示例(使用轉換流拷貝文件):

    FileInputStream in = new FileInputStream("reader.txt");
    InputStreamReader isr = new InputStreamReader(in);
    BufferedReader br = new BufferedReader(isr); 
    FileOutputStream out = new FileOutputStream("writer.txt");
    OutputStreamWriter osw = new OutputStreamWriter(out);
    BufferedWriter bw = new BufferedWriter(osw); 
    String line = null;
    while ((line = br.readLine()) != null) {
          bw.write(line); 
          bw.newLine();
    }
    br.close();
    bw.close();
這代碼不是很平凡?爲什麼還要學字符轉換流?
因爲在學習I/O流的過程中很容易出現文本亂碼現象
這個時候就需要使用轉換流進行修改,使其編碼一致。
package liu;
import java.io.*;
//轉換流只適合文本文件
public class ZhuanHuanLiu {
  public static void main(String[] args) throws IOException {
   //轉換流可以在寫的時候就設置相同的編碼,防止拷貝時出現亂碼
   FileOutputStream fos = new FileOutputStream("c:\\javas\\b.txt");
   OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
   osw.write("但是我還是一個孩子");
   osw.flush();
   osw.close();
   FileInputStream fis = new FileInputStream("c:\\javas\\b.txt");
   InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
   int len= 0 ;
   char [] c = new char[1024];
   while((len = isr.read())!=-1) {
    System.out.print((char)len+" ");
   }
  }
}

在這裏插入圖片描述
上面的代碼是通過參數都使用UTF-8格式,確保輸入輸出的格式相同,所以不會出現亂碼的現象

package liu;
import java.io.*;
public class ZhuanHuanLiu2 {
  public static void main(String[] args) throws IOException {
   //轉換流可以在寫的時候就設置相同的編碼,防止拷貝時出現亂碼
   FileOutputStream fos = new FileOutputStream("c:\\javas\\b.txt");
   OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
   //BufferedWriter bw = new BufferedWriter(osw);
   String str = "但是我還是一個孩子" ;
   osw.write(str.toCharArray());
   osw.flush();
   osw.close();
   FileInputStream fis = new FileInputStream("c:\\javas\\b.txt");
   InputStreamReader isr = new InputStreamReader(fis,"gbk");
   int len= 0 ;
   char [] c = new char[1024];
   while((len = isr.read(c))!=-1) {
    System.out.print(new String(c,0,len));
   }
   isr.close();
  }
}

在這裏插入圖片描述
上面的代碼先寫,再讀,使用的都是gbk格式,保證編碼格式的一致性

package liu;
import java.io.*;
public class ZhuanHuanLiu3 {
  public static void main(String[] args) throws IOException {
   //轉換流可以在寫的時候就設置相同的編碼,防止拷貝時出現亂碼
   FileOutputStream fos = new FileOutputStream("c:\\javas\\b.txt");
   OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
   BufferedWriter bw = new BufferedWriter(osw);
   String str = "但是我還是一個孩子" ;
   bw.write(str);
   bw.flush();
   bw.close();
   FileInputStream fis = new FileInputStream("c:\\javas\\b.txt");
   InputStreamReader isr = new InputStreamReader(fis,"gbk");
   BufferedReader br = new BufferedReader(isr);
   String len= null ;
   while( (len = br.readLine()) !=null) {
    System.out.println(len);
   }
   br.close();
  }
}

在這裏插入圖片描述
上面的代碼使用了緩衝流的原理,更加方便(可以使用readline()方法)

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