一,转换流:
InputStreamReader :字节到字符的桥梁 解码OutputStreamWriter:字符到字节的桥梁 编码
流的操作规律:
之所以要弄清楚这个规律,是因为开发时流对象太多,开发是不知道用哪个对象合适。
想要知道开发时用到哪些对象,只要通过四个明确即可:
1.明确源和目的(汇)四大体系选择
源:InputStream Reader
目的:OutputStream Writer
2.明确数据是否是纯文本数据
源:是纯文本 : Reader
否: InputStream
目的:是纯文本: Writer
否: OutputStream
到这里就可以明确需求中到底要使用那个体系。
3.明确具体的设备
源设备:硬盘:File
键盘 :System.in
内存:数组
网络: Socket流
目的设备:硬盘:File
控制台:System.out
内存:数组
网络 :Socket流
4.是否需要其他额外功能
1.是否需要高效(缓冲区)?
是:加上Buffer
*******************************************************************************
需求1:复制一个文本文件
1.,明确源和目的:
源:InputStream Reader
目的:OutputStream Writer
2.是否纯文本
是:源:Reader
目的:Writer
3.明确具体的设备:
源:硬盘
File
目的:硬盘:
File
FileReader fr=new FileReader("a.txt");
FileWrtiter fw=new FileWriter("a.txt");
4.是否需要额外功能?
需要:需要高效:
BufferedReader bfr=new BufferedReader(new FileReder("a.txt"));
BufferedWriter bfw=new BufferedWriter(new FileWriter("a.txt"));
***********************************************************************************
需求2:读取键盘录入信息,并写入到一个文件中
1.源:InputStream
目的: Writer
2.是否纯文本数据:
是:
源:Reader
目的:Writer
3.设备:
源:
键盘:System.in
目的:
硬盘:File
4.是否有其他需求:
高效:
转换:将字节流转换为字符流,因为明确的源是Reader,这样操作文本数据最便捷
所以要将已有的字节流转成字符流,使用字节>>字符 InputStreamReader
BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw=new BufferedWriter(new FileWriter("a1.txt");
****************************************************************************************
需求3:将一个文本文件显示在控制台上
1.源:InputStream Reader
目的:OutputStream Writer
2.是否是文本数据:
是:
源:reader
目的:Writer
3.设备:
源:
硬盘:File
目的:
控制台:System.out
4.是否需要其他功能:
是:
字符>>字节转换 OutputStreamWriter
高效:buffer
BufferedReader bfr=new BufferedReader(new FileReader("a1.txt"));
BufferdeWriter bfw=new BufferedWriter(new OutputStreamWriter(new System.in));
*********************************************************************************************
需求4:
读取键盘录入的数据,显示到控制台上:
1.明确源和目的:
源:
InputStream reader
目的:
OutputStream Writer
2.是否是纯文本:
是
源:Reader
目的:Writer
3,明确设备:
源:
键盘:
System.in
目的:
控制台:
System.out
4.是否需要其他功能:
转换:字符到字节,字节到字符
高效:buffer
BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
BufferdeWriter bfw=new BufferedWriter(new OutputStreamWriter(System.out));
********************************************************************************************
附上四个需求的代码:
package java_Studing_day47_IO流7;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.Writer;
public class IOregularDemo {
public static void main(String[] args) throws IOException {
function1();
function2();
function3();
function4();
}
private static void function1() throws IOException {
//需求1:复制一个文本文件
BufferedReader bfr=new BufferedReader(new FileReader("a.txt"));
BufferedWriter bfw=new BufferedWriter(new FileWriter("a.txt"));
String line=null;
while ((line=bfr.readLine())!=null){
bfw.write(line);
bfw.flush();
}
bfw.close();
bfr.close();
}
private static void function2() throws IOException {
//需求2:读取键盘录入信息并写入到一个文件中
BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw=new BufferedWriter(new FileWriter("a1.txt"));
String line=null;
while((line=bfr.readLine())!=null){
if("over".equals(line))
break;
bfw.write(line);
bfw.newLine();
bfw.flush();
}
bfw.close();
bfr.close();
}
private static void function3() throws IOException {
//需求3:讲一个文本文件显示在控制台上
BufferedReader bfr=new BufferedReader(new FileReader("a1.txt"));
BufferedWriter bfw=new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while ((line=bfr.readLine())!=null){
bfw.newLine();
bfw.flush();
}
bfw.close();
bfr.close();
}
private static void function4() throws IOException {
// 读取键盘录入的数据,显示到控制台上:
BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bfw=new BufferedWriter(new OutputStreamWriter(System.out));
String line=null;
while((line=bfr.readLine())!=null){
bfw.write(line.toUpperCase());
bfw.newLine();
bfw.flush();
}
bfw.close();
bfr.close();
}}
二;用指定的编码表操作文件
需求5:
将一个中文字符串数据按照指定的编码表写入到一个文本文件中
1.目的:OutputsStream Writer
2.是否纯文本数据
是 Writer
3.设备:
目的:
硬盘:file
FileWriter fw=new FileWriter("a5.txt");
fw.write("你好") //使用系统平台默认的码表,中文win7默认GBK
注意,既然需求中已经明确了指定编码表那就不可以使用fileWriter,因为FileWriter使用的是本地系统默认的编码表
只能使用期父类,OutputStreamWriter
OutputStreamWriter接收一个字节流输出对象,既然是操作文件,那么对象应该是FileOutputStream
BufferedWriter buw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("highspeed.txt"),"utf-8"))
4.是否需要额外功能
高效
*******************************************************************************************************
什么时候使用转换流呢?
1.源或者目的对应的设备是字节流,但是操作的却是文本数据,可以使用转换流作为桥梁
提高文本操作的效率
2.一旦操作文本涉及到具体的指定编码表时,必须使用转换流
附上需求代码:
package java_Studing_day47_IO流7;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
public class TransEncodeDecodeDemo {
public static void main(String[] args) throws IOException {
//writeTxt();
//writeTxt2();
//writeTxt3();
//readTxt1();
//readTxt2();
//指定编码表高效读写
HWriter();
HReader();
}
private static void HReader() throws IOException {
//指定编码表高效读
BufferedReader bfw=new BufferedReader(new InputStreamReader(new FileInputStream("highspeed.txt"),"GBK"));
String str=bfw.readLine();
System.out.println(str);
bfw.close();
}
private static void HWriter() throws IOException, FileNotFoundException {
//指定编码表高效写
BufferedWriter bfw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("highspeed.txt"),"UTF-8"));
bfw.write("我是一个大帅哥大帅哥");
bfw.close();
}
private static void readTxt2() throws IOException, FileNotFoundException {
//用指定编码表UTF-8编写的文件要用指定的编码表UTF-8来读取,否则乱码
InputStreamReader ipsr=new InputStreamReader(new FileInputStream("GBK_1.txt"),"UTF-8");
char buf[]=new char[1024];
int len=ipsr.read(buf);
String str=new String(buf,0,len);
System.out.println(str);
ipsr.close();
}
//用指定编码表UTF-8编写的文件,要用默认编码表GBK来读,会乱码
private static void readTxt1() throws IOException {
FileReader fr=new FileReader("u8_1.txt");//默认系统编码表GBK
char buf[]=new char[1024];
int len=fr.read(buf);
String str=new String(buf,0,len);
System.out.println(str);
fr.close();
}
private static void writeTxt3() throws IOException {
//用指定的编码表UTF-8来编码
OutputStreamWriter opsw=new OutputStreamWriter(new FileOutputStream("u8_1.txt"),"UTF-8");
opsw.write("你好");
opsw.close();
}
private static void writeTxt2() throws IOException {
//用指定的编码表GBK编码,与filereader相同
OutputStreamWriter opsw=new OutputStreamWriter(new FileOutputStream("GBK_2.txt"),"GBK");
//FileWriter fw=new FileWriter("GBK_1.txt");
/**
* 这两句代码其实是等同的
* FileWriter:其实就是转换流制定了本机默认密码表的体现,而且这个转换流的子类对象,可以方便操作文本文件
* 简单说:操作文件的字节流+本机默认的编码表
* 这是按照默认码表来操作文件的便捷类
*
* 如果操作文本文件,需要明确具体的编码,FileWriter就不行了,必须用转换流,
*/
opsw.write("你好");
opsw.close();
}
private static void writeTxt() throws IOException {
//FileWriter默认使用系统编码表,GBK
FileWriter fw=new FileWriter("GBK_1.txt");
fw.write("你好");
fw.close();
}
}