javaday47_IO流_转换流的规律,指定编码表

一,转换流:

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();
    }


}



猜你喜欢

转载自blog.csdn.net/weixin_38023579/article/details/70342003