Java IO流(六)(字符流FileReader和FileWriter)

news2024/11/30 0:35:31

  • 字符流

字符流的底层其实就是字节流

字符流=字节流+字符集

特点

输入流:一次读一个字节,遇到中文时,一次读多个字节

使用场景

对于纯文本文件进行读写操作

  1. FileReader类

①创建字符输入流对象

构造方法

说明

public FileReader(File file)

创建字符输入流关联本地文件

public FileReader(String pathname)

创建字符输入流关联本地文件

如果文件不存在,则直接报错。

②读取数据

成员方法

说明

public int read()

读取数据,读到末尾返回-1

public int read(char[] buffer)

读取多个数据,读到末尾返回-1

细节1:按字节进行读取。遇到中文,一次读多个字节,读取后解码,返回一个整数。

细节2:读到文件末尾了,read方法返回-1。

③释放资源

成员方法

说明

public int close()

释放资源/关流

一次读取一个字符:

import java.io.FileReader;
import java.io.IOException;

public class FileReadDemo1 {
    public static void main(String[] args) throws IOException {
        // 文件
        FileReader fr = new FileReader("text/a.txt");
        // read()细节:
        // 1.read():默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个
        // 2.在读取之后,方法的底层还会进行解码并转成十进制。
        // 最终把这个十进制作为返回值
        // 这个十进制的数据也表示在字符集上的数字
        // 英文:文件里面二进制数据01100001
        //      read方法进行读取,解码并转成十进制97
        // 中文:文件里面的二进制数据111001101011000110001001
        //      read方法进行读取,解码并转成十进制27721
        // 我想看到中文汉字,就是把这些十进制数据,再进行强转就可以了

        // 缓存区,一次读取10个字符
        char[] buffer = new char[20];
        // 循环读取
        for (int r = fr.read(buffer); r != -1; r = fr.read(buffer)){
            System.out.print(new String(buffer, 0, r));
        }

        // 关闭资源
        fr.close();
    }
}

读取到缓冲数组中:

import java.io.FileReader;
import java.io.IOException;
import java.nio.charset.StandardCharsets;

public class FileReadDemo2 {
    public static void main(String[] args) throws IOException {
        // 文件
        FileReader fr = new FileReader("text/a.txt", StandardCharsets.UTF_8);
        // read(chars):读取数据,解码,强转三步合并了,
        // 把强转之后的字符放到数组当中
        // 空参的read +强转类型转换
        for (int r = fr.read(); r != -1; r = fr.read()){
            System.out.println((char) r);
        }
        // 关闭资源
        fr.close();
    }
}

  1. FileWriter类

  1. 构造方法

构造方法

说明

public Filewriter(File file)

创建字符输出流关联本地文件

public Filewriter(String pathname)

创建字符输出流关联本地文件

public Filewriter(File file,boolean append)

创建字符输出流关联本地文件,续写

public Filewriter(String pathname, boolean append)

创建字符输出流关联本地文件,续写

  1. 成员方法

成员方法

说明

void write(int c)

写出一个字符

void write(String str)

写出一个字符串

void write(String str,int off,int len)

写出一个字符串的一部分

void write(char[] cbuf)

写出一个字符数组

void write(char[] cbuf,int off,int len)

写出字符数组的一部分

  1. FileWriter书写细节

①创建字符输出流对象

细节1:参数是字符串表示的路径或者File对象都是可以的

细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的

细节3:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关

②写数据

细节:如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符

③释放资源

细节:每次使用完流之后都要释放资源

import java.io.FileWriter;
import java.io.IOException;

public class WriterDemo1 {
    public static void main(String[] args) throws IOException {
        /* 字节流输出方式
        // 1 文件输出流
        FileOutputStream fos = new FileOutputStream("text/b.txt", true);
        // 2 获取数组
        byte[] bytes = "\n续写内容".getBytes();
        fos.write(bytes);
        // 3 关闭资源
        fos.close();
         */

        // 1.创建文件写出对象
        FileWriter fw = new FileWriter("text/b.txt", true);
        // 2.写出字符
        //fw.write(97);   // 输出一个字符a
        //fw.write("\nFileWriter续写的内容");    // 输出字符串
        fw.write("\nFileWriter续写的内容", 0, 11);   // 输出部分String内容


        // 3.续写内容
        fw.close();
    }
}

  • 字符流原理解析
  1. 字符输入流原理

