JAVA中IO流 (读取键盘录入的详细讲解)以及InputStreamReader,OutputStreamWriter,setIn,setOut 讲解

java中键盘的录入

System.out: 对应的是标准输出设备,控制台
System.in: 对应的标准输入设备:键盘


初级录入

代码

import java.io.*;
public class ReadIn
{
	public static void main(String[] args)throws IOException
	{
		InputStream in=System.in;
		int by=in.read();
		System.out.println(by);
	}
}

结果

在这里插入图片描述

这里输出97是因为我们是Int 型


这时,我们多输出几个看看

代码

import java.io.*;
public class ReadIn
{
	public static void main(String[] args)throws IOException
	{
		InputStream in=System.in;
		int by1=in.read();
		int by2=in.read();
		int by3=in.read();
		System.out.println(by1);
		System.out.println(by2);
		System.out.println(by3);
	}
}

结果

在这里插入图片描述

上次我讲到 一个回车就是\r\n 这样子
而这里的13就是\r 10就是\n


上述的录入过于低效率,所以我们进行改进

需求
1.通过键盘录入数据
2.当录入一行数据后,就将该行数据进行打印
3.如果录入的数据是over,那么就停止录入

import java.io.*;
public class ReadIn
{
	public static void main(String[] args)throws IOException
	{
		InputStream in=System.in;
		int ch=0;
		while((ch=in.read())!=-1)
		{
			System.out.println(ch);
		}
	}
}


结果

在这里插入图片描述
此程序可以连续键盘写入,但是却不能停下来 ,需要用Ctrl +C 才可以退出


我们再次进行改进,一次性输出

import java.io.*;
public class ReadIn
{
	public static void main(String[] args)throws IOException
	{
		InputStream in=System.in;
		StringBuilder sb=new StringBuilder();
		
		while(true)
		{
			int ch=in.read();
			if(ch=='\r')
				continue;//继续循环
			if(ch=='\n')
			{
				String s=sb.toString();
				if("over".equals(s))
					break;//如果over,跳出循环
				System.out.println(s.toUpperCase());//我们这里为了区分键盘的写入和输出 就让输出表示为大写
			}
			else
				sb.append((char)ch);//继续等待键盘的录入
		}
	}
}

结果

在这里插入图片描述

到这里我们发现,我们的程序好像并没有实现它的全部功能,而且后面录入的字符会和前面的记忆字符一起被打印称为大写输出,输入over 后也不能退出的现象。


这里我们必须说明,这是因为我们没有将上一次录入的缓冲区的内容进行清除的原因。

利用delete 语句进行清除

import java.io.*;
public class ReadIn
{
	public static void main(String[] args)throws IOException
	{
		InputStream in=System.in;
		StringBuilder sb=new StringBuilder();
		
		while(true)
		{
			int ch=in.read();
			if(ch=='\r')
				continue;//继续循环
			if(ch=='\n')
			{
				String s=sb.toString();
				if("over".equals(s))
					break;//如果over,跳出循环
				System.out.println(s.toUpperCase());//我们这里为了区分键盘的写入和输出 就让输出表示为大写
				sb.delete(0,sb.length());//清除缓冲区中所有的内容
			}
			else
				sb.append((char)ch);//继续等待键盘的录入
		}
	}
}

结果

在这里插入图片描述


我们发现read() 读取似乎并不是最优化的方法,这时我们想到了字符流中的读取方式readLine()

通过刚才的键盘录入一行的数据并且打印其的大写,发现其实就是读取一行的数据的原理。也就是readLine方法。

所以,我们能不能直接使用readLine()方法啦进行完成键盘的录入的一行数据的读取呢?

readLine方法是字符流BufferedReader 类中的方法
而键盘录入的read方法是字节流InputStream 的方法

怎么能不能将字节流转换成字符流在使用的字符流的readLine方法呢?

InputStreamReader 是字节流通向字符流的桥梁

用法: InputStreamReader(ImputStream in)

import java.io.*;
public class TranStreamDemo
{
	public static void main(String[] args)throws IOException
	{
		//获取键盘录入的对象
		InputStream in=System.in;

		//提高字节流对象转成字符流对象,使用转换流。
		InputStreamReader isr=new InputStreamReader(in);

		//为了提高效率,将字符串进行缓冲区技术高效的操作
		BufferedReader bufr=new BufferedReader(isr);

		String line=null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			System.out.println(line.toUpperCase());
		}
			bufr.close();
	}
}

结果

在这里插入图片描述


说完了InputStreamReader 我们来说说OutputStreamWriter ,它是字符流通往字节流的桥梁

