黑马程序员_IO流_字符流,转换流

来源:互联网 发布:安卓版r语言软件 编辑:程序博客网 时间:2024/06/02 00:04

           ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IO开发S</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

         IO流学习第二天,有了前一天的基础,今天对字符流,转换流,文件的拷贝操作等有了更深入的理解.

        字符流的抽象父类时Reader和Writer,直接操作文件的子类是FileReader和FileWriter,

        值得注意的是,输入流中记录字符的是int型而不是char型,这是因为换行符是以\r\n或\n存在,如果返回的是字符,那么就会把换行符当做字符读出,不能判断文本的结束.字符流操作文本更简单,每读出一次会根据字符的大小一次操作1-3个字节,字节流读出时一次只读一个字节,这便是字符优于字节的地方.在关流时,close()会自动调用flush()方法,在拷贝多媒体文件时用字符流可能会失败,这是因为在拷贝的过程中,数据以字节的形式存在于硬盘中,要转成字符存入内存,从内存中输出又要将字符转成字节,字节转字符有的1个,有的2个,有些则3个,造成字符转换错误,而无法正常读出.

       为了更深刻的了解字符流读取原理,模仿了一个BufferedReader类.如下:

           public class MyBufferedReader {
        private char[] arr = new char[8192];          //定义一个字符数组做缓存
        private int pos;    
        private int len;              //记录有效数据
        private Reader r;
        public MyBufferedReader(Reader r) {       //对Reader进行包装
        this.r = r;
        }
        public int read() throws IOException {
        if(pos == len){
        len = r.read(arr);
        pos = 0;                         //当读出的数据达到arr.length()-1时,将指针重置为0,进行第二轮的读取
        }
        return len == -1 ? -1 : arr[pos++];               //当读取到结尾时返回-1,未到则继续将记录的数据返回
        }
 
       public String readLine() throws IOException {      //重写readline方法
       StringBuilder sb = new StringBuilder();
       int ch;
       while((ch = read())!= -1) {
      if(ch == '\r') {
      continue;
      }else if(ch == '\n') {
      return sb.toString();
     }else {
      sb.append((char)ch);
                 }
      }
     if(sb.length() > 0) {
     return sb.toString();
        }
    return null;
     }
 
     public void close() throws IOException {
     r.close();
    }
    }

           系统中会有默认的码表读文件,当我们需要制定码表来读写时,就需要用到字符字节流的转化桥梁---InputStreamReader和OutputStreamReader,从后缀名上看,他们属于字符流,将制定的GBK编码文件转成UTF-8文件以事例说明:

       import java.io.BufferedReader;
       import java.io.BufferedWriter;
       import java.io.FileInputStream;
       import java.io.FileNotFoundException;
       import java.io.FileOutputStream;
       import java.io.IOException;
       import java.io.InputStreamReader;
       import java.io.OutputStreamWriter;
       import java.util.Scanner;

        public static void main(String[] args) throws IOException {

      try(

     //通过从里向外的顺序将输入字节流转成输入字符流,指定编码表为GBK
     BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("day20笔记txt","GBK"));
     //通过从里向外的顺序将输出字节流转成输出字符流,制定编码表为UTF-8

     BufferedWriter bw= new BufferedWriter(new OutputStreamWriter(new FileOutputStream("demo.txt"),"UTF-8"));

     ){
     String line;
     while((line=br.readLine())!=null) {    //判断是否读到末尾
     bw.write(line);      

     bw.newLine();      //换行
              }

           }
        }


    }

      注意:转换格式必须提前设置,入上例转成UTF-8的文件必须先新建一个以UTF-8编码的文件,否则转码后会出现乱码.

     ---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------

 

原创粉丝点击