黑马程序员————IO流——字符流、缓冲字符流、转化流



------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


IO流——字符流、缓冲字符流、转化流


一、字节流到字符流的转换流


  1.转换流的概述


        1).使用字节流写入文本文件,这个没有问题。对于out.writer(byte[] byteArray)方法,内部使用了"字符集"信息。使用平台默认的字符集。
        2).当程序读取时,就要按照写入的顺序,以及"字节码"数量进行读取,否则就会出现"乱码";
        3).这时,Java将对"文本文件"读写的流,单独分离出来,专门对"文本文件"进行读写。
               这些单独分离出来的流,就是"字符流"。
               字符流的特点:可以指定"编码方式(字符集)"。由于指定了字符集,所以它可以一次读写一个"字符";
        4).以后,我们知道涉及到对"文本文件"进行读写操作,如果需要"显示数据",就考虑使用"字符流"
        5).Java中提供了两种"转换流",可以将"字节流"转换为"字符流":
             转换流:
                 输出流:OutputStreamWriter:
                 输入流:InputStreamReader:


2.string类的编码和解码


 
   编码:


       (1).写入文件时,是编码;
       (2).将文字内容按照某种的"字符集(编码表)"编译成二进制数据,写入到文件中;
       (3).将"看得懂的"变为"看不懂的";
      (4).String的编码方式:将字符串变为字节数组
           String.getBytes();使用平台的默认字符集:GBK
           String.getBytes(Charset charset):指定字符集。
           String.getBytes(String charsetName):指定字符集


   解码:


        (1).从文件中读取内容,并向用户显示出来;
        (2).关键是:向用户显示时,将几个字节的二进制,解码为一个文字;
        (3).按照某种字符集,将相应的二进制,转换为能看得懂的文字;
        (4).将"看不懂的" 转换为 "看得懂的"
        (5).String的解码方式:将字节数组使用构造方法变为字符串
             String(byte[] bytes, String charsetName)
             String(byte[] bytes, int offset, int length, String charsetName)
 

