一、緩衝流(高效流)
1.緩衝流,也叫高效流,是對4個基本的 FileXxx 流的增強,所以也是4個流,按照數據類型分類:
字節緩衝流: BufferedInputStream , BufferedOutputStream
字符緩衝流: BufferedReader , BufferedWriter
2.原理
緩衝流創建對象的時候,有一個緩衝區數組,通過緩衝區數組讀取,效率大大提升
3.字符緩衝流需注意的兩個方法
BufferedReader: public String readLine() : 讀一行文字。
BufferedWriter: public void newLine() : 寫一行行分隔符,由系統屬性定義符號。
基礎練習
對以下文本按序號排序(注意每個數字後面的文本必須在一行)
3.侍中、侍郎郭攸之、費禕、董允等,此皆良實,志慮忠純,是以先帝簡拔以遺陛下。愚以爲宮中之事,事無大小,悉以諮之,然後施行,必得裨補闕漏,有所廣益。
8.願陛下託臣以討賊興復之效,不效,則治臣之罪,以告先帝之靈。若無興德之言,則責攸之、禕、允等之慢,以彰其咎;陛下亦宜自謀,以諮諏善道,察納雅言,深追先帝遺詔,臣不勝受恩感激。
4.將軍向寵,性行淑均,曉暢軍事,試用之於昔日,先帝稱之曰能,是以衆議舉寵爲督。愚以爲營中之事,悉以諮之,必能使行陣和睦,優劣得所。
2.宮中府中,俱爲一體,陟罰臧否,不宜異同。若有作奸犯科及爲忠善者,宜付有司論其刑賞,以昭陛下平明之理,不宜偏私,使內外異法也。
1.先帝創業未半而中道崩殂,今天下三分,益州疲弊,此誠危急存亡之秋也。然侍衛之臣不懈於內,忠志之士忘身於外者,蓋追先帝之殊遇,欲報之於陛下也。誠宜開張聖聽,以光先帝遺德,恢弘志士之氣,不宜妄自菲薄,引喻失義,以塞忠諫之路也。
9.今當遠離,臨表涕零,不知所言。
6.臣本布衣,躬耕於南陽,苟全性命於亂世,不求聞達於諸侯。先帝不以臣卑鄙,猥自枉屈,三顧臣於草廬之中,諮臣以當世之事,由是感激,遂許先帝以驅馳。後值傾覆,受任於敗軍之際,奉命於危難之間,爾來二十有一年矣。
7.先帝知臣謹慎,故臨崩寄臣以大事也。受命以來,夙夜憂嘆,恐付託不效,以傷先帝之明,故五月渡瀘,深入不毛。今南方已定,兵甲已足,當獎率三軍,北定中原,庶竭駑鈍,攘除奸兇,興復漢室,還於舊都。此臣所以報先帝而忠陛下之職分也。至於斟酌損益,進盡忠言,則攸之、禕、允之任也。
5.親賢臣,遠小人,此先漢所以興隆也;親小人,遠賢臣,此後漢所以傾頹也。先帝在時,每與臣論此事,未嘗不嘆息痛恨於桓、靈也。侍中、尚書、長史、參軍,此悉貞良死節之臣,願陛下親之信之,則漢室之隆,可計日而待也。
package cn.itcast.test;
import java.io.*;
import java.util.HashMap;
import java.util.Set;
public class Test {
public static void main(String[] args) throws IOException {
//創建map來存儲數據信息
HashMap<String, String> map = new HashMap<>();
//創建緩衝字符輸入流,讀取數據到內存(或者程序)
BufferedReader br = new BufferedReader(new FileReader("day10\\file.txt"));
//創建緩衝字符輸出流,寫數據到另一文件
BufferedWriter bw = new BufferedWriter(new FileWriter("day10\\chengeFile.txt"));
//讀取數據
String line;
while ((line = br.readLine()) != null) {
String[] split = line.split("\\.", 2);
map.put(split[0], split[1]);
}
Set<String> set = map.keySet();
for (int i = 1; i <= set.size(); i++) {
//寫入數據
String str = i + "." + map.get(i+"");
bw.write(str);
bw.newLine();
}
br.close();
bw.close();
}
}
二、轉換流
1.編碼?
字符 按照一定的規則 變爲字節;
2.解碼?
字節 按照一定的規則 變爲 字符;
3.爲什麼會發生亂碼?
編碼和解碼的規則不一樣;
4.常見字符碼錶?
ASCII碼錶:
GBK;(一個漢字佔用兩個字節)
UTF-8;(一個漢字佔用三個字節)
ISO-8859-1:
5.轉換流能解決什麼問題?
亂碼問題
由於轉換流可以指定編碼表,那麼它就可以保證我們讀寫的時候(編碼和解碼的規則一樣);
三、序列化流
1. 一個對象要想序列化,必須滿足兩個條件:
a.該類必須實現 java.io.Serializable 接口, Serializable 是一個標記接口,不實現此接口的類將不會使任
何狀態序列化或反序列化,會拋出 NotSerializableException 。
b.該類的所有屬性必須是可序列化的。如果有一個屬性不需要可序列化的,則該屬性必須註明是瞬態的,使用
transient 關鍵字修飾。
2.反序列化操作
如果能找到一個對象的class文件,我們可以進行反序列化操作,調用 ObjectInputStream 讀取對象的方法:
public final Object readObject () : 讀取一個對象。
當JVM反序列化對象時,能找到class文件,但是class文件在序列化對象之後發生了修改,那麼反序列化操
作也會失敗,如果需要修改,則必須給序列化類一個版本號serialVersionUID
3.重要總結
如果一個class在反序列化前被修改,但是我還想要得到反序列化修改之後的class,那麼在序列化之前,我需要給這個類添加序列化版本serialVersionUID
序列化練習
1. 將存有多個自定義對象的集合序列化操作,保存到 list.txt 文件中。
2. 反序列化 list.txt ,並遍歷集合,打印對象信息。
Person類
package cn.itcast.test01;
import java.io.Serializable;
public class Person implements Serializable {
private static final long serialVersionUID = -8289499667595781797L;
private String name;
private int age;
public Person() {
}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
Test類
package cn.itcast.test01;
import java.io.*;
import java.util.ArrayList;
public class Test {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//1. 將存有多個自定義對象的集合序列化操作,保存到 list.txt 文件中。
ArrayList<Person> list = new ArrayList<>();
list.add(new Person("張三",20));
list.add(new Person("李四",21));
list.add(new Person("王五",23));
//把集合對象序列化到list.txt文件中
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day10\\list.txt"));
oos.writeObject(list);
//2. 反序列化 list.txt ,並遍歷集合,打印對象信息。
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day10\\list.txt"));
Object o = ois.readObject();
ArrayList<Person> list1 = (ArrayList<Person>)o;
for (Person person : list) {
System.out.println(person);
}
}
}
IO流總結