IO流--读取键盘录入(流转换和流的操作规律)

/*
字符流:
FileReader extends InputStreamReader
FileWriter extends OutputStreamWriter

BufferedReader
BufferedWriter


字节流:
FileInputStream
FileOutputStream

BufferedInputStream
BufferedOutputStream


---------InputStreamReader-------字节流通向字符流的桥梁。


---------OutputStreamWriter------字符流通向字节流的桥梁。

需求:读取键盘录入。
System.out:对应的是标准的输出设备(控制台)。
System.in:对应标准输入设备(键盘)。

通过键盘录入数据。
当录入一行数据后,就将改行数据进行打印。
如果录入的数据时over,就停止录入。



通过刚才的键盘录入一行数据并打印其大写,发现其实就是读一行数据的原理,
也就是readLine()方法。
能不能直接使用readLine()方法来完成键盘录入的一行数据的读取呢?

问题在于,readLine()方法是字符流BufferedReader类中的方法。
而键盘录入的read方法是字节流InputStream的方法。
那么能不能将字节流转成字符流再使用字符流缓冲区的readLine()方法呢?




1.读取键盘录入。
源:键盘录入。
目的:控制台。

2.键盘录入的数据存储到文件中。
源:键盘录入。
目的:文件。

3.想要将一个文件的数据打印到控制台。
源:文件。
目的:控制台。



流操作的基本规律:
最痛苦的就是流对象有很多,不知道该用哪个。

通过两个明确来完成。
1.明确源和目的。
	源:输入流。InputStream	   Reader
	目的:输出流。OutputStream	  Writer
2.明确操作的数据是否是纯文本。
	是:字符流。
	不是:字节流。
3.当体系明确后,在明确要使用哪个具体的对象。
	通过设备来进行区分。
	源设备:内存,硬盘,键盘。
	目的设备:内存,硬盘,控制台。


--------------------------------分析如下:
1.需求:将一个文本文件中的数据存储到另一个文件(复制文件)。
	源:因为是源,所以使用读取流。InputStream  Reader。
	是不是操作文本文件?
	是!这时就可以选择Reader。
	这样体系就明确了。

	接下来明确要使用该体系中的哪个对象。
	明确设备:硬盘上的一个文件。
	Reader体系中可以操作文件的对象是FileReader。
	FileReader fr = new FileReader("a.txt");
	是否需要提高效率?
	是!加入Reader体系中的缓冲区 BufferedReader。
	BufferedReader br = new BufferedReader(fr);



	目的:OutputStream  Writer。
	是否是纯文本。
	是!Writer。
	设备:硬盘上的一个文件。	
	Writer体系中可以操作文件的对象是FileWriter。
	FileWriter fw = new FileWriter("b.txt");
	是否需要提高效率?
	是!加入Writer体系中的缓冲区 BufferedWriter
	BufferedWriter bw = new BufferedWriter(fw);

2.需求:将键盘录入的数据保存到一个文件中。
	源:InputStream	Reader
	是不是纯文本?
	是!Reader

	设备:键盘。对应的对象是System.in。
	不是选择Reader吗?System.in对应的不是字节流吗?
	为了操作键盘的文本数据方便,转成字符流按照字符串操作是最方便的。
	所以既然明确了Reader,那么就将System.in转换成Reader。
	用了Reader体系中的转换流。InputSteamReader
	InputStreamReader isr = new InputStreamReader(System.in);
	需要提高效率吗?需要!BufferedReader
	BufferedReader br = new BufferedReader(isr);

	目的:OutputStream Writer
	是否是纯文本?
	是!Writer。
	设备:硬盘上的一个文件。FileWriter
	FileWriter fw = new FileWriter("a.txt");
	需要提高效率吗?
	需要!BufferedWriter bw = new BufferedWriter(fw);
	
	*********
	扩展:想要把录入的数据按照指定的编码表(utf-8),将数据存到文件中。

	目的:OutputStream Writer
	是否是纯文本?
	是!Writer。
	设备:硬盘上的一个文件。FileWriter
	但是FileWriter是使用的默认编码表。GBK。

	但是存储时,要加入指定码表,而指定码表只有转换流可以指定。
	所以要使用的对象是OutputStreamWriter。
	而该转换流对象要接收一个字节输出流,而且还可以操作文件的字节输出流。FileOutputStream
	
	OutputStreamWriter osw = new OutputStreamWriter(
		new FileOutputStream("a.txt"),"UTF-8");
	需要提高效率吗?
	需要!BufferedWriter bw = new BufferedWriter(osw);

	所以,记住。转换流什么时候使用?
	字符和字节之间的桥梁通常涉及到字符编码转换时需要用到转换流。
	


*/
import java.io.*;
class ReadIn{
	public static void main(String[] args) {
		InputStream in = null;
		try{
			InputStream in = System.in;
			
			StringBuilder sb = StringBuilder();

			while(true){
				int ch = in.read();
				if(ch == '\r')
					continue;
				if(ch == '\n'){
					String s = sb.toString();
					if("over".equals(s))
						break;
					System.out.println(s.toUpperCase());
					sb.delete(0,sb.length());//清空缓冲区
				}
				sb.append(char(ch));
			}
		}catch (IOException){
			System.out.println(e.toString());
		}
	}
}
/*---------------------------------------------------*/
/*
1.读取键盘录入。
源:键盘录入。
目的:控制台。
*/
import java.io.*;
class TransStreamDemo{
	public static void main(String[] args) {
		/*
		//获取键盘录入对象。
		InputStream in = System.in;

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

		//为了提高效率,将字符串进行缓冲区技术高效操作。使用BufferedReader
		BufferedReader br = new BufferedReader(isr);
		*/
		
		//简化书写,键盘录入的最常见写法。
		BufferedReader br = new BufferedReader(
				new InputStreamReader(System.in));

		String line = null;
		while((line = br.readLine()) != null){
			if("over".equals(line))
				break;
			System.out.println(s.toUpperCase());
		}
		br.close();
	}
}
/*---------------------------------------------------*/
/*
1.读取键盘录入。
源:键盘录入。
目的:控制台。
*/
import java.io.*;
class TransStreamDemo{
	public static void main(String[] args) {
		/*
		OutputStream out = System.out;

		OutputStreamWriter osw = new OutputStreamWriter(out);

		BufferedWriter bw = new BufferedWriter(osw);
		*/
		//源
		BufferedReader br = new BufferedReader(
				new InputStreamReader(System.in));
		//目的
		BufferedWriter bw = new BufferedWriter(
				new OutputStreamWriter(System.out));

		String line = null;
		while((line = br.readLine()) != null){
			if("over".equals(line))
				break;
			bw.write(line.toUpperCase());
			bw.flush();
		}
		bw.close();
	}
}
/*---------------------------------------------------*/
/*
2.键盘录入的数据存储到文件中。
源:键盘录入。
目的:文件。
*/
import java.io.*;
class TransStreamDemo{
	public static void main(String[] args) {
		/*
		OutputStream out = System.out;

		OutputStreamWriter osw = new OutputStreamWriter(out);

		BufferedWriter bw = new BufferedWriter(osw);
		*/
		//源
		BufferedReader br = new BufferedReader(
				new InputStreamReader(System.in));
		//目的
		BufferedWriter bw = new BufferedWriter(
				new OutputStreamWriter(new FileOutputStream("out.txt")));
		
		String line = null;
		while((line = br.readLine()) != null){
			if("over".equals(line))
				break;
			bw.write(line.toUpperCase());
			bw.flush();
		}
		bw.close();
	}
}
/*
3.想要将一个文件的数据打印到控制台。
源:文件。
目的:控制台。
*/
import java.io.*;
class TransStreamDemo{
	public static void main(String[] args) {
		/*
		OutputStream out = System.out;

		OutputStreamWriter osw = new OutputStreamWriter(out);

		BufferedWriter bw = new BufferedWriter(osw);
		*/
		//源
		BufferedReader br = new BufferedReader(new 
				FileInputStream("out.txt"));
		//目的
		BufferedWriter bw = new BufferedWriter(new 
				OutputStreamWriter(System.out));
		
		String line = null;
		while((line = br.readLine()) != null){
			if("over".equals(line))
				break;
			bw.write(line.toUpperCase());
			bw.flush();
		}
		bw.close();
	}
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值