java第21天----轉換流,標準流,列印流,序列化流,Properties類
阿新 • • 發佈:2018-12-13
昨天知識總結
- 1.字元緩衝流
- 2.裝飾設計模式
- 3.介面卡設計模式
- 4.位元組流
- 5.位元組緩衝流
- 6.標準輸入流
流
轉換流
- 轉換流:本身是字元流
- 分類:
- InputStreamReader:從位元組輸入流到字元讀入流
- OutputStreamWriter:從位元組輸出流到字元寫出流
- 場景:要使用字元緩衝流的readLine(),newLine方法服務於位元組流
- 例項:使用字元緩衝流的readLine(),newLine()等方法實現在控制檯一次讀一行資料
public static void main(String[] args) throws IOException {
System. out.println();
//將標準輸入流轉成字元緩衝讀入流
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
//將標準輸出流轉成字元緩衝寫出流
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(System.out));
//讀寫
String str= null;
while((str = bufferedReader.readLine())!= null) {
bufferedWriter.write(str);
bufferedWriter.newLine();
//手動重新整理
bufferedWriter.flush();
//當輸入over的時候結束
if(str.equals("over")) {
break;
}
}
//關閉流
bufferedWriter.close();
bufferedReader.close();
}
- 裝置之間的傳輸:
- 裝置分成輸入源和輸出源,
- 輸入源:給記憶體提供資料的裝置
- 輸出源:從記憶體接受資料的裝置
- 輸入源:鍵盤
- 輸出源:控制檯
public static void main(String[] args) throws IOException {
//將鍵盤作為輸入源
BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(System.in));
//將檔案作為輸入源
BufferedReader bufferedReader2 = new BufferedReader(new FileReader("src\\com\\qianfeng\\test\\Demo1.java"));
//將檔案作為輸出源
BufferedWriter bufferedWriter1 = new BufferedWriter(new FileWriter("temp1.txt"));
//將控制檯作為輸出源
BufferedWriter bufferedWriter2 = new BufferedWriter(new OutputStreamWriter(System.out));
String str = null;
while((str = bufferedReader1.readLine())!=null) {
bufferedWriter2.write(str);
bufferedWriter2.newLine();
bufferedWriter2.flush();
}
bufferedReader1.close();
bufferedReader2.close();
bufferedWriter1.close();
bufferedWriter2.close();
}
- 輸入源:鍵盤
- 輸出源:檔案
public static void main(String[] args) throws IOException {
//將鍵盤作為輸入源
BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(System.in));
//將檔案作為輸入源
BufferedReader bufferedReader2 = new BufferedReader(new FileReader("src\\com\\qianfeng\\test\\Demo1.java"));
//將檔案作為輸出源
BufferedWriter bufferedWriter1 = new BufferedWriter(new FileWriter("temp1.txt"));
//將控制檯作為輸出源
BufferedWriter bufferedWriter2 = new BufferedWriter(new OutputStreamWriter(System.out));
String str = null;
while((str = bufferedReader1.readLine())!=null) {
bufferedWriter1.write(str);
bufferedWriter1.newLine();
bufferedWriter1.flush();
}
bufferedReader1.close();
bufferedReader2.close();
bufferedWriter1.close();
bufferedWriter2.close();
}
- 輸入源:檔案
- 輸出源:控制檯
public static void main(String[] args) throws IOException {
//將鍵盤作為輸入源
BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(System.in));
//將檔案作為輸入源
BufferedReader bufferedReader2 = new BufferedReader(new FileReader("src\\com\\qianfeng\\test\\Demo1.java"));
//將檔案作為輸出源
BufferedWriter bufferedWriter1 = new BufferedWriter(new FileWriter("temp1.txt"));
//將控制檯作為輸出源
BufferedWriter bufferedWriter2 = new BufferedWriter(new OutputStreamWriter(System.out));
String str = null;
while((str = bufferedReader2.readLine())!=null) {
bufferedWriter2.write(str);
bufferedWriter2.newLine();
bufferedWriter2.flush();
}
bufferedReader1.close();
bufferedReader2.close();
bufferedWriter1.close();
bufferedWriter2.close();
}
- 輸入源:檔案
- 輸出源:檔案
public static void main(String[] args) throws IOException {
//將鍵盤作為輸入源
BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(System.in));
//將檔案作為輸入源
BufferedReader bufferedReader2 = new BufferedReader(new FileReader("src\\com\\qianfeng\\test\\Demo1.java"));
//將檔案作為輸出源
BufferedWriter bufferedWriter1 = new BufferedWriter(new FileWriter("temp1.txt"));
//將控制檯作為輸出源
BufferedWriter bufferedWriter2 = new BufferedWriter(new OutputStreamWriter(System.out));
String str = null;
while((str = bufferedReader2.readLine())!=null) {
bufferedWriter1.write(str);
bufferedWriter1.newLine();
bufferedWriter1.flush();
}
bufferedReader1.close();
bufferedReader2.close();
bufferedWriter1.close();
bufferedWriter2.close();
}
更換標準流輸入源,輸出源
- 更換輸入源,輸出源
- 注意:這裡是臨時更換,只能在當前的程式中使用更換後的輸入輸出源,如果在其他的程式中會自定變回原來的鍵盤/控制檯
- 例項:從鍵盤到控制檯,更換成從檔案到檔案
public static void main(String[] args) throws IOException {
//更換輸入源--從鍵盤到檔案
System.setIn(new FileInputStream("src/com/qianfeng/test/Demo1.java"));
//更換輸出源--從控制檯到檔案
System.setOut(new PrintStream("temp2.txt"));
BufferedReader bufferedReader1 = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufferedWriter2 = new BufferedWriter(new OutputStreamWriter(System.out));
String data = null;
while((data = bufferedReader1.readLine())!=null){
bufferedWriter2.write(data);
bufferedWriter2.newLine();
bufferedWriter2.flush();
}
bufferedReader1.close();
bufferedWriter2.close();
}
列印流
- 列印流:除了擁有輸出流的特點之外,還有列印的功能,比如println,print的方法。
- 分成兩種
- 位元組列印流:PrintStream
- 字元列印流:PrintWriter
位元組列印流:
- 可以直接關聯的裝置(傳入的引數)
- 1.File型別的檔案
- 2.字串型別的檔案
- 3.位元組輸出流
public static void main(String[] args) throws IOException {
// * 1.File型別的檔案
//PrintStream printStream = new PrintStream(new File("D:\\eclipse-workspace\\BigData1715N20\\src\\com\\qianfeng\\test\\Demo1.java"));
// * 2.字串型別的檔案
//PrintStream printStream = new PrintStream("temp3.txt");//對於當前的檔案,如果不存在,會自動建立
// * 3.位元組輸出流
PrintStream printStream1 = new PrintStream(new FileOutputStream("temp3.txt"));
//講解print方法的原理
printStream1.write(97);//00000000 00000000 00000000 00000000 01100001 在列印的時候,將前面三個位元組砍掉了,得到了a
printStream1.write(353);//00000000 00000000 00000000 00000001 01100001 在列印的時候,將前面的三個字元砍掉了,得到了a
printStream1.print(353);
//先將353轉成字串,再轉成位元組陣列
printStream1.write(String.valueOf(353).getBytes());
printStream1.close();
}
字元列印流:
- 可以直接關聯的裝置(傳入的引數)
- 1.File型別的檔案
- 2.字串型別的檔案
- 3.位元組輸出流
- 4.字元寫出流
public static void main(String[] args) throws IOException {
System.out.println();
//例項:將資料從鍵盤接收傳到控制檯
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
//建立字元列印流
PrintWriter printWriter = new PrintWriter(System.out);
String data = null;
while((data = bufferedReader.readLine())!=null) {
printWriter.println(data);
printWriter.flush();
}
printWriter.close();
bufferedReader.close();
}
序列化流
- 序列化流:將短期儲存的資料實現長期儲存的過程
- 短期儲存:資料存放在記憶體中,隨著程式的關閉而釋放,----物件,陣列,集合,變數
- 長期儲存:資料存放在磁碟中,即使程式關閉,資料仍然存在----檔案
- 序列化:將資料從記憶體存入磁碟,可以實現資料的持久化儲存。
- 逆序列化:將資料從磁碟傳回記憶體,
- 進行序列化的步驟:----以物件的序列化為例項
- 1.建立一個類
- 這個類的物件進行序列化必須實現Serializable介面,
- 類通過實現介面,啟動序列化功能,未實現此介面的類無法實現序列化或逆序列化,
- 如果沒有實現,會報異常NotSerializableException
- 注意點:可序列化物件的內部的元素要都支援序列化。
- 2.使用對應的流,將物件存入磁碟----序列化----ObjectOutputStream
- 3.使用對應的流將資料從磁碟中取出放回記憶體----逆序列化----ObjectInputStream
- 4.關閉流
- 1.建立一個類
- 注意:序列化流在工作時也要關聯的輸入流輸出流
序列化
//序列化
public static void fun1() throws IOException {
//建立序列化流並關聯檔案
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("temp4.txt"));
//實現序列化
//序列化後的內容不能直接檢視,要想檢視必須逆序列化
objectOutputStream.writeObject(new Person("bingbing",20));
//關閉流
objectOutputStream.close();
}
class Person implements Serializable{
/**
*相當於這個類的ID,逆序列化比較的是位元組碼檔案的名字還有ID,如果沒有對應的ID或位元組碼檔案,就無法逆序列化
* generated:由編譯器自動生成的嗎,後面加L標識long型資料
*/
private static final long serialVersionUID = -8537344700990412769L;
/**
* default:預設的方式,可以有使用者自己指定,預設值是1
*/
// private static final long serialVersionUID = 1L;
String name;
int age;
int height;
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;
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age +", height = "+height +"]";
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
逆序列化
//逆序列化
public static void fun2() throws FileNotFoundException, IOException, ClassNotFoundException {
//建立逆序列化流並關聯檔案
ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("temp4.txt"));
//實現逆序列化--讀
Person person = (Person)inputStream.readObject();
System.out.println(person);
// Object object = inputStream.readObject();
// System.out.println(object);
//關閉流
inputStream.close();
}
class Person implements Serializable{
/**相當於這個類的ID,逆序列化比較的是位元組碼檔案的名字還有ID,如果沒有對應的ID或位元組碼檔案,就無法逆序列化
* generated:由編譯器自動生成的嗎,後面加L標識long型資料
*/
private static final long serialVersionUID = -8537344700990412769L;
/**
* default:預設的方式,可以有使用者自己指定,預設值是1
*/
// private static final long serialVersionUID = 1L;
String name;
int age;
int height;
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;
}
@Override
public String toString() {
return "person [name=" + name + ", age=" + age +", height = "+height +"]";
}
public Person() {
super();
// TODO Auto-generated constructor stub
}
public Person(String name, int age) {
super();
this.name = name;
this.age = age;
}
}
Properties類
- Properties這是一個類,可以理解成是一個Map集合,儲存的是屬性,屬性以鍵值對的形式存在。鍵值對內部的鍵值必須是String,不需要泛型
- 為什麼要在這裡講Properties?
- 因為他的操作與流的關係非常的緊密
- 優點:
- 1.以鍵值對的形式存值,
- 2.內部封裝了大量的方法,比如:load,store,list等,方便操作
基本操作
//1.基本的操作
public static void function1() {
//建立Properties物件
Properties properties = new Properties();
//存值
properties.setProperty("01", "java");
properties.setProperty("02", "python");
properties.setProperty("01", "ok");
//取值
properties.getProperty("01");
System.out.println(properties.getProperty("01"));
//獲取所有的key
Set<String> set = properties.stringPropertyNames();
for (String string : set) {
System.out.println("Key"+string+" = value"+properties.getProperty(string));
}
獲取系統屬性
//2.如何通過Properties獲取系統的屬性
public static void function2() {
Properties properties = System.getProperties();
Set<String> set = properties.stringPropertyNames();
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
String string = (String) iterator.next();
System.out.println("Key:"+string+" = value:"+properties.getProperty(string));
}
Properties的實際應用
public static void function3() throws IOException {
//建立屬性集合物件
Properties properties = new Properties();
//建立輸入流
FileReader fileReader = new FileReader("temp2.txt");
//將temp2.txt的內容載入到屬性集合物件中
properties.load(fileReader);
//列印到控制檯
//注意:要想列印的是正確的形式,必須保證TXT檔案本身是鍵值對的形式存在
properties.list(System.out);
//更改內容
properties.setProperty("01","bingbingbang");
//將內容重新寫回磁碟---藉助輸出流
FileWriter fileWriter = new FileWriter("temp2.txt");
properties.store(fileWriter,"bingbingchoule");
fileWriter.close();
fileReader