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);
}
}
}
}