字符流和字符流的使用

1.什么是字符流:

(1) 字符流是以字符为单位读取文件中的数据
​ (2) 字符流更加适合操作字符文件(如:txt,java,properties)
​ (3) 文本文件是有编码方式的,常用的编码集:
           (1) ISO-8859-1:西方编码,不支持中文
           (2) GBK:中国标准编码,支持简体中文,也支持繁体中文
           (3) GB2312:中国标准编码,只支持简体中文
           (4) UTF-8:国际编码,支持全球所有国家的语言
           (5) Unicode:Java使用的编码
           (6) ANSI:表示使用平台编码(GBK|GB2312)
​ (4) 文本文件是有编码的,在使用IO操作文本文件时必须考虑编码问题,编码不同中文就会出现乱码
​ (5) 在使用IO流操作文件时,需要进行编码转换,因为Java所使用的编码和文本文件的编码是不对应
           (1) 将Java的Unicode编码转换为文本文件的编码,我们称为解码
           (2) 将文本文件的编码转换为Java的Unicode编码,我们称为编码
​ (6) Java默认使用UTF-8编码进行编码或解码(转换)

2.字节流到字符流的桥接流(InputStreamReader,OutputStreamWriter)

 (1) 将字节转换字符的一个转换流
​ (2) 字节到字符的桥接流使用更加灵活,它可以根据需要设置编码集
​ (3) 在使用时可以通过InputStreamReader设置外部文件以指定的编码方式转换为Java的Unicode编码
​ (4)在使用时可以通过OutputStreamWriter设置Java的Unicode编码以指定的编码方式转换为外部文件的内容

3.字符流的使用

( 1) 字符流是字节到字符转换流的简洁实现
​ (2) 字符流将转换时所使用的编码固定了,如果和外部文件的编码不一致则会出现乱码,此时需要使用字节到字符的转换流进行处理
​ (3) 字符流有两个抽象类Reader和Writer,我们在使用时使用他们的子类FileReader,FileWriter
​ (4) FileWriter使用UTF-8编码将Java的Unicode编码转换为外部文件编码,如果外部文件编码使用的不是UTF-8则会出现乱码
​ (5) FileReader使用UTF-8编码将外部文件的字符转换Java的Unicode编码,如果外部文件编码使用的不是UTF-8则会出现乱码

4.带有缓冲区的字符流(包装流)

 (1) BufferedReader带有缓冲区的字符输入流和BufferedWriter带有缓冲区的字符输出流
​ (2) 带有缓冲区的字符流中提供很方便的操作字符文件的方法(推荐使用)
​ (3) BufferedReader的方法:
           readLine():读取一行字符数据,读到换行符结束
​ (4) BufferedWriter的方法:
           (1) write(String str):输出一行数据但不换行
           (2) newLine():输出一个换行符

案例

1.字符流的使用
package io.字符流;

import java.io.*;

public class 字符流的使用 {
    public static void main(String[] args) throws IOException {
        readerDemo();
    }
    /**
     * 字符输出流
     */
    public static void writerDemo() throws IOException {
        //创建字符输出流对象,FileWriter使用UTF-8编码,如果外部文件的编码不是UTF-8就会出现乱码
        Writer writer = new FileWriter("f:/abc.txt",true);
        writer.write("字符输出流能看明白吗?");
        writer.close();
    }

    /**
     * 字符输入流
     */
    public static void readerDemo() throws IOException {
        //创建字符输入流对象
        Reader reader = new FileReader("f:/abc.txt");
        char[] cs = new char[1024];
        //将外部文件的字符读入到字符数组中,返回实际读取的字符数
        int len = reader.read(cs);
        //将字符数组转换为字符串
        String str = String.valueOf(cs,0,len);
        System.out.println(str);
        reader.close();
    }
}
2.带有缓冲区的字符流
package io.字符流;

import java.io.*;

public class 带有缓冲区的字符流 {
    public static void main(String[] args) throws IOException {
        bufferedWriter();
    }

