JAVA中字符流詳解

字符流:就是在字節流的基礎上,加上編碼,造成的數據流java

字符流出現的意義:由於字節流在操做字符時,可能會有中文致使的亂碼,因此由字節流引伸出了字符流。數組

字符輸入流:Readeride

經常使用子類:FileReaderthis

文件字符輸入流經常使用方法:編碼

read();spa

read(char[ ]);code

read(char[ ] ,offset,len);視頻

字符輸出流: Writer對象

經常使用子類:文件字符輸出流: Filewriterblog

文件字符輸出經常使用方法:

writer();

writer(char[ ]);

writer(char[ ],offset,len);

writer(string);

flush()刷新緩衝區

注意:close()方法默認調用了flush()方法,可是flush()方法只刷新緩衝區,而close()還會關閉IO流

 

字符輸入流代碼示例:

 1 import java.io.File;  2 import java.io.FileReader;  3 import java.io.IOException;  4 
 5 public class Demo5 {  6 
 7     public static void main(String[] args) throws IOException{  8         FileReader fr=new FileReader(new File("1.txt"));  9         char[] ca=new char[1024]; 10         int count=0; 11         while((count=fr.read(ca))!=-1) { 12             System.out.println(new String(ca,0,count)); 13  } 14  } 15 }

 運行結果:

 字符輸出流代碼示例:

 1 import java.io.File;  2 import java.io.FileReader;  3 import java.io.FileWriter;  4 import java.io.IOException;  5 
 6 public class Demo6 {  7 
 8     public static void main(String[] args) throws IOException{  9         FileReader fr=new FileReader(new File("1.txt")); 10         FileWriter fw=new FileWriter(new File("2.txt")); 11         char[] ca=new char[1024]; 12         int count; 13         while((count=fr.read(ca))!=-1) { 14             fw.write(ca,0,count); 15  } 16  fr.close(); 17  fw.close(); 18  } 19 }

 

執行結果:

 

字符流與字節流的區別:字符流雖然以字節流爲基礎建立的,可是字節流能夠支持聲音,視頻,圖片,文本等全部文件類型,而字符流只支持文本文件。

帶緩衝區的字符流:

BufferedReader/BufferedWriter  帶緩衝區的字符輸入流與字符輸出流。

帶緩衝區的字符輸入流:BufferedReader:經常使用方法:readLine()  讀取一行,若是爲文件末尾,返回值爲null。

帶緩衝區的字符輸出流:BufferedWriter:經常使用方法:writer(string)將字符串寫入 到輸出流。  newLine()根據系統的行分割符進行換行。

BufferReader代碼示例:

 1 import java.io.BufferedReader;  2 import java.io.File;  3 import java.io.FileReader;  4 import java.io.IOException;  5 
 6 public class Demo7 {  7 
 8     public static void main(String[] args) throws IOException{  9         BufferedReader br=new BufferedReader(new FileReader(new File("1.txt"))); 10  String value; 11         while((value=br.readLine())!=null) { 12  System.out.println(value); 13  } 14  br.close(); 15  } 16 }

 

BufferedWriter代碼示例:

 1 import java.io.BufferedReader;  2 import java.io.BufferedWriter;  3 import java.io.FileReader;  4 import java.io.FileWriter;  5 import java.io.IOException;  6 
 7 public class Demo8 {  8 
 9     public static void main(String[] args)throws IOException { 10         BufferedWriter bw=new BufferedWriter(new FileWriter("3.txt")); 11         BufferedReader br=new BufferedReader(new FileReader("1.txt")); 12         String value=""; 13         while((value=br.readLine())!=null) { 14  bw.write(value); 15  bw.newLine(); 16  } 17  bw.close(); 18  br.close(); 19  } 20 }

 

編碼與亂碼:

亂碼:編碼與解碼不一致,致使的亂碼問題,每一種編碼格式都有本身獨特的編碼,若是編碼與解碼不一致,勢必會致使亂碼,例如用Unicode編碼,用gbk解碼,就會字符與碼值不匹配,從而致使亂碼。

編碼表:編碼和解碼使用的規則:

ASCII碼:美國信息交換標準代碼。單字節編碼,不支持中文。

gbk:國標碼;

Unicode/utf-8  :雙字節編碼,支持中文(萬國碼)

