Java中的字符流FileReader与FileWriter详解

 更新时间:2023年10月16日 09:56:35   作者:墨辰JC  
这篇文章主要介绍了Java中的字符流FileReader与FileWriter详解,在Java中,使用Unicode约定存储字符,字符流自动允许我们逐字符读/写数据,有助于执行16位Unicode的输入和输出,它是以reader和writer结尾的,需要的朋友可以参考下

概念

在Java中,使用Unicode约定存储字符。字符流自动允许我们逐字符读/写数据,有助于执行16位Unicode的输入和输出;它是以reader和writer结尾的。

在内部,FileReader使用FileInputStream;

同样,FileWrite使用FileOutputStream,字符流采用Unicode编码。

FileReader字符输入流

Reader :字符输入流,用于读取字符流的抽象超类。

FileReader类从InputStreamReader类继承而来。和文件相关的字符输入流,可用于读取文件数据。创建对象的时候,如果指定的文件不存在,将抛出异常。

在这里插入图片描述

相关方法和构造器

FileReader提供了三个构造器,用于实例化FileReader对象,根据不同的场景进行选择

在这里插入图片描述

  • read():每次读取单个字符,返回该字符,如果到文件末尾返回-1
public int read();
  • read(char[]):批量读取多个字符到数组,返回读取到的字符数,如果到文件末尾返回-1
public int read(char[] cbuf);

演示示例

使用FileReader从E盘下的hello.txt文本读取内容,并显示

  • read():单个字符读取文件(返回实际读取到的字符数)
import org.junit.jupiter.api.Test;
import java.io.FileReader;
import java.io.IOException;

@Test
public void readFile01(){
    String filePath = "E:\\test.txt";
    FileReader fileReader = null;//创建FileReader对象
    int data;
    try {
        fileReader= new FileReader(filePath);
        //循环读取
        while ((data = fileReader.read())!=-1){
            System.out.print((char) data);
        }
    } catch (IOException e) {
        e.getMessage();
    }finally {
        if (fileReader!=null){
            try {
                fileReader.close();//释放内存
            } catch (IOException e) {
                e.getMessage();
            }
        }
    }
}
  • read(Char[] cbuf) 使用字符数组读取文件 这里使用了String的构造器用于将buf转换为字符串

在这里插入图片描述

@Test
public void readFile02() {
    String filePath = "E:\\test.txt";
    FileReader fileReader = null;//创建FileReader对象
    int readLen = 0;
    char[] buf = new char[8];
    try {
        fileReader = new FileReader(filePath);
        //
        while ((readLen = fileReader.read(buf)) != -1) {
            System.out.print(new String(buf, 0, readLen));
        }
    } catch (IOException e) {
        e.getMessage();
    } finally {
        if (fileReader != null) {
            try {
                fileReader.close();//释放内存
            } catch (IOException e) {
                e.getMessage();
            }
        }
    }
}

执行完毕之后,会读取到文本中相应的内容!

FileWriter字符输出流

FileWriter 类从 OutputStreamWriter 类继承而来。该类按字符向流中写入数据。与FileOutputStream基本类似,只是前者是基于字符流后者是基于字节流。

在这里插入图片描述

相关方法和构造器

FileWriter提供了五个构造器,用于实例化FileWriter对象,根据不同的场景进行选择

在这里插入图片描述

  • FileWriter(File file, boolean append);此构造器为追加模式,当append为true时追加到文件的末尾,否则覆盖
  • public void write(int c); 写入单个字符
  • public void write(char[] cbuf); 写入指定数组
  • public void write(char[] cbuf, int off, int len); 写入指定数组指定的部分
  • public void write(String str); 写入整个字符串
  • public void write(String str, int off, int len); 写入字符串的指定部分

注意:FileWriter使用后,必须关闭(close)或刷新(flush),否则写入不到指定的文件(还在内存里面)!

演示示例(使用的是追加构造器)

将文本内容输出到E盘的test.txt文件 这里使用了Stirng类中的toCharArray方法:将字符串转换成字符数组

在这里插入图片描述

import org.junit.jupiter.api.Test;
import java.io.FileWriter;
import java.io.IOException;

