_055_輸入輸出字元流
=======
之前我們學了FileInputStream位元組流,今天是輸入字元流 位元組流只能讀取位元組資料,且因為是需要一個位元組,所以漢字讀取不了,要讀取需要用快取陣列的方式 FileInputStream預設是用GBK碼錶,FileReader也是GBK碼錶,但是它自帶了解碼功能
public abstract class Reader 所有讀字元流的超類,因為是抽象的,所 以要用實現類 -----------------FileReader 用法和之前的FileInputStream一樣,特性也一樣
public abstract class Writer所有寫字元流的超類,因為是抽象的,所以要用實現類
-----------------FileWriter
而FileWriter的用法卻是和BufferedOutputStream一樣,因為FileWriter裡面也維護了
一個緩衝陣列,然後還需要刷出,刷出還是一樣有3個方式,flush,close,還有就是字元陣列滿了也會刷出
特性和要注意的地方和FileOutputStream一樣
注意:
1 用FileInputStream整體來說還是不能讀取正常文字,如果2漢字中間有一個字母,因為讀取的是位元組,所以要讀5個位元組
我們緩衝陣列填的是4或者4的整數倍,也就是偶數,也就是說總會讀出亂碼的
2 位元組流和字元流的應用場景,字元流只有在我們能看懂的資料處可以使用,比如記事本里的正常文字
而位元組流最好是用在我們看不見的資料處,比如圖片裡的資料,我們能看到圖片,但是我們看不懂圖片裡的資料
因為圖片不是文字,有些碼在編碼表裡面是轉不了的,這些轉不了的碼就會變成1個位元組返回,所以我們的檔案比原來的位元組少了
所以複製出來的圖片是損壞的。這種情況下是要使用位元組流的
讀取完整的字元
public static void main(String[] args) throws IOException { //用字元流FileWriter讀取完整資料 File file1 = new File("D:\\a.txt"); FileReader fileReader1 = new FileReader(file1); char[] arr = new char[4]; int length = 0; StringBuilder sbd_1 = new StringBuilder(); while ((length = fileReader1.read(arr)) != -1) { sbd_1.append(arr); } System.out.println(sbd_1); }
輸出字串
class Test
{
public static void main(String[] args) throws IOException
{
File file1=new File("D:\\1.txt");
FileWriter fileWriter1=new FileWriter(file1);
String string="gsa ds感受 dg到 sdh%@6gdseyyfdhj 單方事故";
fileWriter1.write(string,0,string.length());
fileWriter1.close(); //關閉才會刷出內容
}
}