編碼引出的問題
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
/*
FileReader可以讀取IDE預設編碼格式(UTF-8)的檔案
FileReader讀取系統預設編碼(中文GBK)會產生亂碼���
*/
public class new01 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new FileReader("D:\\environment\\java_project\\javase\\我是GBK格式檔案.txt"));
int len=0;
while ((len=br.read())!=-1){
System.out.println((char) len);
}
br.close();
}
}
轉換流
轉換流原理
OutputStreamWriter
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
/*
java.io.OutputStreamWriter extends Writer
OutputStreamWriter:是字元流通向位元組流的橋樑:可使用指定的charset將要寫入流中的字元編碼成位元組。(編碼:把能看懂的程式設計看不懂的)
繼承自父類的共性成員方法:
- void write(int c) 寫入單個字元
- void write(char[] cbuf) 寫入字元陣列
- abstract void write(char[] cbuf, int off, int len) 寫入字元陣列的某一部分,off陣列的開始索引,len寫的字元個數
- void write(String str) 寫入字串
- void write(String str, int off, int len) 寫入字串的某一部分,off字串的開始索引,len寫的字元個數
- void flush() 重新整理該流的緩衝
- void close() 關閉此流,但要先重新整理它
構造方法:
OutputStreamWriter(OutputStream out) 建立使用預設字元編碼的 OutputStreamWriter
OutputStreamWriter(OutputStream out, String charsetName) 建立使用指定字符集的 OutputStreamWriter
引數:
OutputStream out:位元組輸出流,可以用來寫轉換之後的位元組到檔案中
String charsetName:指定的編碼表名稱,不區分大小寫,可以是utf-8/UTF-8,gbk/GBK,...不指定預設使用UTF-8
使用步驟:
1.建立OutputStreamWriter物件,構造方法中傳遞位元組輸出流和指定的編碼表名稱
2.使用OutputStreamWriter物件中的方法write,把字元轉換為位元組儲存緩衝區中(編碼)
3.使用OutputStreamWriter物件中的方法flush,把記憶體緩衝區中的位元組重新整理到檔案中(使用位元組流寫位元組的過程)
4.釋放資源
*/
public class Demo01OutputStreamWriter {
public static void main(String[] args) throws IOException {
write_utf_8();
}
/*
使用轉換流OutputStreamWriter寫UTF-8格式的檔案
*/
private static void write_utf_8() throws IOException {
//1.建立OutputStreamWriter物件,構造方法中傳遞位元組輸出流和指定的編碼表名稱
//OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "utf-8");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "GBK");
//2.使用OutputStreamWriter物件中的方法write,把字元轉換為位元組儲存緩衝區中(編碼)
osw.write("你好");
//3.使用OutputStreamWriter物件中的方法flush,把記憶體緩衝區中的位元組重新整理到檔案中(使用位元組流寫位元組的過程)
osw.flush();
//4.釋放資源
osw.close();
}
}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
/*
java.io.InputStreamReader extends Reader
InputStreamReader:是位元組流通向字元流的橋樑:它使用指定的charset讀取位元組並將其解碼為字元。(解碼:把看不懂的變成能看懂的)
繼承自父類的共性成員方法:
int read()讀取單個字元並放回
int read(char[] cubf)一次讀取多個字元,將字元讀入陣列
void close()關閉該流並釋放與之關聯的所有資源
構造方法:
InputStreamReader(InputStream in) 建立一個使用預設字符集的InputStreamReader
InputStreamReader(InputStream in, String charsetName) 建立使用指定字符集的InputStreamReader
引數:
InputStream in:位元組輸入流,用來讀取檔案中儲存的位元組
String charsetName:指定的編碼表名稱,不區分大小寫,可以是utf-8/UTF-8,gbk/GBK,...不指定預設使用UTF-8
使用步驟:
1.建立InputStreamReader物件,構造方法中傳遞位元組輸入流和指定的編碼表名稱
2.使用InputStreamReader物件中的方法read讀取檔案
3.釋放資源
注意事項:
構造方法中指定的編碼表名稱要和檔案的編碼相同,否則會發生亂碼
*/
public class Demo02InputStreamReader {
public static void main(String[] args) throws IOException {
read_utf_8();
}
/*
使用InputStreamReader讀取UTF-8格式的檔案
*/
private static void read_utf_8() throws IOException {
//1.建立InputStreamReader物件,構造方法中傳遞位元組輸入流和指定的編碼表名稱
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "UTF-8");
//2.使用InputStreamReader物件中的方法read讀取檔案
int len = 0;
while ((len = isr.read())!=-1){
System.out.println((char)len);
}
//3.釋放資源
isr.close();
}
}
轉換檔案編碼
/*
練習:轉換檔案編碼
將GBK編碼的文字檔案,轉換為UTF-8編碼的文字檔案
分析:
1.建立InputStreamReader物件,構造方法中傳遞位元組輸入流和指定的編碼表名稱GBK
2.建立OutputStreamWriter物件,構造方法中傳遞位元組輸出流和指定的編碼表名稱UTF-8
3.使用InputStreamReader物件中的方法read讀取檔案
4.使用OutputStreamWriter物件中的方法write,把讀取的資料寫入到檔案中
5.釋放資源
*/
import java.io.*;
public class Demo03Test {
public static void main(String[] args) throws IOException {
read_GBK();
}
private static void read_GBK() throws IOException {
//1.建立InputStreamReader物件,構造方法中傳遞位元組輸入流和指定的編碼表名稱GBK
InputStreamReader isr = new InputStreamReader(new FileInputStream("D:\\environment\\java_project\\javase\\utf_8.txt"), "utf-8");
//2.建立OutputStreamWriter物件,構造方法中傳遞位元組輸出流和指定的編碼表名稱UTF-8
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\environment\\java_project\\javase\\GBK.txt"), "GBK");
// 3.使用InputStreamReader物件中的方法read讀取檔案
int len = 0;
while ((len = isr.read())!=-1){
//4.使用OutputStreamWriter物件中的方法write,把讀取的資料寫入到檔案中
osw.write(len);
}
//5.釋放資源
osw.close();
isr.close();
}
}
列印流(write,println,System.setOut)
import java.io.FileNotFoundException;
import java.io.PrintStream;
/*
java.io.PrintStream:列印流
PrintStream 為其他輸出流新增了功能,使它們能夠方便的列印各種資料值表示形式
PrintStream特點:
1.只負責資料的輸出,不負責資料的讀取
2.與其他輸出流不同,PrintStream永遠不會丟擲IOException
3.有特有的方法,print,println
void print(任意型別的值)
void println(任意型別的值並換行)
構造方法:
PrintStream(File file):輸出的目的地是一個檔案
PrintStream(OutputStream out):輸出的目的地是一個位元組輸出流
PrintStream(String fileName):輸出的目的地是一個檔案路徑
PrintStream extends OutputStream
繼承自父類的成員方法:
- public void close():關閉此輸出流並釋放與此流相關聯的任何系統資源
- public void flush():重新整理此輸出流並強制任何緩衝的輸出位元組被寫出
- public void write(byte[] b):將b.length位元組從指定的位元組陣列寫入此輸出流
- public void write(byte[] b, int off, int len):從指定的位元組陣列寫入len位元組,從偏移量off開始輸出到此輸出流
- public abstract void write(int b):將指定的位元組輸出流
注意:
如果使用繼承自父類的write方法寫資料,那麼檢視資料的時候會查詢編碼表 97-->a
如果使用自己特有的方法print/println方法寫資料,寫的資料原樣輸出 97-->97
*/
public class Demo01PrintStream {
public static void main(String[] args) throws FileNotFoundException {
//System.out.println("HelloWorld");
//建立列印流PrintStream物件,構造方法中要繫結要輸出的目的地
PrintStream ps = new PrintStream("D:\\environment\\java_project\\javase\\目的地是列印流.txt");
//如果使用繼承自父類的write方法寫資料,那麼檢視資料的時候會查詢編碼表 97->a
ps.write(97);
//如果使用自己特有的方法print/println方法寫資料,寫的資料原樣輸出 97-->97
ps.println(97);
ps.println(8.8);
ps.println('a');
ps.println("HelloWorld");
ps.println(true);
//釋放資源
ps.close();
}
}
=============================================================================
import java.io.FileNotFoundException;
import java.io.PrintStream;
/*
可以改變輸出語句的目的地(列印流的流向)
輸出語句,預設在控制檯輸出
使用System.setOut方法改變輸出語句的目的地改為引數中傳遞的列印流的目的地
static void setOut(PrintStream out)
重新分配“標準”輸出流
*/
public class Demo02PrintStream {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("我是在控制檯輸出");
PrintStream ps = new PrintStream("D:\\environment\\java_project\\javase\\目的地是列印流.txt");
System.setOut(ps);
System.out.println("我在列印流的目的地中輸出");
ps.close();
}
}