①创建字符输入流对象

底层:关联文件,并创建缓冲区(长度为8192的字节数组)

②读取数据

底层:

1.判断缓冲区中是否有数据可以读取

2.缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区如果文件中也没有数据了,返回-1

3.缓冲区有数据:就从缓冲区中读取。

  1. 空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回
  2. 有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中

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

public class CharStreamDemo1 {
    public static void main(String[] args) throws IOException {

        // 读取器
        FileReader fr = new FileReader("files\\a.txt");
        fr.read();

        // 写出器
        // 本Writer会清空文件的内容
        FileWriter fw = new FileWriter("files\\a.txt");

        // 这里使用fr进行读取
        // 是否还会取到数据?
        // 答案是可以,因为缓冲区中有8192字节的数据。
        // 当缓冲区中数据读取完毕后,无法再读取文件中的内容了。
        int ch;
        while ((ch = fr.read()) != -1){
            System.out.println((char) ch);
        }

        // 关闭资源
        fr.close();
        fw.close();
    }
}

  1. 字符输出流原理

字符输出流也会创建一个8192字节的缓冲区,输出数据先是往缓冲区内写入数据,有3种情况下会将缓冲区中的数据输出到文件中:

  1. 缓冲区满
  2. 调用flush方法
  3. 调用close方法关闭流时
  • flush和close方法

成员方法

说明

public void flush()

将缓冲区中的数据,刷新到本地文件中

public void close()

释放资源/关流

  1. flush刷新:刷新之后,还可以继续往文件中写出数据
  2. close关流:断开通道,无法再往文件中写出数据

  • 字节流和字符流的使用场景

字节流

拷贝任意类型的文件

字符流

读取纯文本文件中的数据

往纯文本文件中写出数据

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1299797.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Configuring environment||ROS2环境配置

Goal: This tutorial will show you how to prepare your ROS 2 environment. Tutorial level: Beginner Time: 5 minutes ROS 2 relies on the notion (concept)of combining workspaces using the shell environment. “Workspace” is a ROS term …

读书笔记:《股票量化交易的七个策略》

从长远来看,基本面最重要;从短期来看,价格和情绪最重要。在别人贪婪时恐惧,在别人恐惧时贪婪。 相对强弱指数策略【趋势反转】 相对强弱指数(Relative Strength Index,RSI) RSI的取值范围在0到…

亚马逊云科技re_Invent 2023产品体验:亚马逊云科技产品应用实践 国赛选手带你看Elasticache Serverless

抛砖引玉 讲一下作者背景,曾经参加过国内世界技能大赛云计算的选拔,那么在竞赛中包含两类,一类是架构类竞赛,另一类就是TroubleShooting竞赛,对应的分别为AWS GameDay和AWS Jam,想必也有朋友玩过此类竞赛&…

【C++】输入输出流 ⑥ ( cout 标准输出流对象 | cout 常用 api 简介 | cout.put(char c) 函数 )

文章目录 一、cout 标准输出流对象1、cout 标准输出流对象简介2、cout 常用 api 简介 二、cout.put(char c) 函数1、cout.put(char c) 函数 简介2、代码示例 - cout.put(char c) 函数 一、cout 标准输出流对象 1、cout 标准输出流对象简介 cout 是 标准输出流 对象 , 是 ostrea…

Redis的概念与常见命令

🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风…

新版Spring Security6.2架构 (一)

Spring Security 新版springboot 3.2已经集成Spring Security 6.2,和以前会有一些变化,本文主要针对官网的文档进行一些个人翻译和个人理解,不对地方请指正。 整体架构 Spring Security的Servlet 支持是基于Servelet过滤器,如下…

永磁同步电机反电动势系数怎么算?磁链强度怎么算?转矩系数怎么算?

在进行永磁同步电机simulink仿真时,一个关键参数就是永磁体磁链强度, 实际上在simulink中,永磁体磁链强度/反电动势系数/转矩系数这三个是放一起的,这是因为他们都可互相算出来。 Torque constat (Nm/A) 转矩系数 1.5 * Np *…

