版权声明:本文为博主原创文章,未经博主允许不得转载。 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();
}
}