import java.io.*;
public class TranStreamDemo
{
	public static void main(String[] args)throws IOException
	{
		//获取键盘录入的对象
		InputStream in=System.in;

		//提高字节流对象转成字符流对象,使用转换流。
		InputStreamReader isr=new InputStreamReader(in);

		//为了提高效率,将字符串进行缓冲区技术高效的操作
		BufferedReader bufr=new BufferedReader(isr);
         

      //获取控制台的打印对象
		OutputStream out=System.out;
		
		//将输出的字节流转换为字符流
		OutputStreamWriter osw=new OutputStreamWriter(out);
		
		//为了提高效率,将字符串进行缓冲区技术高效的操作
		BufferedWriter bufw=new BufferedWriter(osw); 

		String line=null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());//前面用到了 System.out后已经将打印的句子封装在了bufw中,所以只需要用则句话即可。
			bufw.newLine();
			bufw.flush();
		}
			bufr.close();
	}
}

结果

在这里插入图片描述


改进,我们可以将前三步合并为一步,这一步在今后的学习中重要

		//获取键盘录入的对象
		InputStream in=System.in;

		//提高字节流对象转成字符流对象,使用转换流。
		InputStreamReader isr=new InputStreamReader(in);

		//为了提高效率,将字符串进行缓冲区技术高效的操作
		BufferedReader bufr=new BufferedReader(isr);

      就可以看作为一句话
    
    	BufferedReader bufr=(new BufferedReader(new InputStreamReader(System.in)));

==================================================================================

     //获取控制台的打印对象
		OutputStream out=System.out;
		
		//将输出的字节流转换为字符流
		OutputStreamWriter osw=new OutputStreamWriter(out);
		
		//为了提高效率,将字符串进行缓冲区技术高效的操作
		BufferedWriter bufw=new BufferedWriter(osw); 

		也是一样
BufferedWriter bufw=(new BufferedWriter(new OutputStreamWriter(System.out)));

代码

import java.io.*;
public class TranStreamDemo
{
	public static void main(String[] args)throws IOException
	{
		/*获取键盘录入的对象
		InputStream in=System.in;

		//提高字节流对象转成字符流对象,使用转换流。
		InputStreamReader isr=new InputStreamReader(in);

		//为了提高效率,将字符串进行缓冲区技术高效的操作
		BufferedReader bufr=new BufferedReader(isr);
         */
		
		//化简为一句话
		BufferedReader bufr=(new BufferedReader(new InputStreamReader(System.in)));
 

        /*
		OutputStream out=System.out;
		OutputStreamWriter osw=new OutputStreamWriter(out);
		BufferedWriter bufw=new BufferedWriter(osw); 
		*/
	    
		BufferedWriter bufw=(new BufferedWriter(new OutputStreamWriter(System.out)));

		String line=null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());//前面用到了 System.out后已经将打印的句子封装在了bufw中,所以只需要用则句话即可。
			bufw.newLine();
			bufw.flush();
		}
			bufr.close();
	}
}

结果

在这里插入图片描述

注意

BufferedWriter bufw=(new BufferedWriter(new OutputStreamWriter(System.out)));

这句话在我们之后,只要一出现键盘的录入,我们就要记得。很重要。


小知识(IO流中更改标准输出和输入的设备)

代码

首先是 setIn

import java.io.*;
public class TranStreamDemo
{
	public static void main(String[] args)throws IOException
	{    

		///改变它的输出源
		System.setIn(new FileInputStream("quyuquan1996.txt"));
     
        //其实下面都没有用。大家不用看下面
		BufferedReader bufr=(new BufferedReader(new InputStreamReader(System.in)));
 

		BufferedWriter bufw=(new BufferedWriter(new OutputStreamWriter(System.out)));

		String line=null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush();
		}
			bufr.close();
	}
}

结果

在这里插入图片描述

在这里插入图片描述

直接将 目标文件的数据 读出

再看 setOut

import java.io.*;
public class TranStreamDemo
{
	public static void main(String[] args)throws IOException
	{    

		///改变它的输出源
		
		//System.setIn(new FileInputStream("quyuquan1996.txt"));
		System.setOut(new PrintStream("prinTln.txt"));
		BufferedReader bufr=(new BufferedReader(new InputStreamReader(System.in)));
 

		BufferedWriter bufw=(new BufferedWriter(new OutputStreamWriter(System.out)));

		String line=null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush();
		}
			bufr.close();
	}
}

结果

在这里插入图片描述


好 ,我们继续 ,将setIn 和setOut 一起出现看看会是个什么样子的情况。

import java.io.*;
public class TranStreamDemo
{
	public static void main(String[] args)throws IOException
	{    

		///改变它的输出源
		
		System.setIn(new FileInputStream("quyuquan1996.txt"));
		System.setOut(new PrintStream("prinTln.txt"));

		//这样 又不关下面的事情了
		BufferedReader bufr=(new BufferedReader(new InputStreamReader(System.in)));
 

		BufferedWriter bufw=(new BufferedWriter(new OutputStreamWriter(System.out)));

		String line=null;
		while((line=bufr.readLine())!=null)
		{
			if("over".equals(line))
				break;
			bufw.write(line.toUpperCase());
			bufw.newLine();
			bufw.flush();
		}
			bufr.close();
	}
}

结果

在这里插入图片描述

在这里,我们就利用 System 中的setIn 和setOut 完成了一个复制文件的功能。

猜你喜欢

转载自blog.csdn.net/quyuquan2014/article/details/82902917