新手必看的IO流操作规律

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ththcc/article/details/86300739
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

/*
 *IO流操作规律:
 *之所以要弄清这个规律,是因为流对象太多,开发时不知道用那个对象合适。
 *想要知道开发时用到哪些对象。只要通过四个明确即可。
 *
 *1、明确源和目的
 *	源:InputStream Reader
 *	目的:OutputStream Writer
 *
 *2、明确数据是否是纯文本数据
 *	源:是:Reader      使用char存储
 *	     否:InputStream 使用byte存储
 *	目的:是: Writer
 *		否:OutputStrema
 *3、明确具体的设备。
 *	源:
 *		硬盘:File
 *		键盘:System.in
 *		内存:数组
 *		网络:Socket流
 *	目的
 *		硬盘:File
 *		键盘:System.in
 *		内存:数组
 *		网络:Socket流
 *4、是否需要其他额外功能。
 *	1、是否需要高效(缓冲区)
 *		是:加上Buffer
 *	2、转换
 */
public class IOOperateDemo {
	public static void main(String[] args) throws IOException {
		/**
		 * 需求一:复制一个文本文件
		 * 1、明确源和目的
		 * 	源: InputStream Reader
		 *  目的:OutputStream Writer
		 * 2、是否是纯文本
		 * 	是!
		 *  源:Reader
		 *  目的:Writer
		 * 3、明确具体设备
		 * 	源:硬盘:File
		 *  目的:硬盘:File
		 * 4、是否需要额外功能
		 * 	需要:Buffer
		 */
		copyTextFile();
		/**
		 * 需求二:读取键盘信息,并写入到一个文件中
		 * 1、明确源和目的
		 * 	源: InputStream Reader
		 *  目的:OutputStream Writer
		 * 2、是否是纯文本
		 * 	是!
		 *  源:Reader
		 *  目的:Writer
		 * 3、明确具体设备
		 * 	源:键盘:System.in
		 *  目的:硬盘:File
		 * 4、是否需要其他额外功能
		 * 	将字节流转换成字符流。因为明确源是Reader,这样操作更便捷
		 *  使用字节-->字符 InputStreamReader
		 */
		readWriteKeyboard();
		/**
		 * 需求三:将一个文本文件数据显示在控制台上。
		 * 1、明确源和目的
		 * 	源: InputStream Reader
		 *  目的:OutputStream Writer
		 * 2、是否是纯文本
		 * 	是!
		 *  源:Reader
		 *  目的:Writer
		 * 3、明确具体设备
		 * 	源:硬盘:
		 *  目的:控制台:System.out
		 * 4、是否需要其他额外功能
		 * 	 需要转换
		 */
		dispalyTextFile();
		/**
		 * 需求四:读取键盘录入数据,显示在控制台上
		 * 1、明确源和目的
		 * 	源: InputStream Reader
		 *  目的:OutputStream Writer
		 * 2、是否是纯文本
		 * 	是!
		 *  源:Reader
		 *  目的:Writer
		 * 3、明确具体设备
		 * 	源:键盘:System.in
		 *  目的:控制台:System.out
		 * 4、是否需要其他额外功能
		 * 	 需要转换,因为都是字节流,但是操作的却是文本数据。
		 * 	 所以使用字符串操作起来更为便捷
		 */
		readKeyboardDisplay();
		/**
		 * 需求五:将一个中文字符串数据按照指定的编码表写入到一个文本文件中
		 * 1、明确源和目的
		 *  目的:OutputStream Writer
		 * 2、是否是纯文本
		 * 	是!
		 *  目的:Writer
		 * 3、明确具体设备
		 *  目的:硬盘:File
		 * 4、是否需要其他额外功能
		 * 	既然需求中已经明确了指定编码表的动作。
		 *	那就不可以使用FileWriter,因为FileWriter内部是使用默认的本地码表。
		 *	只能使用父类 OutputStreamWriter
		 *	OutputStreamWriter接收一个字节输出流对象,既然是操作文件,那么该对象应该是
	 	 *  FileOutputStream
	 	 *  
		 * 	
		 */
		writeChiToTextFile();
		
		/**
		 * 什么时候使用转换流呢?
		 * 1、源或者目的对应的设备师字节流,但是操作的却是文本数据,可以使用转换作为桥梁
		 * 提高对文本操作的便捷。
		 * 2、一旦操作文本涉及到具体的指定编码表时,必须使用转换流
		 */
	}

	public static void writeChiToTextFile() throws IOException {
		String charsetName = "UTF-8";
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\README2.txt"),charsetName);
		BufferedWriter bw = new BufferedWriter(osw);
		bw.write("中文");
		bw.flush();
		bw.close();
		osw.close();
	}

	public static void readKeyboardDisplay() throws IOException {
		System.out.println("请输入:");
		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 ("exit".equals(line))
				break;
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		br.close();
		bw.close();
	}	

	public static void dispalyTextFile() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("D:\\README.txt"));
		BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(System.out));
		String line = null;
		while ((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		br.close();
		bw.close();
	}

	public static void readWriteKeyboard() throws IOException {
		System.out.println("请输入:");
		InputStreamReader isr = new InputStreamReader(System.in);
		BufferedReader br = new BufferedReader(isr);

		FileWriter out = new FileWriter("D:\\README2.txt");
		BufferedWriter bw = new BufferedWriter(out);
		String line = null;
		while ((line = br.readLine()) != null) {
			if ("exit".equals(line))
				break;
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		br.close();
		bw.close();
	}

	public static void copyTextFile() throws IOException {
		FileReader fr = new FileReader("D:\\README.txt");
		BufferedReader br = new BufferedReader(fr);

		FileWriter fw = new FileWriter("D:\\README2.txt");
		BufferedWriter bw = new BufferedWriter(fw);

		String line = null;
		while ((line = br.readLine()) != null) {
			bw.write(line);
		}
		br.close();
		bw.close();
	}
}

猜你喜欢

转载自blog.csdn.net/ththcc/article/details/86300739