java的緩衝流及使用Properties集合存取資料(遍歷,store,load)

wangyudong927發表於2021-12-05

緩衝流

概述

  • 位元組緩衝流:BufferedInputStream,BufferedOutputStream
  • 字元緩衝流:BufferedReader,BufferedWriter

緩衝流原理

  • 緩衝區是記憶體中的一塊特定區域,與在記憶體中定義一個陣列的區域不同

BufferedOutputStream

import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/*
java.io.BufferedOutputStream
BufferedOutputStream:位元組緩衝輸出流

繼承自父類的共性成員方法:
    - public void close():關閉此輸出流並釋放與此流相關聯的任何系統資源
    - public void flush():重新整理此輸出流並強制任何緩衝的輸出位元組被寫出
    - public void write(byte[] b):將b.length位元組從指定的位元組陣列寫入此輸出流
    - public void write(byte[] b, int off, int len):從指定的位元組陣列寫入len位元組,從偏移量off開始輸出到此輸出流
    - public abstract void write(int b):將指定的位元組輸出流

構造方法:
    BufferedOutputStream(OutputStream out) 建立一個新的緩衝輸出流,以將資料寫入指定的底層輸出流
    BufferedOutputStream(OutputStream, int size) 建立一個新的緩衝輸出流,以將具有指定緩衝區大小的資料寫入指定的底層輸出流
    引數:
        OutputStream out:位元組輸出流
            我們可以傳遞FileOutputStream,緩衝流會給FileOutputStream增加一個緩衝區,提高FileOutputStream的寫入效率
        int size:指定緩衝流內部緩衝區的大小,不指定預設
使用步驟(重點)
    1.建立FileOutputStream物件,構造方法中繫結要輸出的目的地
    2.建立BufferedOutputStream物件,構造方法中傳遞FileOutputStream物件,提高FileOutputStream物件的效率
    3.使用BufferedOutputStream物件中的方法write,把資料寫入到內部緩衝區中
    4.使用BufferedOutputStream物件中的方法flush,把內部緩衝區中的資料,重新整理到檔案中
    5.釋放資源(會先呼叫flush方法重新整理資料,第四步可以省略)
 */
public class Demo01BufferedOutputStream {
    public static void main(String[] args) throws IOException {
        //1.建立FileOutputStream物件,構造方法中繫結要輸出的目的地
        FileOutputStream fos = new FileOutputStream("D:\\environment\\java_project\\javase\\a.txt");
        //2.建立BufferedOutputStream物件,構造方法中傳遞FileOutputStream物件,提高FileOutputStream物件的效率
        BufferedOutputStream bos = new BufferedOutputStream(fos);
        //3.使用BufferedOutputStream物件中的方法write,把資料寫入到內部緩衝區中
        bos.write("我把資料寫入到內部緩衝區中".getBytes());
        //4.使用BufferedOutputStream物件中的方法flush,把內部緩衝區中的資料,重新整理到檔案中
        bos.flush();
        //5.釋放資源(會先呼叫flush方法重新整理資料,第四步可以省略)
        bos.close();
    }
}

BufferedInputStream

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;

/*
java.io.BufferedInputStream extends InputStream
BufferedInputStream:位元組緩衝輸入流

繼承自父類的成員方法:
    int read()從輸入流中讀取資料的下一個位元組
    int read(byte[] b)從輸入流中讀取一定數量的位元組,並將其儲存在緩衝區陣列b中
    void close()關閉此輸入流並釋放與該流關聯的所有系統資源

構造方法:
    BufferedInputStream(InputStream in) 建立一個BufferedInputStream並儲存其引數,即輸入流in,以便將來使用
    BufferedInputStream(InputStream in, int size) 建立具有指定緩衝區大小的BufferedInputStream並儲存其引數,即輸入流in,以便將來使用
    引數:
        InputStream in:位元組輸入流
            我們可以傳遞FileInputStream,緩衝流會給FileInputStream增加一個緩衝區,提高FileInputStream的讀取效率
        int size:指定緩衝流內部緩衝區的大小,不指定預設

使用步驟(重點):
    1.建立FileInputStream物件,構造方法中繫結要讀取的資料來源
    2.建立BufferedInputStream物件,構造方法中傳遞FileInputStream物件,提高FileInputStream物件的讀取效率
    3.使用BufferedInputStream物件中的方法read,讀取檔案
    4.釋放資源
 */
public class Demo02BufferedInputStream {
    public static void main(String[] args) throws IOException {
        //1.建立FileInputStream物件,構造方法中繫結要讀取的資料來源
        FileInputStream fis = new FileInputStream("D:\\environment\\java_project\\javase\\a.txt");
        //2.建立BufferedInputStream物件,構造方法中傳遞FileInputStream物件,提高FileInputStream物件的讀取效率
        BufferedInputStream bis = new BufferedInputStream(fis);
        //3.使用BufferedInputStream物件中的方法read,讀取檔案
        //int read()從輸入流中讀取資料的下一個位元組
        /*int len = 0;//記錄每次讀取到的位元組
        while ((len = bis.read())!=-1){
            System.out.println(len);
        }*/

        //int read(byte[] b)從輸入流中讀取一定數量的位元組,並將其儲存在緩衝區陣列b中
        byte[] bytes = new byte[1024];
        int len = 0;
        while ((len = bis.read(bytes))!=-1){
            System.out.println(new String(bytes,0,len));
        }

        //4.釋放資源(只關閉緩衝流即可,關閉緩衝流會自動將位元組流關閉)
        bis.close();
    }
}

