75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)
轉(zhuǎn)換流:
InputStreamReader?? 輸入字節(jié)流轉(zhuǎn)換成輸入字符流
OutputStreamWriter? 輸出字節(jié)流轉(zhuǎn)換成輸出字符流
總結(jié):就是字節(jié)流轉(zhuǎn)換成字符流,但是不能字節(jié)流轉(zhuǎn)換成字節(jié)流(聯(lián)想記憶----只有屌絲想變成高富帥,沒有高富帥想變成屌絲)
應用場景:
?? ?在以后開發(fā)中中我們免不了使用別人的工具,如果別人就是返回一個字節(jié)流,但是你想用字符流,這個時候我們就可以使用轉(zhuǎn)換流來把字節(jié)流轉(zhuǎn)換成字符流
下面是一些實例演示:
把字節(jié)流轉(zhuǎn)換成字符流,并實現(xiàn)讀寫
?
public class Demo3 {public static void main(String[] args) throws IOException {writeText();readText();}public static void readText() throws IOException {File file = new File("D:\\新建文件夾\\a.txt");FileInputStream fileInputStream = new FileInputStream(file);//輸入字節(jié)流轉(zhuǎn)換成輸入字符流InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);char[] cs = new char[1024];int length = 0;while((length = inputStreamReader.read(cs))!=-1) {System.out.println(new String(cs,0,length));}inputStreamReader.close();}public static void writeText() throws IOException {File file = new File("D:\\新建文件夾\\a.txt");FileOutputStream fileOutputStream = new FileOutputStream(file);OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);outputStreamWriter.write("你好,陌生人");outputStreamWriter.close();} }?
?
?
?
把字節(jié)流轉(zhuǎn)換成字符流后用字符流的緩存類實現(xiàn)讀寫
?
public class Demo4 {public static void main(String[] args) throws IOException {readText();writeText();}public static void readText() throws IOException {File file = new File("D:\\新建文件夾\\a.txt");FileOutputStream fileInputStream = new FileOutputStream(file);//輸出字節(jié)流轉(zhuǎn)換成輸入字符流OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileInputStream);//使用輸出字符流的緩存類BufferedWriter bufferedReader = new BufferedWriter(outputStreamWriter);//一行一行存bufferedReader.write("這是第一行數(shù)據(jù)");bufferedReader.newLine();bufferedReader.write("這是第二行數(shù)據(jù)");bufferedReader.close();}public static void writeText() throws IOException {File file = new File("D:\\新建文件夾\\a.txt");FileInputStream fileInputStream = new FileInputStream(file);//輸入字節(jié)流轉(zhuǎn)換成輸入字符流InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream);//使用輸入字符流的緩存類BufferedReader bufferedReader = new BufferedReader(inputStreamReader);String line = null;//一行一行讀取文本while((line = bufferedReader.readLine())!=null) {System.out.println(line);}bufferedReader.close();} }?
?
?
?
把字節(jié)流轉(zhuǎn)換成字符流并指定碼表進行讀寫數(shù)據(jù)
注意:記事本值存儲和我們從記事本獲取數(shù)據(jù)的都是碼值,并不是我們輸入時的字符,只不過我們在打開記事本的時候記事本自動給我們解碼了,也就是我們看的懂得字符,上面我們沒有指定碼表,實際上是讀寫時使用的是默認的編碼表gbk(java中默認碼表)
?
public class Demo5 {public static void main(String[] args) throws IOException {writeText();readText();}public static void writeText() throws IOException {File file = new File("D:\\新建文件夾\\a.txt");FileOutputStream fileOutputStream = new FileOutputStream(file);OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream, "iso8859-1");outputStreamWriter.write("你好!!!");outputStreamWriter.close();}public static void readText() throws IOException {File file = new File("D:\\新建文件夾\\a.txt");FileInputStream fileInputStream = new FileInputStream(file);InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"iso8859-1");char[] cs = new char[1024];int length = 0;while((length = inputStreamReader.read(cs))!=-1) {System.out.println(new String(cs,0,length));}inputStreamReader.close();} }?
?
?
在這個之前我實驗四種碼表(iso8859-1 gbk utf-8 utf-16),發(fā)現(xiàn)除了用iso8859-1碼表寫入記事本,其他的碼表編碼,記事本都可以解碼成功(我們看的懂得文字),至于為什么我不知道可能跟我們系統(tǒng)有關(guān)(猜測),我們再來分析為什么會輸出這么個鬼東西出來
首先我在存入“你好!!!”的時候,我是使用的iso8859-1碼表編碼的,注意這里我們編譯的是中國文字,在iso8859-1碼表中是中國文字是沒有對應的碼值的,所以會出現(xiàn)亂碼,并且每一個字符都是一樣的(全是?),也就是對于不能識別的字符都是給的63這個碼值(下面例子可以知道),所以導致最后我們根據(jù)這個碼值進行解碼的時候控制臺全輸出的是?
在上一片中最后一個例子中,跟這個是不同的,那個例子中首先是使用gbk先進行編碼成對應的碼值,而這個碼值在iso8859-1碼表中都有對應的字符(iso8859-1碼表的特性),最后我們才可以獲取最早用gbk編碼的后的碼值后找到原來的字符,而這個是一開始就是用iso8859-1碼表進行的編碼,并且iso8859-1碼表對于不能識別的字符都是給的63這個碼值,這個是解碼不出最初的字符的(如果有大神知道可以私信我,謝謝)
?
public static void readText() throws IOException {File file = new File("D:\\新建文件夾\\a.txt");FileInputStream fileInputStream = new FileInputStream(file);InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream,"iso8859-1");char[] cs = new char[1024];int length = 0;while((length = inputStreamReader.read(cs))!=-1) {String str = new String(cs,0,length);byte[] buf = str.getBytes("iso8859-1");System.out.println(Arrays.toString(buf));}inputStreamReader.close();}?
?
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/zjdbk/p/9102387.html
總結(jié)
以上是生活随笔為你收集整理的75. InputStreamReader和OutputStreamWriter(转换流--字节流转换成字符流)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unix时间戳计算
- 下一篇: 修改unity变量名但不丢失序列化值