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 Demo02OutputStreamWriter { public static void main(String[] args) throws IOException { //write_utf_8(); write_gbk(); } /* 使用轉換流OutputStreamWriter寫GBK格式的檔案 */ private static void write_gbk() throws IOException { //1.建立OutputStreamWriter物件,構造方法中傳遞位元組輸出流和指定的編碼表名稱 OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("gbk.txt"),"GBK"); //2.使用OutputStreamWriter物件中的方法write,把字元轉換為位元組儲存緩衝區中(編碼) osw.write("你好"); //3.使用OutputStreamWriter物件中的方法flush,把記憶體緩衝區中的位元組重新整理到檔案中(使用位元組流寫位元組的過程) osw.flush(); //4.釋放資源 osw.close(); } /* 使用轉換流OutputStreamWriter寫UTF-8格式的檔案 */ private static void write_utf_8() throws IOException { //1.建立OutputStreamWriter物件,構造方法中傳遞位元組輸出流和指定的編碼表名稱 //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("10_IO\\utf_8.txt"),"utf-8"); OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("utf_8.txt"));//不指定預設使用UTF-8 //2.使用OutputStreamWriter物件中的方法write,把字元轉換為位元組儲存緩衝區中(編碼) osw.write("你好"); //3.使用OutputStreamWriter物件中的方法flush,把記憶體緩衝區中的位元組重新整理到檔案中(使用位元組流寫位元組的過程) osw.flush(); //4.釋放資源 osw.close(); } }
java.io.InputStreamReader extends Reader
InputStreamReader:是位元組流通向字元流的橋樑:它使用指定的 charset 讀取位元組並將其解碼為字元。(解碼:把看不懂的變成能看懂的)
繼承自父類的共性成員方法:
int read() 讀取單個字元並返回
int read(char[] cbuf)一次讀取多個字元,將字元讀入陣列
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 Demo03InputStreamReader { public static void main(String[] args) throws IOException { //read_utf_8(); read_gbk(); } /* 使用InputStreamReader讀取GBK格式的檔案 */ private static void read_gbk() throws IOException { //1.建立InputStreamReader物件,構造方法中傳遞位元組輸入流和指定的編碼表名稱 //InputStreamReader isr = new InputStreamReader(new FileInputStream("10_IO\\gbk.txt"),"UTF-8");//??? InputStreamReader isr = new InputStreamReader(new FileInputStream("gbk.txt"),"GBK");//你好 //2.使用InputStreamReader物件中的方法read讀取檔案 int len = 0; while((len = isr.read())!=-1){ System.out.println((char)len); } //3.釋放資源 isr.close(); } /* 使用InputStreamReader讀取UTF-8格式的檔案 */ private static void read_utf_8() throws IOException { //1.建立InputStreamReader物件,構造方法中傳遞位元組輸入流和指定的編碼表名稱 //InputStreamReader isr = new InputStreamReader(new FileInputStream("10_IO\\utf_8.txt"),"UTF-8"); InputStreamReader isr = new InputStreamReader(new FileInputStream("utf_8.txt"));//不指定預設使用UTF-8 //2.使用InputStreamReader物件中的方法read讀取檔案 int len = 0; while((len = isr.read())!=-1){ System.out.println((char)len); } //3.釋放資源 isr.close(); } }