索鸟网

  1. 首页
  2. java文件传输基础:字节字符流的转换OutputStreamWriter/InputStreamReader

java文件传输基础:字节字符流的转换OutputStreamWriter/InputStreamReader


字符流
今天我们来讲解一下java文件传输基础中的字符流的操作,首先要对一下几个问题有所了解:
1、编码问题
2、认识文本和文本文件:
java中的文本(char)其实是一个十六位无符号的整数,是字符unicode编码(双字节编码),文件byte byte byte的数据系列。文本文件则是文本(char)序列按照某种编码方案(utf-8 utf-16be gbk)序列化为byte的存储结果
3、字符流(Reader Writer)——操作的是文本,文本文件,默认按照gbk编码解析。字符流一次处理一个字符,字符的底层仍然是基本的字节序列
4、字符流的基本实现InputStreamReader完成byte解析为char流,按照编码解析;OutputStreamWriter提供char流到byte流,按照编码处理
首先我们通过一个程序进行测试:

    public static void main(String[] args) throws IOException {
        FileInputStream in = new FileInputStream("D:\\log_network.txt");
        InputStreamReader isr = new InputStreamReader(in, "utf-8");// 默认项目编码,文件编码
        OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("D:\\log_net.txt"), "utf-8");
        char[] buf = new char[8 * 1024];
        int a;
        // 批量读取从第0个位置放入buf字符数组中的字符
        while ((a = isr.read(buf, 0, buf.length)) != -1) {
            String s = new String(buf, 0, a);
            System.out.println(s);
            osw.write(buf, 0, a);//将数组内容写入文件
            osw.flush();
        }
        osw.close();
        isr.close();
    }

运行结果为文件内容被输出,并且文件内容拷贝成功
       该项目中涉及到的编码问题如下:
       1、java项目的默认编码为GBK,中文机器中的文本文件编码为ANSI(ANSI为为了适应各国语言不同而产生的编码,在中文中,ANSI对应的编码为GBK),因此我们利用项目默认编码按照字符流来读取文本文件是成功的
       2、现我们创建一个UTF-8编码的文本文件,此时用项目默认编码GBK来进行解析会出现乱码现象。因此,我们指定读取文件时的编码方式也为UTF-8,此时同样可以正确读取文件

来源地址:http://blog.csdn.net/mrs_wu/article/details/78230226 版权归作者所有!