1.編碼引出的問題
在IDEA中,使用
FileReader
讀取項目中的文本檔案。由于IDEA的設定,都是預設的
UTF-8
編碼,是以沒有任何問題。但是,當讀取Windows系統中建立的文本檔案時,由于Windows系統的預設是GBK編碼,就會出現亂碼。
public class ReaderDemo {
public static void main(String[] args) throws IOException {
FileReader fileReader = new FileReader("E:\\File_GBK.txt");
int read;
while ((read = fileReader.read()) != -1) {
System.out.print((char)read);
}
fileReader.close();
}
}
輸出結果:
���
那麼如何讀取GBK編碼的檔案呢?
2.InputStreamReader類
轉換流
java.io.InputStreamReader
,是Reader的子類,是從位元組流到字元流的橋梁。它讀取位元組,并使用指定的字元集将其解碼為字元。它的字元集可以由名稱指定,也可以接受平台的預設字元集。
構造方法
-
: 建立一個使用預設字元集的字元流。InputStreamReader(InputStream in)
-
: 建立一個指定字元集的字元流。InputStreamReader(InputStream in, String charsetName)
構造舉例,代碼如下:
InputStreamReader isr = new InputStreamReader(new FileInputStream("in.txt"));
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");
指定編碼讀取
public class ReaderDemo2 {
public static void main(String[] args) throws IOException {
// 定義檔案路徑,檔案為gbk編碼
String FileName = "E:\\file_gbk.txt";
// 建立流對象,預設UTF8編碼
InputStreamReader isr = new InputStreamReader(new FileInputStream(FileName));
// 建立流對象,指定GBK編碼
InputStreamReader isr2 = new InputStreamReader(new FileInputStream(FileName) , "GBK");
// 定義變量,儲存字元
int read;
// 使用預設編碼字元流讀取,亂碼
while ((read = isr.read()) != -1) {
System.out.print((char)read); // ��Һ�
}
isr.close();
// 使用指定編碼字元流讀取,正常解析
while ((read = isr2.read()) != -1) {
System.out.print((char)read);// 大家好
}
isr2.close();
}
}
3. OutputStreamWriter類
轉換流
java.io.OutputStreamWriter
,是Writer的子類,是從字元流到位元組流的橋梁。使用指定的字元集将字元編碼為位元組。它的字元集可以由名稱指定,也可以接受平台的預設字元集。
構造方法
-
: 建立一個使用預設字元集的字元流。OutputStreamWriter(OutputStream in)
-
: 建立一個指定字元集的字元流。OutputStreamWriter(OutputStream in, String charsetName)
構造舉例,代碼如下:
OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt"));
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");
指定編碼寫出
public class OutputDemo {
public static void main(String[] args) throws IOException {
// 定義檔案路徑
String FileName = "E:\\out.txt";
// 建立流對象,預設UTF8編碼
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(FileName));
// 寫出資料
osw.write("你好"); // 儲存為6個位元組
osw.close();
// 定義檔案路徑
String FileName2 = "E:\\out2.txt";
// 建立流對象,指定GBK編碼
OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream(FileName2),"GBK");
// 寫出資料
osw2.write("你好");// 儲存為4個位元組
osw2.close();
}
}
轉換流了解圖解
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiI0gTMx81dsQWZ4lmZf1GLlpXazVmcvwFciV2dsQXYtJ3bm9CX9s2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xCMy81dvRWYoNHLwEzX5xCMx8FesU2cfdGLwMzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsYTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5SO1kjMxgzNmhzN0MzMwQmYyYzXyEDO1kDMwMzLcZDMyIDMy8CXn9Gbi9CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
4. 轉換檔案編碼
将GBK編碼的文本檔案,轉換為UTF-8編碼的文本檔案。
- 指定GBK編碼的轉換流,讀取文本檔案。
- 使用UTF-8編碼的轉換流,寫出文本檔案。
public class TransDemo {
public static void main(String[] args) {
// 1.定義檔案路徑
String srcFile = "file_gbk.txt";
String destFile = "file_utf8.txt";
// 2.建立流對象
// 2.1 轉換輸入流,指定GBK編碼
InputStreamReader isr = new InputStreamReader(new FileInputStream(srcFile) , "GBK");
// 2.2 轉換輸出流,預設utf8編碼
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(destFile));
// 3.讀寫資料
// 3.1 定義數組
char[] cbuf = new char[1024];
// 3.2 定義長度
int len;
// 3.3 循環讀取
while ((len = isr.read(cbuf))!=-1) {
// 循環寫出
osw.write(cbuf,0,len);
}
// 4.釋放資源
osw.close();
isr.close();
}
}