代碼示例:

 1 public class 讀取不一樣編碼的文本文件 {  2 public static void main(String[] args) throws IOException {  3 // BufferedReader br=new BufferedReader(new FileReader(new File("C:\\Users\\Administrator\\De
 4 sktop\\6.txt")));
 5 // 改進
 6 BufferedReader br=new BufferedReader(new InputStreamReader(new FileInputStream(new File("C:\
 7 \Users\\Administrator\\Desktop\\6.txt")),"gbk"));
 8 String st = br.readLine();  9 System.out.println(st); 10 } 11 }

 

 

轉換流
1.InputStreamReader 將字節流轉換成字符流 輸入
2.OutputStreamWriter 將字節流轉換成字符流 輸出
3. 構造方法:
① InputStreamReader(InputStream in)
② InputStreamReader(InputStream in, String cs)
③ OutputStreamWriter(OutputStream out)
④ OutputStreamWriter(OutputStream out, String charsetName)
4. 做用:
① 能夠將字節流轉換成字符流
② 可使用指定的編碼來讀取或寫入流。

代碼示例:

1 public class 轉換流 { 2 public static void main(String[] args) throws IOException { 3 InputStreamReader is=new InputStreamReader(new FileInputStream(new File("C:\\Users\\Administ
4 rator\\Desktop\\6.txt")),"gbk");
5 char[] c=new char[1024]; 6 int value = is.read(c); 7 System.out.println(Arrays.toString(c)); 8 } 9 }

 

字節數組字節輸出流
ByteArrayOutputStream
字節數組字節輸出流:
特色: 能夠將數據寫入到 byte 數組中,而且該緩衝區能夠隨着寫入的數據而自增
① 構造方法 :
ByteArrayOutputStream()
② 注意:此類中的方法在關閉此流後仍可被調用,而不會產生任何 IOException
③ 經常使用方法:
1 》 write(byte[]) 將 byte[] 中的值寫入緩衝區字節數組,該緩衝區隨着數據的增多而自增。
2 》 toString() 要想獲取緩衝區的字節數據,能夠經過該方法將其轉換爲字符串。
代碼示例:

 1 public class 字節數組字節輸出流 {  2 public static void main(String[] args) throws IOException {  3 ByteArrayOutputStream bos = new ByteArrayOutputStream();  4 String s="abc";  5 byte[] b=s.getBytes();  6 System.out.println(Arrays.toString(b));  7 bos.write(b);  8 bos.write(b);  9 bos.close(); 10 System.out.println(Arrays.toString(b)); 11 System.out.println(bos.toString()); 12 } 13 }

 

對象流 / 序列化與反序列化流
1. 對象流 / 序列化流
ObjectInputStream: 反序列化流
② ObjectOutputStream: 序列化流
1 》經常使用方法:
writeObject(obj) 將 obj 對象寫入到流中
readObject 讀取流中的數據
① EOFException 表示讀取流意外讀到了文件的末尾 ( 就是一個空文件。 )
2 》構造方法
ObjectOutputStream(OutputStream out)
ObjectInputStream(InputStream in)
3 》序列化版本號:
serialVersionUID 序列化版本號:保證序列化流與反序列化流讀寫一致,保證版本一致性。

代碼示例一:

 1 public class 用序列化流與反序列化流操做集合 {  2 public static void main(String[] args) {  3 ArrayList<Teacher> list=new ArrayList<>();  4 list.add(new Teacher(" 張三 ", 18, new ClassRoom("0318java")));  5 list.add(new Teacher(" 李四 ", 18, new ClassRoom("0318java")));  6 list.add(new Teacher(" 王五 ", 18, new ClassRoom("0318java")));  7 // writeToFile(list,"stu.txt");  8 // 讀取
 9 System.out.println(readTeacher("stu.txt"));  10 }  11 // 帶異常處理的 ,序列化
 12 public static void writeToFile(ArrayList<Teacher> list,String fileName) {  13 // 序列化流進行寫入
 14 try(  15 ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File(fileName)));  16 ){  17 oos.writeObject(list);  18 }catch (Exception e) {  19 e.printStackTrace();  20 }  21 }  22 // 反序列化
 23 public static ArrayList<Teacher> readTeacher(String fileName) {  24 ArrayList<Teacher> list=null;  25 // 反序列化流讀取文件中的集合
 26 try(  27 ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File(fileName)));  28 ){  29 list = (ArrayList<Teacher>) ois.readObject();  30 }catch (Exception e) {  31 e.printStackTrace();  32 }  33 return list;  34 }  35 }  36 class Teacher implements Serializable{  37 /**
 38 * 序列化版本號:默認版本號爲 1l  39 */
 40 private static final long serialVersionUID = 1L;  41 private String name;  42 private int age;  43 private ClassRoom cn;// 班級
 44 public String getName() {  45 return name;  46 }  47 public void setName(String name) {  48 this.name = name;  49 }  50 public int getAge() {  51 return age;  52 }  53 public void setAge(int age) {  54 this.age = age;  55 }  56 public ClassRoom getCn() {  57 return cn;  58 }  59 public void setCn(ClassRoom cn) {  60 this.cn = cn;  61 }  62 @Override  63 public String toString() {  64 return "Teacher [name=" + name + ", age=" + age + ", cn=" + cn + "]";  65 }  66 public Teacher() {  67 super();  68 // TODO Auto-generated constructor stub
 69 }  70 public Teacher(String name, int age) {  71 super();  72 this.name = name;  73 this.age = age;  74 }  75 }  76 public Teacher(String name, int age, ClassRoom cn) {  77 super();  78 this.name = name;  79 this.age = age;  80 this.cn = cn;  81 }  82 }  83 class ClassRoom implements Serializable{  84 /**
 85 * 序列化版本號:保證序列化流與反序列化流讀寫一致  86 */
 87 private static final long serialVersionUID = 3359646767342429683L;  88 private String no;  89 public ClassRoom() {  90 super();  91 // TODO Auto-generated constructor stub
 92 }  93 public ClassRoom(String no) {  94 super();  95 this.no = no;  96 }  97 @Override  98 public String toString() {  99 return "ClassRoom [no=" + no + "]"; 100 } 101 public String getNo() { 102 return no; 103 } 104 public void setNo(String no) { 105 this.no = no; 106 }// 班級號碼
107 }

 

