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