public class Demo {
 public static void main(String[] args) throws UnsupportedEncodingException {
  byte[] byteArray1 = "a".getBytes();
  System.out.println("byteArray1.length = " + byteArray1.length);//1
  byte[] byteArray2 = "ab".getBytes();
  System.out.println("byteArray2.length = " + byteArray2.length);//2
  byte[] byteArray3 = "你".getBytes();
  System.out.println("byteArray3.length = " + byteArray3.length);//2
  byte[] byteArray4 = "你".getBytes("GBK");
  System.out.println("byteArray4.length = " + byteArray4.length);//2
  byte[] byteArray5 = "你".getBytes("UTF-8");
  System.out.println("byteArray5.length = " + byteArray5.length);//3
  
  //将上述的byte数组进行解码
  String s4 = new String(byteArray4);//使用平台默认的
  String s5 = new String(byteArray4,"GBK");
  System.out.println("s4 = " + s4);
  System.out.println("s5 = " + s5);
  
 // String s6 = new String(byteArray5,"GBK");
  String s6 = new String(byteArray5,"UTF-8");//保持跟编码方式一致,才不会乱码;
  System.out.println("s6 = " + s6);//乱码(解码时使用的字符集和编码时使用的不一致)




  3.转换流的输出流
   

A:构造方法:
    

     public OutputStreamWriter(OutputStream out):使用一个字节输出流构造一个转换流
     public OutputStreamWriter(OutputStream out,String charsetName):使用一个字节输出流,和编码方式,构造一个转换流:

B:写入方法(5种方法):


    public void write(int c):写入一个字节;(不常用)
    public void write(char[] cbuf):写入一个字符数组
    public void write(char[] cbuf,int off,int len):写入一个字符数组的一部分
    public void write(String str):直接写入一个字符串(最常用,也最方便)
    public void write(String str,int off,int len):写入字符串的一部分:
 
  4.转换流的输入流


   A:构造方法:


    public InputStreamReader(InputStream in):使用一个字节输入流构造
    public InputStreamReader(InputStream in,String charsetName):使用一个字节输入流,和一个编码方式构造

   B;成员方法


    public int read():读取单个字符
    public int read(char[] cbuf):读取到一个字符数组cbar,返回读取的字符的数量;
     
     

范例:
     char[] charArray = new char[10];
     int len = 0;
     while((len = in2.read(charArray)) != -1){//返回读取的字符数量
      	String s = new String(charArray,0,len);//字符串的构造方法,转化为字符串。
        System.out.println("读取的内容:" + s);


  5.使用字符流复制文本


   一次读取一个字符
   一次读取一个字符数组



二、基本字符流


  A:FileWriter:字符输出流(继承自OutputStreamwrite)


   1.构造方法:


    FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
    FileWriter(File file) 根据给定的 File 对象构造一个 FileWriter 对象。
    FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
    FileWriter(File file, boolean append) :根据给定的 File 对象以及是否追加写入构造一个 FileWriter 对象。

   2.写入的方法:


    没有自有的方法,都是从父类继承的;5种写入的方法:见OutputStreamWriter


  B:Filereader:字符输入流(继承自inputstreamreade)


    FileReader(String fileName) :在给定从中读取数据的文件名的情况下创建一个新 FileReader。
    FileReader(File file) :在给定从中读取数据的 File 的情况下创建一个新 FileReader。
    没有自有的方法,都是从父类继承的;2种读取的方法:见InputStreamReader


三、字符缓冲流


  1.BufferedWriter:字符缓冲输出流。继承自writer


   构造方法:BufferedWriter(Writer out) :创建一个使用默认大小输出缓冲区的缓冲字符输出流
   

    写入的方法:几个write()方法都是使用父类的;
   特有的方法:void newline()输出一个换行。(当然也可以直接书写一个换行符write(\r\n))


  2.BufferedReader:字符串缓冲输入流。继承自Reader


   构造方法:BufferedReader(Reader in) :  创建一个使用默认大小输入缓冲区的缓冲字符输入流
   
   读取方法:继承的方法:public int read()一次读取一个字符
       public int read(char[] charArray)一次读取一个字符数组
   特有的方法:String read()一次读取一行数据
      

String s = null;
      while((s = in.readLine()) != null){
       System.out.println("读一行:" + s);


  


四、总结字节流和字符流


 
 字节流:


 1.类层次结构:


 OutputStream:
     |--FileOutputStream:
     |--FilterOutputStream:(没学)
   	|--BufferedOutputStream:
 InputStream:
     |--FileInputStream:
     |--FilterInputStream:(没学)
   	|--BufferedInputStream:


 2.写入的方法:


  write(int n):写入一个字节:
  write(byte[] byteArray):写入一个字节数组;


 3.读取的方法:


  int read():读取一个字节:
  int read(byte[] byteArray):读取一个字节数组;


 4.字节流可以对:二进制文件和文本文件进行读写。


 5.当读写二进制文件时:首选带缓冲的字节流;
   当读写文本文件时:如果不需要显示,也可以选择字节流。通常
                           使用带缓冲的字符流。

 字符流:


 1.类层次结构:


 

Writer:
    	|--OutputStreamWriter:
    |--FileWriter:
    	|--BufferedWriter:
 Reader:
    	|--InputStreamReader:
    |--FileReader:
    	|--BufferedReader:


 2.写入的方法:


  基本字符流,和缓冲流都具有的:


   write(int n):写入一个字符:
   write(char[] charArray):写入一个字符数组;
   write(char[] charArray,int off,int len):写入字符数组的一部分;
   write(String s):写入一个字符;
   write(String s,int off,int len):写入一个字符串的一部分;


  缓冲流特有的:


      BufferedWriter:
                newLine();
      BufferedReader:
                 String  readLine();


 3.当需要对文本文件进行读写,显示:首选使用带缓冲的字符流;






你可能感兴趣的:(IO流,字符流)