Java-IO流(字符流)

为什么会出现字符流

  • 字符流的介绍

    由于字节流操作中文不是特别的方便,可能会出现乱码的情况,所以Java就提供字符流。

  • 1.1 什么是字符流

    字符流是可以直接读写字符的IO流
    使用字符流从文件中读取字符时, 需要先读取到字节数据, 然后转为字符.
    使用字符流往文件写入字符时, 需要把字符转为字节再写入文件.

    1.2 字符流有两大派

    Reader和Writer,这两个类是抽象类,一般使用它们的子类
    FileReader和FileWrite

    FileReader的使用
    FileReader 用于读取字符,调用read方法的时候,是读取一个字符
    read方法的返回值是int,它是把char 转成int
    以后读纯文本文件,使用FileReader这个类
     

  • 字符流
    尽管Java中字节流的功能十分强大,几乎可以直接或间接地处理任何类型的输入/输出操作,但利用它却不能直接操作 16 位的 Unicode 字符。这就要用到字符流。其实字节流和字符流的方法大致一样,区别在于使用字节流时,每个文字或者是字母看作是一个字节,但是在字节流中,文字占三个字节。

字节流和字符流的其他区别:

字节流一般用来处理图像、视频、音频、PPT、Word等类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,但不能处理图像视频等非文本文件。用一句话说就是:字节流可以处理一切文件,而字符流只能处理纯文本文件。

字节流本身没有缓冲区,缓冲字节流相对于字节流,效率提升非常高。而字符流本身就带有缓冲区,缓冲字符流相对于字符流效率提升就不是那么大了。

字符流操作的对象是字符及字符数组,而字节流操作的对象则是字节及字节数组。

输入流——Reader

Reader 是Java的IO库提供的另一个输入流接口。 和 InputStream 的区别是, InputStream 是一个字节流,即以 byte 为单位读取,而 Reader 是一个字符流,即以 char 为单位读取

FileReader

Reader使用时需要用其子类FileReader类来创建对象

File f1 = new File("D:/a.txt"); 
Reader in = new FileReader(f1);

代码示例:

 public static void main(String[] args) throws IOException {
        File f1=new File("D:/a.txt");

        //定义字符输入流:字节流汉字占三个,字符流中汉字占一个字符
        Reader in=new FileReader(f1);

        //每次读取缓冲区
        char[] buffer=new char[8];
        int n=in.read(buffer); //每次至多读取数组长度个字符,把读取到字符存入数组中,返回的是实际            读取的字符数
        String s=new String(buffer,0,n);  //截取数组,从第0个索引,截取读取有效字符数长度
        System.out.println(s);

        int n1=in.read(buffer);
        String s1=new String(buffer ,0,n1);
        System.out.println(s1);

        //关闭资源
        in.close();

    }

 运行结果:

输出流——Writer

Writer是Java的IO库提供的另一个输出流接口,和 OutputStream 的区别是, OutputStream 是一个字节流,即以 byte 为单位读取,而 Writer是一个字符流,即以 char 为单位读取

 FileWriter的使用

FileWriter是Writer的子类,用来完成Writer对象的创建

        //文件对象
        File f1 = new File("D:/a.txt");
        //创建Writer对象
        Writer out = new FileWriter(f1);

 代码示例:

package Test01;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;

public class WriterTest09 {
    public static void main(String[] args) throws IOException {
        File f1=new File("D:/b.txt");
        if (!f1.exists()){
            f1.createNewFile();
        }
        //定义字符输出流
        Writer out=new FileWriter(f1);

        out.write(97);
        out.write((int) '我');

        char[] ch={'移','动','开','发'};
        out.write(ch,0,4);

        out.write("河南郑州");
        out.flush(); //字符流必须刷新缓冲,才会真正写入磁盘文件中
        out.close();
    }
}

运行结果:

 

综合案例

对含有汉字的文件完成复制操作

package IO;
 
import java.io.*;
 
public class CopyTest03 {
    public static void main(String[] args) throws IOException {
         //创建复制和目标文件对象
        File f1 = new File("D:/a.txt");
        File f2 = new File("D:/b.txt");
        //创建读对象
        Reader in = new FileReader(f1);
        //创建写对象
        Writer out = new FileWriter(f2);
        //缓冲区
        char[] chars = new char[10];
        //初始化
        int n;
        //读取数据
        while ((n=in.read(chars)) !=-1){
            //数据的写入
            out.write(chars,0,n);
        }
        //资源释放
        out.close();
        in.close();
    }
}

运行结果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值