缓冲输入流是开发之中经常会使用到的一个工具类,其目的是解决数据的乱码问题。现在最直观的解决方式就是System.in所带来的问题。
如果要进行中文数据的处理,想到的一定是字符流,要想完整的处理数据,一定想到缓冲区。支持缓冲区操作的有两种流:
字符缓冲区流:BufferedReader,BufferedWriter:
字节缓冲区流:BufferedInputStream.BufferedOutputStream
最为重要的就是BufferedReader类,因为其提供有一个重要的提取方法(重点)
public String readLine()
读取一行数据,以分隔符(换行为界),返回了String。可以用正则验证,可以转为任何类型。
下面继续来观察一下BufferedReader类的继承结构和构造方法:
java.lang.Object
java.io.Reader
java.io.BufferedReader
构造方法:public BufferedReader(Reader in)
但是如果要想BufferedReader类来处理System.in的操作就比较麻烦了 因为System.in是InputStream类型。在之前学习过一个类:InputStreamReader.
范例:键盘数据输入的标准格式
public static void main(String[] args) throws Exception{
//System.in是InputStream类的对象
//BufferedReader需要接收Reader类的构造
//利用InputStreamReader将字节流变为字符流
BufferedReader buf=new BufferedReader(new InputStreamReader(System.in));
System.out.println("请输入数据:");
String str=buf.readLine();//以回车作为换行
System.out.println("输入的内容:"+str);
}
此时的输入数据长度没有限制,并且得到的还是String型数据,那么这样就可以实现键盘输入数据操作了,不过这种操作一般意义不大。
一直强调使用BufferedReader是因为它可以实现字符串数据的接收,所以现在可以进行正则判断:
判断:正则判断输入:
public static void main(String[] args) throws Exception{
//System.in是InputStream类的对象
//BufferedReader需要接收Reader类的构造
//利用InputStreamReader将字节流变为字符流
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("年龄输入错误,应该由数字组成");
}
}
}
正是因为此处可以利用正则进行操作验证,所以在开发之中,只要能够接收的类型是String,那么是最方便的。
除了可以接收输入信息之外,也可以利用缓冲区读取进行文件的读取。
public static void main(String[] args) throws Exception{
File file=new File("E:"+File.separator+"my.txt");
BufferedReader buf=new BufferedReader(new FileReader(file));
String str=null;
while((str=buf.readLine())!=null){//利用缓存输入流可以读取返回String的特性
System.out.println(str);
}
buf.close();
}
与直接使用InputStream(Reader)类相比,使用BufferedReader在进行文件信息读取的时候会更加方便(仅文件,二进制不推荐)
总结
读取数据不再直接使用InputStream(BufferedReader),就好比输出不再直接使用OutputStream一样(PrintStream)。
网友评论