代碼示例二:

 1 import java.io.File;  2 import java.io.FileInputStream;  3 import java.io.FileOutputStream;  4 import java.io.IOException;  5 import java.io.ObjectInputStream;  6 import java.io.ObjectOutputStream;  7 import java.io.Serializable;  8 import java.util.ArrayList;  9 import java.util.Iterator; 10 
11 public class Demo9 { 12 
13     public static void main(String[] args)throws IOException, Exception { 14         ArrayList<Student6> list=new ArrayList<>(); 15         list.add(new Student6("張三","1001",18)); 16         list.add(new Student6("李四","1002",19)); 17         list.add(new Student6("王五","1003",20)); 18         ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(new File("4.txt"))); 19  oos.writeObject(list); 20  oos.close(); 21 
22         ObjectInputStream ois=new ObjectInputStream(new FileInputStream(new File("4.txt") )); 23         ArrayList<Student6> list2=(ArrayList<Student6>) ois.readObject(); 24         Iterator<Student6> it=list2.iterator(); 25         while(it.hasNext()) { 26             Student6 stu=it.next(); 27             System.out.println("姓名:"+stu.getName()+"\t學號:"+stu.getStuNo()+"\t年齡+\t:"+stu.getAge()); 28  } 29  } 30 } 31 class Student6 implements Serializable{ 32     /**
33  * 34      */
35     private static final long serialVersionUID = 2658878058482366562L; 36     private String name; 37     private String stuNo; 38     private int age; 39     
40     public Student6() { 41         super(); 42  } 43     public Student6(String name,String stuNo,int age) { 44         this.name=name; 45         this.stuNo=stuNo; 46         this.age=age; 47         
48  } 49     public void setName(String name) { 50         this.name=name; 51  } 52     public String getName() { 53         return name; 54  } 55     public void setStuNo(String stuNo) { 56         this.stuNo=stuNo; 57  } 58     public String getStuNo() { 59         return stuNo; 60  } 61     public void setAge(int age) { 62         this.age=age; 63  } 64     public int getAge() { 65         return age; 66  } 67  @Override 68     public String toString() { 69         return "Student6 [name=" + name + ", stuNo=" + stuNo + ", age=" + age + "]"; 70  } 71 }

 

 

EOFException表示輸入過程當中意外地到達文件尾或流尾的信號

字符流寫入 要刷新/關流才能寫入(刷新也是調用了flush(刷新)方法)
就像水龍頭帶軟管,開水龍頭要等一下子水才能流出來,就和須要刷新同樣

字節流不須要刷新,是由於字節流是一個字節一個字節讀和寫的,而字符流是三個字節或者兩個字節讀和寫的,因此字符流須要刷新,而字節流不須要刷新

相關文章
相關標籤/搜索