Java中的IO流之字符流Reader和Writer

 更新时间:2023年10月26日 08:47:12   作者:CodeJiao  
这篇文章主要介绍了Java中的IO流之字符流Reader和Writer,Reader : 和InputStream的唯一的区别就在于读的数据单位不同,继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符16bit,需要的朋友可以参考下

1. Reader流

Reader : 和InputStream的唯一的区别就在于读的数据单位不同

继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit)

在这里插入图片描述

16位:一个字符也就是两个字节,使用Reader流读取数据时都是两个字节两个字节往外读的,为什么还要有这两种两个字节的读取方式呢? 因为有些字符是占2个字节的,如我们的中文字符在Java里面就是占两个字节的。如果采用一个字节一个字节往外读的方式,那么读出来的就是半个汉字,这样子Java就没有办法正确的显示中文字符的,所以有必要存在这种流,一个字符一个字符地往外读。

Reader的基本方法:

//读取一个字节并以整数的形式返回(0~255) 
//如果返回-1就说明已经到了输入流的末尾 
int read() throws IOException 

//读取一系列字节并存储到一个数组buffer
//返回实际读取的字节数,如果读取前已到输入流的末尾,则返回-1 
int read(byte[] buffer) throws IOException

//从offset位置开始,读取length个字节 并存储到一个字节数组buffer, 
//返回实际读取的字节数,如果读取前以到输入流的末尾返回-1.
int read(byte[] buffer,int offset,int length) throws IOException

//关闭流释放内存资源 
void close() throws IOException

//跳过n个字节不读,返回实际跳过的字节数 
long skip(long n) throws IOException

2. Writer流

继承自Writer的流都是用于程序中输出数据,且数据的单位为字符(16bit);

在这里插入图片描述

Writer的基本方法:

//向输出流中写入一个字节数据,该字节数据为参数b的低16位 
void write(int b) throws IOException

//将一个字节类型的数组中的数据写入输出流 
void write(byte[] b) throws IOException

//将一个字节类型的数组中的从指定位置(off)开始的len个字节写入到输出流 
void write(byte[] b,int off,int len) throws IOException

//关闭流释放内存资源 
void close() throws IOException

//将输出流中缓冲的数据全部写出到目的地 
void flush() throws IOException

【演示:使用FileWriter(字符流)向指定文件中写入数据】:

在这里插入图片描述

read.txt

Hello Java!
Hello C!
Hello Python!
Hello C#!

write.txt

在这里插入图片描述

Test.java

package character1;

import java.io.FileReader;
import java.io.FileWriter;

/*使用FileWriter(字符流)向指定文件中写入数据写入数据时以1个字符为单位进行写入*/
public class Test {
    public static void main(String[] args) {
        /*使用FileWriter输出流从程序把数据写入到write.txt文件中
        使用FileWriter流向文件写入数据时是一个字符一个字符写入的*/
        try (FileWriter fileWriter = new FileWriter("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\write.txt");
             FileReader fileReader = new FileReader("E:\\IDEACode\\ketangpai\\file-test\\src\\character1\\resource\\read.txt");) {
            /*
             字符的本质是一个无符号的16位整数 
             字符在计算机内部占用2个字节 
             这里使用for循环把0~60000里面的所有整数都输出 
             这里相当于是把全世界各个国家的文字都以0~60000内的整数的形式来表示
             */
            for (int i = 0; i < 60000; i++) {
                /*
                使用write(int c)把0~60000内的整数写入到指定文件内
                调用write()方法时,我认为在执行的过程中应该使用了“(char)c”进行强制 转换,
                即把整数转换成字符来显示
                因为打开写入数据的文件可以看到,里面显示的数据并不是0~60000内的整数,
                而是不同国家的文字的表示方式
                 */
                fileWriter.write(i);
            }
            /*使用FileReader(字符流)读取指定文件里面的内容 读取内容时是以一个字符为单位进行读取的*/
            int b = 0;
            long num = 0;
            while ((b = fileReader.read()) != -1) {
                System.out.print((char) b);
                num++;
            }
            System.out.println();
            System.out.println("总共读取了" + num + "个字符");
        } catch (Exception e) {
//            打印异常信息
            e.printStackTrace();
//            异常退出
            System.exit(-1);
        }
    }
}

在这里插入图片描述

在这里插入图片描述

3. 小结

FileReader和FileWriter这两个流都是字符流,都是以一个字符为单位进行输入和输出的。所以读取和写入占用2个字节的字符时都可以正常地显示出来,以上是以File(文件)这个类型为例对节点流进行了讲解,所谓的节点流指定就是直接把输入流或输出插入到数据源上,直接往数据源里面写入数据或读取数据。

到此这篇关于Java中的IO流之字符流Reader和Writer的文章就介绍到这了,更多相关Java字符流Reader和Writer内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Elasticsearch查询及聚合类DSL语句宝典示例详解

    Elasticsearch查询及聚合类DSL语句宝典示例详解

    这篇文章主要为大家介绍了Elasticsearch查询及聚合类DSL语句宝典示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • SpringBoot 集成JUnit5的详细操作过程

    SpringBoot 集成JUnit5的详细操作过程

    JUnit5是最新的Java单元测试框架,提供了灵活的测试支持,它由JUnit Platform、JUnit Jupiter和JUnit Vintage组成,支持不同环境下的测试运行,SpringBoot从2.2版本开始默认支持JUnit5,本文介绍了SpringBoot 集成JUnit5的相关知识,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • Java多线程知识点全面总结

    Java多线程知识点全面总结

    这篇文章主要介绍了Java多线程知识点全面总结,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-03-03
  • Java单例模式的8种写法(推荐)

    Java单例模式的8种写法(推荐)

    这篇文章主要介绍了Java单例模式的8种写法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • SpringBoot如何进行业务校验实例详解

    SpringBoot如何进行业务校验实例详解

    这篇文章主要给大家介绍了关于SpringBoot如何进行业务校验的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2022-01-01
  • Springboot+redis+Vue实现秒杀的项目实践

    Springboot+redis+Vue实现秒杀的项目实践

    本文主要介绍了Springboot+redis+Vue实现秒杀的项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-08-08
  • Java中的复合数据类型

    Java中的复合数据类型

    这篇文章主要介绍了Java中的复合数据类型,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • RocketMq深入分析讲解两种削峰方式

    RocketMq深入分析讲解两种削峰方式

    当上游调用下游服务速率高于下游服务接口QPS时,那么如果不对调用速率进行控制,那么会发生很多失败请求,通过消息队列的削峰方法有两种,这篇文章主要介绍了RocketMq深入分析讲解两种削峰方式
    2023-01-01
  • java后端如何获取完整url的代码

    java后端如何获取完整url的代码

    这篇文章主要介绍了java后端如何获取完整url的代码问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 一篇文章带你了解Maven的坐标概念以及依赖管理

    一篇文章带你了解Maven的坐标概念以及依赖管理

    这篇文章主要为大家介绍了Maven的坐标概念以及依赖管理,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01

最新评论