1. 程式人生 > >javaSEI/O——兩種輸入流、序列化、System類的補充

javaSEI/O——兩種輸入流、序列化、System類的補充

一、兩種輸入流
1.BufferedReader類
重點是:掌握這個轉換關係
BufferedReader類是緩衝的輸入流,在之前學習流的過程中,我們在輸入位元組/字元流的時候就已經用到了緩衝區了。 緩衝流,也分為兩類:位元組緩衝流(BufferedInputStream)、字元緩衝流(BufferedReader)。緩衝流只在輸入流中才有。
在這個類中提供了一種方法就是可以讀取一行資料:
String readLine() throws IOException
eg:利用BufferedReader實現鍵盤輸入

public class TestPrint {
    public static void main(String[] args) throws IOException {
        //BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
        //我們需要注意的是System.in是位元組輸入流InputStream的子類,所以我們要實現從控制檯輸入然後讀取這個過程
        //需要我們將位元組輸入流轉化為字元輸入流來處理;其中這個轉換我們需要通過轉換流來實現。
        //上面這條語句相當於是下面的這些語句:
        InputStream input=System.in;
        //將位元組輸入流轉變為字元輸入流
        InputStreamReader inputStreamReader=new InputStreamReader(input);
        BufferedReader buf=new BufferedReader(inputStreamReader);
        //這樣就有了字元緩衝流
        System.out.println("請輸入資訊:");
        String str=buf.readLine();//按回車符換行
        System.out.println("輸入的資訊是:"+str);
    }
}

2.java.util.Scanner類
為什麼會存在Scanner?
列印流解決的是OutputStream類的缺陷,BufferedReader解決的是InputSream類的缺陷,而我們的Scanner解決的是BufferedReader的缺陷。
Scanner專門用來處理輸入流,利用這個類我們更加方便處理各種資料型別的輸入,對於Scanner類我們主要掌握一下幾個方法:
(1).判斷是否指定型別資料:public boolean hasNext…()
(2).取得指定型別的資料:public 資料型別 next…()
(3).定義分隔符:public Scanner useDelimiter(Pattern pattern)
(4).構造方法:public Scanner(InputStream source)
注意:以後除去二進位制檔案拷貝的處理之外,那麼只要是針對程式的資訊輸出都是用列印流(PrintStream、PrintWriter),資訊輸出使用Scanner。
二、序列化
1.一般序列化我們分為下面三種:
Java Object (In Memory) -> Binary Data

(1)Java提供的一種序列化(JDK提供) 遠端方法呼叫(RPC)
   Object (In Memory) -> byte[]  (網路中傳輸,儲存檔案) 序列化
   byte[]             -> Object (In Memory) 反序列化

(2) Object  -> JSON (前端開發 JavaScript) Person(name,age) -> {"name":"Jack", "age": 22}
   JSON    -> Object

(3)Object -> XML (XML檔案)(JDK提供)
   XML    -> Object

物件序列化指的是:將記憶體中儲存的物件變為二進位制資料流的形式進行傳輸,或者是將其儲存在文字中。從定義來講所有的類都可以進行序列化,但是我們規定只有進行傳輸的物件才序列化,同時這個類要實現java.io.Serializable介面。這個接口裡面沒有定義任何方法,它只是一個表示而已。
實現序列化的例子:

class Person1 implements Serializable {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person [name="+name+",age="+age+"]";
    }
}
public class TestPrint {
        public static final File file = new File("E:"+File.separator+"learn"+File.separator+"javaio"+File.separator+"data1.txt");
    public static void main(String[] args) throws IOException {
//實現序列化
       ser(new Person("jon",20)); 
    }

    private static void ser(Person jon) throws IOException {
        ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(file));
        oos.write(obj);//實現序列化
        oos.close();
    }

通過這個例子我們需要注意的有兩點:
(1)序列化只會序列化物件的屬性資訊,對於類的方法不會被序列化。
(2)反序列化不會執行構造方法和構造塊
2.transient關鍵字
transient關鍵字的作用就是當我們有時候不希望有的屬性被序列化的時候就使用這個關鍵字修飾這個屬性,這個屬性就不會被序列化了。
三、System類的補充(重要)
在我們的System類裡面可以獲得兩類屬性:系統屬性、環境變數屬性
1.系統變數屬性(我們通過程式碼呼叫的形式進行講解)

package com.wschase.liu;

import java.util.Map;
import java.util.Properties;

/**系統屬性和環境變數屬性(很重要)
 * Author:WSChase
 * Created:2018/12/9
 */
public class TestSystem {
    public static void main(String[] args) {

    //1.系統屬性:Properties properties=System.getProperties();->通過定義的這個物件類呼叫它的方法
        Properties properties=System.getProperties();
        //常用的系統屬性
        System.out.println("常見系統屬性:");
        //(1) user.home
        String userHome=(String)properties.get("user.home");
        System.out.println(userHome);
        //(2) user.dir
        String userDir=(String)properties.get("use.dir");
        System.out.println(userDir);
        //(3) java.home
        String javaHome=(String)properties.get("java.home");
        System.out.println(javaHome);
        //(4) path.separator
        String pathSeparator=(String)properties.get("path.separator");
        System.out.println(pathSeparator);
        //(5) file.separator
        String fileSeparator=(String)properties.get("file.separator");
        System.out.println(fileSeparator);

在這裡插入圖片描述
2.系統的環境變數

        System.out.println("常見系統環境變數:");
    //2.系統的話你就環境變數
    Map<String,String> env=System.getenv();
    for(Map.Entry<String,String> entry:env.entrySet()){
        System.out.println(entry.getKey()+"="+entry.getKey());
    }
         //系統常見的環境變數
         //(1)JAVA_HOME
        System.out.println(System.getenv("JAVA_HOME"));
         //(2)SystemDrive
        System.out.println(System.getenv("SystemDrive"));
        //(3)Path
        System.out.println(System.getenv("Path"));
        //(4)ProgramW6432
        System.out.println(System.getenv("ProgramW6432"));
        //TEMP
        System.out.println(System.getenv("TEMP"));
        //NUMBER_OF_PROCESSORS
        System.out.println(System.getenv("NUMBER_OF_PROCESSORS"));
        
    }

}

在這裡插入圖片描述
在這裡插入圖片描述