    /**
     * 带有缓冲区的字符输出流
     */
    public static void bufferedWriter() throws IOException {
        //创建带有缓冲区的字符输出流
        BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("f:/abc.txt",true),"GBK"));
        //输出一个字符串
        bufferedWriter.write("带有缓冲区的字符输出流!");
        //输出换行符
        bufferedWriter.newLine();
        bufferedWriter.write("字符流结束,能明白多少呢?");
        bufferedWriter.close();

    }
    /**
     * 带有缓冲区的输入流
     */
    public static void bufferedReader() throws IOException {
        //创建带有缓冲区的输入流对象
        //BufferedReader bufferedReader = new BufferedReader(new FileReader("f:/abc.txt"));
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("f:/mysql5.7解压缩安装.txt"),"GBK"));
        //一次读取一行数据,返回字符串
        /*String str = bufferedReader.readLine();
        System.out.println(str);*/
        //循环读取文件的内容
        String str = null;
        while((str = bufferedReader.readLine())!=null){
            System.out.println(str);
        }
        bufferedReader.close();
    }
}
3.字节到字符桥节流的使用
package io.字符流;

import java.io.*;

public class 字节到字符桥节流的使用 {
    public static void main(String[] args) throws IOException {
        inputStreamReaderDemo();
    }

    /**
     * 字节到字符输入流
     */
    public static void inputStreamReaderDemo() throws IOException {
        InputStream inputStream = new FileInputStream("f:/abc.txt");
        //在字节到字符转换流中可以设置转换的编码集,此时外部文件的内容会以此处设置的编码转换为Java的Unicode编码
        InputStreamReader reader = new InputStreamReader(inputStream,"GBK");
        //Java默认使用UTF-8编码将文件中的内容转换Java的Unicode编码
        char[] cs = new char[1024];
        int len = reader.read(cs);
        String str = String.valueOf(cs,0,len);
        System.out.println(str);
        reader.close();
    }
    /**
     * 字节到字符的输出流
     */
    public static void outputStreamWriterDemo() throws IOException {
        //创建字节输出流对象
        OutputStream outputStream = new FileOutputStream("f:/abc.txt",true);
        /**
         *  使用字节输出流对象创建字节到字符的转换流对象
         *  默认使用UTF-8编码向文件中写出内容
         *  可以使用字节到字符的输出流设置向文件中写出内容时的编码集
         */


        OutputStreamWriter writer = new OutputStreamWriter(outputStream,"GBK");
        writer.write("你好,吃了吗?");
        writer.close();
    }
}
4.使用字节流读取文本文件
package io.字符流;

import java.io.*;

/**
 * 字节输入流实例-将磁盘上文件中的数据读入到程序中
 */
public class 使用字节流读取文本文件 {
    public static void main(String[] args) throws IOException {
        /**
         *  创建输入流对象,并指定要读取的文件
         */

        InputStream inputStream = new FileInputStream("f:/mysql5.7解压缩安装.txt");
        OutputStream outputStream = new FileOutputStream("f:/abc.txt",true);
        //解码,将Java的Unicode编码转换外部文件的编码(GBK)
        outputStream.write("你好".getBytes("GBK"));

        outputStream.close();
        //读取一个字节,该字节为一个整数
        /*int num = inputStream.read();*/
        //声明一个用于存储读取字节的缓冲区(字节数组)
       // byte[] buf = new byte[1024];
        /**
         * 读取数据,读取缓冲区指定大小的数据
         * 返回实际读取字节的数量(长度),如果未读取到数据则返回-1
         */
        //int len = - 1;
        //循环读取文件中的数据,当len的值为-1时表示读取结束
        /*while((len=inputStream.read(buf,0,buf.length))!=-1){
            *//**
             * 将字节数组中的字节转换字符串
             * 指定转换的起始下标,及转换长度
             *
             * 此处的意思是将GBK的文件转换JavaUnicode编码
             *//*

            String str = new String(buf,0,len,"GBK");

            System.out.println(str);
        }*/


        inputStream.close();//关闭输入流

    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值