@Test
public void WriteFile02() {
    String filePath = "E:\\test.txt";//操作的文件路径
    //创建FileWrite对象
    FileWriter fileWriter = null;
    char[] chars = {'a', 'b', 'c'};
    try {
        fileWriter = new FileWriter(filePath, true);
        fileWriter.write('a');//写入单个字符
        fileWriter.write(chars);//写入指定数组
        fileWriter.write("hello,world".toCharArray(), 0, 5); //写入字符数组的指定部分 写入hello
        fileWriter.write("Java");//写入整个字符串
        fileWriter.write("你好,世界",0,2);//写入字符串的指定部分
    } catch (IOException e) {
        e.getMessage();//输出异常l
    } finally {
        try {
            fileWriter.close();//释放资源
        } catch (IOException e) {
            e.getMessage();
        }
    }
}

此时,上述代码执行之后,test.txt的内容变成:aabchelloJava你好

在数据量大的情况下,可以使用循环操作!

为什么用完不close或flush,会写入不到数据?

当我们在close方法处进行断点进行调试的时候,会发现FileWriter真正写入数据的时候,是在close方法中!

在这里插入图片描述

一直下一步,真正添加数据是在这里

在这里插入图片描述

flush(刷新):方法同理,也会追加到这里

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

相关文章

  • Java synchronized最细讲解

    Java synchronized最细讲解

    synchronized是Java语言的关键字,当它用来修饰一个方法或者一个代码块的时候,能够保证在同一时刻最多只有一个线程执行该段代码。本文给大家介绍java中 synchronized的用法,对本文感兴趣的朋友一起看看吧
    2021-09-09
  • Spring基于AspectJ的AOP开发案例解析

    Spring基于AspectJ的AOP开发案例解析

    这篇文章主要介绍了Spring的基于AspectJ的AOP开发,AspectJ是一个基于Java语言的AOP框架,使用AspectJ需要导入Spring AOP和AspectJ相关jar包,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05
  • SpringBoot接口请求入参和出参增强的五种方法

    SpringBoot接口请求入参和出参增强的五种方法

    这篇文章主要介绍了SpringBoot接口请求入参和出参增强的五种方法,使用`@JsonSerialize`和`@JsonDeserialize`注解,全局配置Jackson的`ObjectMapper`,使用`@ControllerAdvice`配合`@InitBinder`,自定义HttpMessageConverter和使用AOP进行切面编程,需要的朋友可以参考下
    2024-07-07
  • java数据结构基础:栈

    java数据结构基础:栈

    这篇文章主要介绍了Java的数据解构基础,希望对广大的程序爱好者有所帮助,同时祝大家有一个好成绩,需要的朋友可以参考下,希望能给你带来帮助
    2021-07-07
  • Java使用toString方法展示枚举字段信息

    Java使用toString方法展示枚举字段信息

    这篇文章主要为大家详细介绍了如何在Java中通过重写枚举的toString方法来展示枚举实例的字段信息,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-01-01
  • Java中EasyPoi多sheet导出功能实现

    Java中EasyPoi多sheet导出功能实现

    这篇文章主要介绍了Java中EasyPoi多sheet导出功能实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • JAVA中出现异常、抛出异常后续代码是否执行情况详析

    JAVA中出现异常、抛出异常后续代码是否执行情况详析

    当产生异常后,并在异常处理器中进行执行之后,程序会是如何的一种状态,是终止还是继续执行处理之后的代码呢,下面这篇文章主要给大家介绍了关于JAVA中出现异常、抛出异常后续代码是否执行情况的相关资料,需要的朋友可以参考下
    2024-05-05
  • Java工程mybatis实现多表查询过程详解

    Java工程mybatis实现多表查询过程详解

    这篇文章主要介绍了Java工程mybatis实现多表查询过程详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-06-06
  • java中申请不定长度数组ArrayList的方法

    java中申请不定长度数组ArrayList的方法

    今天小编就为大家分享一篇java中申请不定长度数组ArrayList的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • Quartz高可用定时任务的快速上手指南

    Quartz高可用定时任务的快速上手指南

    Quartz的分布式策略就是一种以数据库作为边界资源的并发策略,每个节点都遵守相同的操作规范,使得对数据库的操作可以串行执行,而不同名称的调度器又可以互不影响的并行运行,下面这篇文章主要介绍了Quartz高可用定时任务快速上手的相关资料,需要的朋友可以参考下
    2022-04-04

最新评论