字符缓冲流:BufferedReader
在开始前先让我们来看一段代码
package Project.Study.IOSystem;
import java.io.InputStream;
public class Test4 {
public static void main(String[]args)throws Exception{
InputStream inputStream=System.in;
StringBuffer buf=new StringBuffer(); //接收输入数据
System.out.println("请输入数据:");
int temp=0; //每次读取数据的长度
while ((temp=inputStream.read())!=-1){ //判断是否有输入数据
if (temp=='\n'){ //判断是否有回车符
break;
}
buf.append((char)temp); //保存读取数据
}
System.out.println("输入数据为:"+buf); //输出数据
}
}
//结果:
//请输入数据:
//你好 世界
//输入数据为:ä½ å¥½ 世界
当我们输入中文的时候,我们可以看到,其输出结果是一段乱码,这是因为在读取的的时候是一个字节一个字节读取的,这就将原本占两个字节的中文编码拆分成了两半,从而导致输出乱码。
为了可以进行完整的数据输入操作,最好的做法就是采用缓冲区的方式对输入的数据进行暂存,而后程序可以利用输入流一次性读取内容,这样就可以避免输入中文时的读取错乱问题。
我们可以利用以下两种操作流来使用缓冲区进行数据操作
- 字符缓冲区流:BufferedReader、BufferedWriter;
- 字节缓冲区流:BufferedInputStream、BufferedOutputStream。
以上的4个操作类中,最为重要的就是BufferedReader类,它是Reader的子类,属于字符缓冲输入流,它的常用方法如下所示:
No. | 方法 | 类型 | 描述 |
1 | public BufferedReader(Reader in) | 构造 | 设置字符输入流 |
2 | public String readLine() throws IOException | 普通 | 读取一行数据,默认以"\n"为分隔符 |
例:键盘输入的标准格式
package Project.Study.BufferedReader;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Test1 {
public static void main(String[]args)throws Exception{
//System.in是InputStream类对象,BufferReader的构造方法里面需要接收Reader类对象
//利用InputStreamReader将字节流对象变为字符流对象
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入数据:");
String str = buf.readLine(); //以回车作为换行
System.out.println("输出的内容:"+str);
}
}
//结果:
//请输入数据:
//你好 世界!!!
//输出的内容:你好 世界!!!
例:判断输入内容
package Project.Study.BufferedReader;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Test2 {
public static void main(String[]args)throws Exception{
BufferedReader buf = new BufferedReader(new InputStreamReader(System.in));
boolean flag = true;
while (flag){ //判断标志位
System.out.println("请输入年龄:"); //提示信息
String str = buf.readLine(); //以回车作为换行
if (str.matches("\\d{1,3}")){//输入信息由数字组成
System.out.println("年龄是:"+Integer.parseInt(str));
flag = false; //输入正确,退出循环
} else{
System.out.println("年龄输入错误。");
}
}
}
}
//结果:
//请输入年龄:
//www
//年龄输入错误。
//请输入年龄:
//1000
//年龄输入错误。
//请输入年龄:
//100
//年龄是:100
其实字符缓冲流除了可以接收输入信息外,也可以利用缓冲区进行文件的读取,此时只需要在实例化BufferedReader类对象时传递FileReader类(实际上也可以使用FileInputStream,但是依然需要InputStreamReader转换)。
例:读取文件
package Project.Study.BufferedReader;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class Test3{
public static void main(String[]args)throws Exception{
File file = new File("d:"+File.separator+"Test"+File.separator+"test3.txt");
//使用文件输入流实例化BufferedReader类对象
BufferedReader buf = new BufferedReader(new FileReader(file));
String str = null; //接收输入对象
while((str = buf.readLine())!=null){ //读取数据并判断是否存在
System.out.println(str); //输出读取内容
}
buf.close();
}
}
//结果:
//姓名:小关爱吃汉堡,年龄:19,成绩:99.999990