說明:
在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()方法)