BufferedWriter

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;

/*
java.io.BufferedWriter extends Writer
BufferedWriter:字元緩衝輸出流

繼承自父類的共性成員方法:
    - void write(int c) 寫入單個字元
    - void write(char[] cbuf) 寫入字元陣列
    - abstract void write(char[] cbuf, int off, int len) 寫入字元陣列的某一部分,off陣列的開始索引,len寫的字元個數
    - void write(String str) 寫入字串
    - void write(String str, int off, int len) 寫入字串的某一部分,off字串的開始索引,len寫的字元個數
    - void flush() 重新整理該流的緩衝
    - void close() 關閉此流,但要先重新整理它

構造方法:
    BufferedWriter(Writer out) 建立一個使用預設大小輸出緩衝區的緩衝字元輸出流
    BufferedWriter(Writer out, int sz) 建立一個使用給定大小輸出緩衝區的新緩衝字元輸出流
    引數:
        Writer out:字元輸出流
            我們可以傳遞FileWriter,緩衝流會給FileWriter增加一個緩衝區,提高FileWriter的寫入效率
        int sz:指定緩衝區的大小,不寫預設大小

特有的成員方法:
    換行:void newLine() 寫入一個行分隔符,會根據不同的作業系統,獲取不同的行分隔符
    換行:換行符號
    windows:\r\n
    linux:/n
    mac:/r
使用步驟:
    1.建立字元緩衝輸出流物件,構造方法中傳遞字元輸出流
    2.呼叫字元緩衝輸出流中的方法write,把資料寫入到記憶體緩衝區中
    3.呼叫字元緩衝輸出流中的方法flush,把記憶體緩衝區中的資料,重新整理到檔案中
    4.釋放資源
 */
public class Demo03BufferedWriter {
    public static void main(String[] args) throws IOException {
        //System.out.println();其中呼叫的ln方法就是newLine()。
        //1.建立字元緩衝輸出流物件,構造方法中傳遞字元輸出流
        BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\environment\\java_project\\javase\\a.txt"));
        //2.呼叫字元緩衝輸出流中的方法write,把資料寫入到記憶體緩衝區中
        for (int i = 0; i < 10; i++) {
            bw.write("傳智播客");
            //bw.write("\r\n");
            bw.newLine();
        }
        //3.呼叫字元緩衝輸出流中的方法flush,把記憶體緩衝區中的資料,重新整理到檔案中
        bw.flush();
        //4.釋放資源
        bw.close();
    }
}

BufferedReader

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

/*
java.io.BufferedReader extends Reader

繼承自父類的共性成員方法:
    int read() 讀取單個字元並返回
    int read(char[] cbuf) 一次讀取多個字元,將字元讀入陣列
    void close() 關閉該流並釋放與之關聯的所有資源

構造方法:
    BufferedReader(Reader in) 建立一個使用預設大小輸入緩衝區的緩衝字元輸入流
    BufferedReader(Reader in, int sz) 建立一個使用指定大小輸入緩衝區的緩衝字元輸入流
    引數:
        Reader in:字元輸入流
            我們可以傳遞FileReader,緩衝流會給FileReader增加一個緩衝區,提高FileReader的讀取效率
特有的成員方法:
    String readLine() 讀取一個文字行,讀取一行資料
        行的終止符號:通過下列字元之一即可認為某行已終止:換行('\n')、回車('\r')或回車後直接跟著換行(\r\n)。
    返回值:
        包含該行內容的字串,不包含任何行終止符,如果已到達流末尾,則返回null

    使用步驟:
        1.建立字元緩衝輸入流物件,構造方法中傳遞字元輸入流
        2.使用字元緩衝輸入流物件中的方法read/readLine讀取文字
        3.釋放資源
 */
public class Demo04BufferedReader {
    public static void main(String[] args) throws IOException {
        //1.建立字元緩衝輸入流物件,構造方法中傳遞字元輸入流
        BufferedReader br = new BufferedReader(new FileReader("D:\\environment\\java_project\\javase\\a.txt"));

        //2.使用字元緩衝輸入流物件中的方法read/readLine讀取文字
        /*String line = br.readLine();
        System.out.println(line);

        line = br.readLine();
        System.out.println(line);

        line = br.readLine();
        System.out.println(line);

        line = br.readLine();
        System.out.println(line);

        line = br.readLine();
        System.out.println(line);*/

        /*
        發現以上讀取是一個重複的過程,所以可以使用迴圈優化
        不知道檔案中有多少行資料,所以使用while迴圈
        while的結束條件,讀取到null結束
         */
        String line;
        while ((line = br.readLine())!=null){
            System.out.println(line);
        }
        //3.釋放資源
        br.close();
    }
}

