7.緩衝輸入字符流BufferedReader與緩衝輸出字符流BufferedWriter

1. 緩衝輸入字符流 BufferedReader

- - - - | Reader 所有輸入字符流的基類。 抽象類

- - - - - - - - | FileReader 讀取文件字符串的輸入字符流。

- - - - - - - - | BufferedReader 緩衝輸入字符流。緩衝輸入字符流出現的目的是爲了提高讀取文件的效率和拓展了FileReader的功能。  其實該類內部也是維護了一個字符數組

 

記住:緩衝流都不具備讀寫文件的能力。

 

1.2 BufferedReader 的使用案例

readLine():一次讀取一行數據,不能讀\r\n

package buffer;

import java.io.*;

public class Dome1 {
    // 程序入口main方法
    public static void main(String[] args) {
        File file = new File("E:\\aa\\bb\\Demo1.java");
        // 使用字節寫的readLine()方法讀取文件數據
        testMyReadLine(file);
        System.out.println();
        // 使用BufferedReader讀取文件數據
        testBufferReader1(file);

    }

    //測試BufferedReader類
    public static void testBufferReader1(File file) {
        // 2.搭建通道
        FileReader fileReader = null;
        BufferedReader bufferedReader = null;
        try {
            fileReader = new FileReader(file);//搭建硬盤與內存之間傳輸數據的通道
            bufferedReader = new BufferedReader(fileReader);//緩衝類不具備讀寫能力

            // 3.讀取數據
            String context = null;// 用來存儲讀取到的數據
            while ((context = bufferedReader.readLine()) != null) {// readLine每次讀一行,但是不讀\r和\n
                System.out.println(context);
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                bufferedReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    //測試自己寫的readLine()方法
    public static void testMyReadLine(File file) {
        FileReader fileReader = null;
        try {
            fileReader = new FileReader(file);
            String s = null;//存儲讀取到的字符串
            while ((s = myReadLine(fileReader)) != null) {
                System.out.println(s);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } finally {
            try {
                // 關閉資源
                fileReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }

    // 自己寫一個readLine()方法
    public static String myReadLine(FileReader fileReader) {
        StringBuilder stringBuilder = new StringBuilder();//存儲一行數據
        int len = 0;//存儲每次讀取的數據
        try {
            // 循環對讀取的字節進行判斷,如果是普通字節,則追加到stringBuilder中,如果是\r 則重新讀取,如果是\n則結束讀取,並返回之前讀取的所有字節組成的字符串
            while (((len = fileReader.read()) != -1)) {
                if (len == '\r') {//如果讀到的是\r,重新讀取下一個字節
                    continue;
                } else if (len == '\n') {//如果讀到的是\n,結束循環
                    break;
                } else {
                    stringBuilder.append((char) len);//如果讀取到普通字節,放入字符串中
                }
            }
            if (len == -1) {
                return null;//如果讀取結果是-1,表示沒有讀取到任何數據,返回null值
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } //資源交給調用者去關閉,否則會發生java.io.IOException: Stream closed
        return stringBuilder.toString();//返回讀取到的\n之前的字符串(也就是一行字符串)
    }
}

 

2. 緩衝輸出字符流BufferedWriter

- - - - | Writer所有輸出字符流的基類,抽象類。

- - - - - - - - | FileWriter 向文件輸出字符數據的輸出字符流。

- - - - - - - - | BufferedWriter 緩衝輸出字符流。緩衝輸出字符流作用: 提高FileWriter的寫數據效率與拓展FileWriter的功能。

BufferedWriter內部只不過是提供了一個8192長度的字符數組作爲緩衝區而已,拓展了FileWriter的功能。

BufferedWriter提供了一個可以指定數組長度的構造方法。

Writer內部維護了一個1024字節長度的數組作爲緩衝區,FileWriter繼承了Writer類,所以FileWriter相當於內部也維護了一個1024數組的緩衝區。

 

2.2BufferedWriter案例

public class Dome2 {
    public static void main(String[] args) {
        // 1.指定目標文件
        File file = new File("E:\\aa\\bb\\BufferedWriter.txt");
        // 2.搭建通道
        FileWriter fileWriter = null;
        BufferedWriter bufferedWriter = null;
        try {
            fileWriter = new FileWriter(file);
            bufferedWriter = new BufferedWriter(fileWriter);

            // 3.傳輸數據
            String content = "大家好!!";//向硬盤文件輸出的數據
            bufferedWriter.write(content);// 向硬盤文件輸出數據
            bufferedWriter.newLine();// newLine()的作用就是向文件輸出一個 \r\n,即輸出一個換行符。
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            // 關閉資源
            try {
                bufferedWriter.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

 

3. 使用緩衝字符模擬軟件登錄

package buffer;

import java.io.*;
import java.util.Scanner;

public class SimulationLogin {
    public static void main(String[] args) {
        File file = new File("E:\\aa\\bb\\user.txt");

        while (true) {
            System.out.println("歡迎使用模擬登錄系統...");
            System.out.println("請選擇:A 註冊    B 登陸    C 退出");
            Scanner scanner = new Scanner(System.in);
            String option = scanner.next();
            if ("a".equalsIgnoreCase(option)) {
                // 註冊
                reg();
            } else if ("b".equalsIgnoreCase(option)) {
                // 登錄
                login();
            } else if ("c".equalsIgnoreCase(option)) {
                // 退出
                System.out.println("成功退出模擬登陸系統...");
                return;
            } else {
                System.out.println("輸入有誤,請重新輸入...");
            }
        }
    }




    //註冊功能
    public static void reg() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入用戶名:");
        String username = scanner.next();// 用戶名
        String password = null;//密碼
        String user = null;//用戶信息

        File file = new File("E:\\aa\\bb\\user.txt");//找到目標文件
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;

        try {
            // 搭建數據傳輸通道
            bufferedReader = new BufferedReader(new FileReader(file));//讀取數據對象
            bufferedWriter = new BufferedWriter(new FileWriter(file, true));//輸出數據對象
            boolean isEsixt = false;//判斷用戶名是否存在的標識

            String content = null;//用於存儲讀取的數據
            // 判斷用戶名是否已存在
            while ((content = bufferedReader.readLine()) != null) {//讀取一行數據
                String[] s = content.split(" ");//根據空格將讀取的數據進行切分
                if (username.equals(s[0])) {//判斷讀取的用戶名與註冊用戶名是否相同
                    isEsixt = true;
                    break;
                }
            }
            if (isEsixt) {// 存在提示重新註冊
                System.out.println("註冊失敗,用戶名已存在,請重新輸入新的用戶名...");
                isEsixt = false;
            } else {// 不存在,提示用戶註冊成功,並將數據寫入到硬盤文件中

                System.out.print("請輸入密碼:");
                password = scanner.next();// 密碼
                user = username + " " + password;//用戶名與密碼

                bufferedWriter.write(user);//將數據寫入硬盤文件
                bufferedWriter.newLine();//換行
                System.out.println("用戶註冊成功...");
                System.out.println("用戶信息:[username = " + username + ", password = " + password + "]");
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                // 釋放資源
                bufferedWriter.close();
                bufferedReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }





    //登錄功能
    public static void login() {
        Scanner scanner = new Scanner(System.in);
        System.out.print("請輸入用戶名:");
        String username = scanner.next();// 用戶名
        System.out.print("請輸入密碼:");
        String password = scanner.next();// 密碼
        String userInfo = username + " " + password;// 用戶信息

        File file = new File("E:\\aa\\bb\\user.txt");//找到目標文件
        BufferedReader bufferedReader = null;

        boolean isExist = false;//用於標記用戶是否存在的標識,默認不存在

        try {
            // 搭建數據通道
            bufferedReader = new BufferedReader(new FileReader(file));
            String user = null;// 用戶存儲從文件中讀取的數據
            // 讀取文件數據,查詢用戶是否存在
            while ((user = bufferedReader.readLine()) != null) {
                if (userInfo.equals(user)) {
                    isExist = true;
                    break;
                }
            }

            //判斷用戶是否存在
            if (isExist) {
                String[] s = user.split(" ");
                System.out.println("歡迎用戶 " + s[0] + " 成功登錄模擬登錄系統...");
            } else {
                System.out.println("用戶名或密碼不正確,請確認後重新輸入...");
            }
        } catch (FileNotFoundException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                // 釋放資源
                bufferedReader.close();
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
    }
}

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章