Java 匿名内部类使用的外部变量,为什么一定要加 final?

问题描述 Effectively final Java 1.8 新特性,对于一个局部变量或方法参数,如果他的值在初始化后就从未更改,那么该变量就是 effectively final(事实 final)。 这种情况下,可以不用加 final 关键字修饰。 …

计算机设备管理器如何看内存,怎么查看电脑配置信息?3种方法,让你掌握电脑全部信息!...

转载:https://blog.csdn.net/weixin_35849957/article/details/118512756?spm1001.2014.3001.5502 原标题:怎么查看电脑配置信息?3种方法,让你掌握电脑全部信息! 电脑的配置决定了电脑性能高低以及运行速度。而电脑…

Ubuntu22.04 LTS + CUDA12.3 + CUDNN8.9.7 + PyTorch2.1.1

简介 本文记录Ubuntu22.04长期支持版系统下的CUDA驱动和cuDNN神经网络加速库的安装,并安装PyTorch2.1.1来测试是否安装成功。 安装Ubuntu系统 如果是旧的不支持UEFI启动的主板,请参考本人博客U盘系统盘制作与系统安装(详细图解&#xff09…

深度学习基础介绍

定义: 深度学习是机器学习领域中一个新的研究方向,被引入机器学习使其更接近于最初的目标,即人工智能AI, Artifical Intelligence。 深度学习是学习样本数据的内在规律和表示层次,这些学习过程中获得的信息对诸如文字…

Docker网络架构介绍

本文主要介绍了Docker容器的单机网络架构与集群网络架构,辅以演示,并简单介绍了网络管理中的命令。 前文: Docker的安装与简单操作命令-CSDN博客 docker网络原理介绍 与ovs类似,docker容器采用veth-pair linux bridge (虚拟交…

CPU设计——Triumphcore——MP_work版本

该版本用作系统寄存器的实现,M/S/U状态的实现与切换,以及load/store的虚实地址转换 设计指标 2023.12.8 2023.12.9 不实现mideleg和medeleg,因此一旦出现异常,直接切换至M态, 调试记录 到存储区中取PTE要额外至少…

hive 命令行中使用 replace 和nvl2 函数报错

1.有时候在命令行的情况下使用 replace 函数时会报错 这个时候可以使用 translate 代替 2.有时候使用 nvl2() 函数的时候会报错 这个时候可以用 case when 来代替

IO / day06 作业

1.使用有名管道&#xff0c;完成两个进程的相互通信 代码&#xff1a; // 使用有名管道&#xff0c;完成两个进程的相互通信#include <myhead.h>// task sender void *tasks(void *arg) {printf("I am tasks\n");int fdw -1;const char **ppargv (const c…

Redis核心知识点总结

1.Redis介绍 Redis 是 NoSQL&#xff0c;但是可处理 1 秒 10w 的并发&#xff08;数据都在内存中&#xff09; 使用 java 对 redis 进行操作类似 jdbc 接口标准对 mysql&#xff0c;有各类实现他的实现类&#xff0c;我们常用的是 druid 其中对 redis&#xff0c;我们通常用 J…

链表面试题的总结和思路分享

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好&#xff0c;我是xiaoxie.希望你看完之后,有不足之处请多多谅解&#xff0c;让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

Vite4、Vue3、Axios 针对请求模块化封装搭配自动化导入(简单易用)

针对请求模块化封装搭配自动化导入&#xff08;简单易用&#xff09; 目标目录目标代码前提步入正题src / utils / index.jssrc /api / index.jssrc /api / request.jssrc /api / service.jssrc /api / utils.jssrc /api / modules / demo.js 自动化配置vite.config.jseslint 校…

《PySpark大数据分析实战》-01.关于数据

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

VSCode安装与使用

VS Code 安装及使用 1、下载 进入VS Code官网&#xff1a;地址&#xff0c;点击 DownLoad for Windows下载windows版本 注&#xff1a; Stable&#xff1a;稳定版Insiders&#xff1a;内测版 2、安装 双击安装包&#xff0c;选择我同意此协议&#xff0c;再点击下一步 选择你…