使用Properties集合儲存資料,遍歷,store,load

import java.io.*;
import java.util.Properties;
import java.util.Set;

/*
java.util.Properties集合 extends Hashtable<k,v> implements Map<k,v>
Properties 類表示了一個持久的屬性集。Properties 可儲存在流中或從流中載入
Properties集合是一個唯一和IO流相結合的集合
    可以使用Properties集合中的方法store,把集合中的臨時資料,持久化寫入到硬碟中儲存
    可以使用Properties集合中的方法load,把硬碟中儲存的檔案(鍵值對),讀取到集合中使用

屬性列表中每個鍵及其對應值都是一個字串
    Properties集合是一個雙列集合,key和value預設都是字串
 */
public class Demo01Properties {
    public static void main(String[] args) throws IOException {
        show01();
        show02();
        show03();
    }

    /*
    可以使用Properties集合中的方法load,把硬碟中(鍵值對),讀取到集合中使用
    void load(InputStream inStream)
    void load(Reader reader)
    引數:
        InputStream inStream:位元組輸入流,不能讀取含有中文的鍵值對
        Reader reader:字元輸入流,能讀取含有中文的鍵值對
    使用步驟:
        1.建立Properties集合物件
        2.使用Properties集合物件中的方法load讀取儲存鍵值對的檔案
        3.遍歷Properties集合
    注意:
        1.儲存鍵值對的檔案中,鍵與值預設的連線符號可以使用=,空格(或其他符號)
        2.儲存鍵值對的檔案中,可以使用#進行註釋,被註釋的鍵值對不會再被讀取
        3.儲存鍵值對的檔案中,鍵與值預設都是字串,不用再加引號
     */
    private static void show03() throws IOException{
        //1.建立Properties集合物件
        Properties prop = new Properties();
        //2.使用Properties集合物件中的方法load讀取儲存鍵值對的檔案
        prop.load(new FileReader("D:\\environment\\java_project\\javase\\prop.txt"));
        //3.遍歷Properties集合
        Set<String> set = prop.stringPropertyNames();
        for (String key : set) {
            String value = prop.getProperty(key);
            System.out.println(key+"="+value);
        }
    }

    /*
    可以使用Properties集合中的方法store,把集合中的臨時資料,持久化寫入到硬碟中儲存
    void store(OutputStream out, String comments)
    void store(Writer write, String comments)
    引數:
        OutputStream out:位元組輸出流,不能寫中文
        Writer writer:字元輸出流,可以寫中文
        String comments:註釋,用來解釋說明儲存的檔案是做什麼用的
            不能使用中文,會產生亂碼,預設是Unicode編碼
            一般使用""空字串

    使用步驟:
        1.建立Properties集合物件,新增資料
        2.建立位元組輸出流/字元輸出流物件,構造方法中繫結要輸出的目的地
        3.使用Properties集合中的方法store,把集合中的臨時資料,持久化寫入到硬碟中儲存
        4.釋放資源
     */
    private static void show02() throws IOException {
        //1.建立Properties集合物件,新增資料
        Properties prop = new Properties();
        prop.setProperty("趙麗穎","168");
        prop.setProperty("迪麗熱巴","165");
        prop.setProperty("古力娜扎","160");

        //2.建立位元組輸出流/字元輸出流物件,構造方法中繫結要輸出的目的地
        FileWriter fw = new FileWriter("D:\\environment\\java_project\\javase\\prop.txt");

        //3.使用Properties集合中的方法store,把集合中的臨時資料,持久化寫入到硬碟中儲存
        prop.store(fw,"save data");

        //4.釋放資源
        fw.close();

        //字元流可以寫中文,位元組流不能寫中文
        //prop.store(new FileOutputStream("D:\\environment\\java_project\\javase\\prop.txt"),"");//匿名物件使用完後自動關閉

    }

    /*
    使用Properties集合儲存資料,遍歷取出Properties集合中的資料
    Properties集合是一個雙列集合,key和value預設都是字串
    Properties集合有一些操作字串的特有方法
        Object setProperty(String key, String value) 呼叫Hashtable的方法put
        String getProperty(String key) 通過key找到value值,此方法相當於Map集合中的get(key)方法
        Set<String> stringPropertyNames() 返回此屬性列表中的鍵集,其中該鍵及其對應值是字串,此方法相當於Map集合中的keySet方法
     */
    private static void show01() {
        //建立Properties集合物件
        Properties prop = new Properties();
        //使用setProperty往集合中新增資料
        prop.setProperty("趙麗穎","168");
        prop.setProperty("迪麗熱巴","165");
        prop.setProperty("古力娜扎","160");

        //使用stringPropertyNames把Properties集合中的鍵取出,儲存到一個Set集合中
        Set<String> set = prop.stringPropertyNames();

        //遍歷Set集合,取出Properties集合中的每一個鍵
        for (String key : set) {
            //使用getProperty方法通過key獲取value
            String value = prop.getProperty(key);
            System.out.println(key+"="+value);
        }
    }
}

相關文章