java 轉換流InputStreamReader和OutputStreamWriter
阿新 • • 發佈:2018-11-27
轉換流InputStreamReader和OutputStreamWriter,看結尾的字母,知道它們是屬於字元流的
先說不管字元還是位元組,儲存在電腦上或者傳輸在網路中的只能是位元組,為什麼要有字元呢,我理解的是每個國家語言都不同,那麼所用的字元也是不同的,每種字元都可以通過某種規則,即編碼和解碼都遵循同樣的規則才能將文字資訊正常顯示,如果編碼和解碼使用不同的規則,就會出現亂碼的情.,就好像以前的電報,發報的對照著編碼手冊將自己想說的話編碼成訊號發出去,收聽電報的收到訊號後,對照著編碼手冊將訊號轉換成自己能理解的漢字,如果這兩本手冊不一樣,那傳出去和收回來的意思會大不同.計算機也面臨這樣的問題,所以有了編碼方式
ASCII編碼,主要是用來顯示英文,gb2312以前用來顯示漢字,但沒收錄一些繁體字,所以改進成gbk,big5是香港臺灣那邊的編碼方式,我猜的
本節內容:
目錄
轉換流的作用是以字元流的操作方式來操作位元組流物件,以字元流的方式將檔案讀到記憶體,再按字元流的方式從記憶體中寫入打檔案
InputStreamReader
InputStreamReader是將輸入的位元組流變成字元流,其構造方法的部分原始碼:
public class InputStreamReader extends Reader { public InputStreamReader(InputStream in) { //這個構造方法使用預設的編碼形式 super(in); try { sd = StreamDecoder.forInputStreamReader(in, this, (String)null); // ## check lock object } catch (UnsupportedEncodingException e) { // The default encoding should always be available throw new Error(e); } } public InputStreamReader(InputStream in, String charsetName) //使用指定的編碼形式 throws UnsupportedEncodingException { super(in); if (charsetName == null) throw new NullPointerException("charsetName"); sd = StreamDecoder.forInputStreamReader(in, this, charsetName); }
第二個構造方法中需要兩個引數,一個InputStream物件,一個該物件的編碼形式.
然後就可以以字元的輸入流物件操作這個位元組的輸入流物件了.
OutputStreamWriter
Writer的子類,將輸出的字元流變成位元組流,字元流的輸入物件變成位元組流輸入物件
看下構造方法的部分原始碼:
public class OutputStreamWriter extends Writer { private final StreamEncoder se; public OutputStreamWriter(OutputStream out, String charsetName) //位元組輸出流物件和指定的編碼形式 throws UnsupportedEncodingException { super(out); if (charsetName == null) throw new NullPointerException("charsetName"); se = StreamEncoder.forOutputStreamWriter(out, this, charsetName); } public OutputStreamWriter(OutputStream out) { //位元組輸出流物件,使用預設的編碼形式 super(out); try { se = StreamEncoder.forOutputStreamWriter(out, this, (String)null); } catch (UnsupportedEncodingException e) { throw new Error(e); } } ... }
第一個構造方法需要使用OutputStream物件和該物件的編碼形式,然後就可以以輸出字元流的形式操作這個輸出位元組流了
示例:
將utf-8編碼的文字檔案1.txt的內容,通過轉換流寫入到gbk編碼的2.txt中
原始檔utf-8編碼的1.txt內容:
你好,我們要加油!
//////////////////////////////////////////////////////////////////////
public class Test01 {
public static void main(String[] args){
try (
InputStreamReader isr=new InputStreamReader(new FileInputStream("1.txt"),"utf-8") ;
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("2.txt"),"gbk");
){
int temp;
char [] charArr=new char[3];
while((temp=isr.read(charArr))!=-1){
osw.write(charArr,0,temp);
}
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
out:
目標檔案gbk編碼的2.txt的檔案內容為:
你好,我們要加油!