读取键盘录入
System.out:对应的是标准输出设备,控制台
System.in:对应的是标准输入设备,键盘
演示:
需求:通过键盘录入数据,当录入一行数据后,就将该行数据进行打印,如果录入的数据是over,那么停止录入。
public class ReadIn {
public static void main(String[] args) {
//获取键盘录入对象
InputStream in=System.in;
StringBuffer sb=new StringBuffer();//创建可变长度的容器,存储输入的数据
while(true){
try {
int b=in.read();//读取键盘录入的数据
if(b=='\r')//判断一行数据是否录入结束
continue;
if(b=='\n')
{
String s=sb.toString();//将容器中的数据,转换成字符串
if("over".equals(s))//判断程序是否结束
break;
System.out.println(s.toUpperCase());//将字符串中的字符都转换成大写打印
sb.delete(0,sb.length());//清空容器中的数据
}else{
sb.append((char)b);//向容器中添加数据
}
} catch (IOException e) {
e.printStackTrace();
}
}
字符转换流:
通过练习,键盘录入一行数据并打印其大写,发现其实就是读一行数据的原理,也就是readLine方法。
能不能直接使用readLine方法来完成键盘录入的一行数据的读取呢?
readLine方法是BufferedReader类中的方法,而键盘录入read方法是字节流InputStream的方法。
那么能不能将字节流转换成字符流再使用字符流缓冲区的readLine方法?这就涉及到了流的转换
InputStreamReader:是字节流通向字符流的桥梁,它使用指定的charset读取字节并将其解码为字符,
每次调用InputStreamReader中的一个read()方法都会导致从底层输入流读取一个或多个字节。
演示:
public class ReadIn {
public static void main(String[] args) {//获取键盘录入对象
InputStream in=System.in;
//将字节流对象转换成字符流,使用转换流
InputStreamReader isr=new InputStreamReader(in);
//为了提高效率,使用缓冲技术操作字符串,使用BufferedReader
BufferedReader buf=new BufferedReader(isr);
String line=null;//存放从缓冲区中读取的一行数据
try {
while((line=buf.readLine())!=null){
if("over".equals(line))
break;
System.out.println(line.toUpperCase());
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(buf!=null)
try {
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
写入转换流:
OutputStreamWriter:字符流通向字节流的桥梁,为了获得最高效率,考虑将OutputStreamWriter包装到BufferedWriter中,以避免频繁调用转换器,
例如:Writer out=new BufferedWriter(new OutputStreamWriter(System.out));
程序演示:
public class ReadIn {
public static void main(String[] args) {//获取键盘录入对象
InputStream in=System.in;
//将字节流对象转换成字符流,使用转换流
InputStreamReader isr=new InputStreamReader(in);
//为了提高效率,使用缓冲技术操作字符串,使用BufferedReader
BufferedReader buf=new BufferedReader(isr);
//获取输出对象
OutputStream out=System.out;
//将字符转换成字节的对象,使用写入转换流
OutputStreamWriter osw=new OutputStreamWriter(out);
//为了提高效率,使用写入缓冲技术
BufferedWriter buw=new BufferedWriter(osw);
String line=null;//存放从缓冲区中读取的一行数据
try {
while((line=buf.readLine())!=null){
if("over".equals(line))
break;
buw.write(line);//输出数据buw.newLine();//产生新的一行
buw.flush();//刷新
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(buf!=null)
try {
buf.close();
} catch (IOException e) {
e.printStackTrace();
}
if(buw!=null)
try {
buw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}