Java的输入和输出处理(二)字符篇

回顾

昨天我们学习了对文件进行字节的输入(InputStream)和字节的输出(OutputStream)。今天进行扩展,是在昨天的基础上处理的,相比于字符上的处理,我们工作更习惯于使用字节。

使用字符流读写文本文件

字符输入Reader类

常用方法
可以使用Markdown表格来列举Java中Reader类的常用方法。下面是一个示例:

方法描述
int read()读取单个字符并返回其Unicode值,如果到达流的末尾,则返回-1。
int read(char[] c)将字符读入数组c,并返回读取的字符数。如果到达流的末尾,则返回-1。
int read(char[] c, int off, int len)将字符读入数组cbuf的指定部分,并返回读取的字符数。如果到达流的末尾,则返回-1。
long skip(long n)跳过n个字符,并返回实际跳过的字符数。
boolean ready()判断是否可以从流中读取字符,返回true表示可以读取,false表示不可读取。
void close()关闭流并释放与之关联的所有系统资源。

请注意:Reader基类、Writer基类与InputStream、OutputStream基类一样都是抽象类,不可以被实例化,都是由其子类实例化

Reader类的子类InputStreamReader

常用的构造方法:
InputStreamReader(InputStream in)
InputStreamReader(InputStream in,String charsetName)

charseName是字符编码的意思
在这里插入图片描述

InputStreamReader的子类FileReader类

FileReader类只可以按照本地平台的字符编码来读取数据,用户不可以指定其他的字符编码类型

获得本地平台的字符编码类型
System.out.println(System.getProperty(file.encoding))
常用方法:
可以使用Markdown表格来列举Java中FileReader类的常用方法。下面是一个示例:

方法描述
int read()读取单个字符并返回其Unicode值,如果到达流的末尾,则返回-1。
int read(char[] cbuf)将字符读入数组cbuf,并返回读取的字符数。如果到达流的末尾,则返回-1。
int read(char[] cbuf, int off, int len)将字符读入数组cbuf的指定部分,并返回读取的字符数。如果到达流的末尾,则返回-1。
long skip(long n)跳过n个字符,并返回实际跳过的字符数。
boolean ready()判断是否可以从流中读取字符,返回true表示可以读取,false表示不可读取。
void close()关闭流并释放与之关联的所有系统资源。

构造方法

  • FileReader(File file)
  • FileReader(String name)

BufferedReader类

用来提高字符流读取文本文件的效率
常用的构造方法
BufferedReader(Reader in)
在这里插入图片描述
举例:

package 面向对象.文件的输入与输出;

import java.io.*;

public class 字符流输入 {
    public static void main(String[] args) {
        try {
            // 调用测试方法
//            testreader1();
            testreader2();
//            testreaderBuff();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void testreader1() {
        //FileReader子类 继承 InputStreamReader父类 继承 Reader基类
        // 创建字符输入流对象
        Reader reader = null;
        try {
            // 创建FileReader对象,指定文件路径
            reader = new FileReader("C:\\Java\\a.txt");
            int data;
            while ((data = reader.read()) != -1) {
                // 将读取到的字符转换为char并打印输出
                System.out.println((char) data);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void testreader2() {
        // 创建字符输入流对象
        Reader reader = null;
        FileInputStream fis = null;
        try {
            // 创建FileInputStream对象,指定文件路径
            fis = new FileInputStream("C:\\Java\\a.txt");
            // 创建InputStreamReader对象,将字节流转换为字符流,并指定字符编码为UTF-8
            reader = new InputStreamReader(fis, "UTF-8");
            char ch[] = new char[1024];
            StringBuffer sb = new StringBuffer();
            int data;
            while ((data = reader.read(ch)) != -1) {
                // 将读取到的字符数组转换为字符串,并追加到StringBuffer对象中
                sb.append(ch, 0, data);
            }
            // 将StringBuffer对象转换为字符串并打印输出
            System.out.println(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    public static void testreaderBuff() {
        Reader reader = null;
        BufferedReader br = null;
        try {
            // 创建字符输入流对象
            reader = new FileReader("C:\\Java\\a.txt");
            // 创建BufferedReader对象,将字符输入流包装在其中,实现缓冲功能
            br = new BufferedReader(reader);
            String str = null;
            while ((str = br.readLine()) != null) {
                // 逐行读取文本内容并打印输出
                System.out.println(str);
            }
//            char ch[] = new char[1024];
//            StringBuffer sb = new StringBuffer();
//            int data;
//            while ((data = br.read(ch)) != -1) {
//                sb.append(ch);
//            }
//            System.out.println(sb.toString());
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭流
                br.close();
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


这三个方法实现了不同的字符读取方式:

testreader1() 方法使用 FileReader 类直接读取文件的字符流。它每次读取一个字符并将其转换为 char,然后打印输出。这种方式适用于读取较小的文本文件。

testreader2() 方法使用 InputStreamReader 类将 FileInputStream 的字节流转换为字符流。它使用字符数组作为缓冲区,每次读取一定数量的字符数据,并将其追加到 StringBuffer 对象中。最后,将 StringBuffer 对象转换为字符串并打印输出。这种方式适用于读取较大的文本文件。

testreaderBuff() 方法使用 BufferedReader 类对字符输入流进行缓冲。它包装了 FileReader 对象,并通过 readLine() 方法逐行读取文本内容并打印输出。使用缓冲区可以提高读取效率,尤其适用于大型文本文件。

字符输出流Writer类

常用方法:

方法描述
write(int c)将指定的字符写入输出流
write(char[] cbuf)将字符数组的内容写入输出流
write(char[] cbuf, int off, int len)将字符数组的指定部分写入输出流
write(String str)将字符串写入输出流
write(String str, int off, int len)将字符串的指定部分写入输出流
append(char c)将指定字符追加到输出流
append(CharSequence csq)将指定字符序列追加到输出流
append(CharSequence csq, int start, int end)将指定字符序列的指定部分追加到输出流
flush()刷新输出流,将缓冲区中的内容写入目标设备
close()关闭输出流,释放与之关联的资源

子类OutputStreamWriter常用的构造方法
OutputStreamWriter(OutputStream out)
OutputStreamWriter(OutputStream out,String charsetName)

OutputStreamWriter的子类FileWriter类

构造方法
FileWriter (File file)
FileWriter (String name)

该类只能按照本地平台的字符编码来写数据,用户不能指定其他的字符编码类型
在这里插入图片描述

BufferedWriter类

可以使用FileWriter类与BufferedWriter类
提高字符流写文本文件的效率。

  • BufferedWriter类是Writer类的子类
  • BufferedWriter类带有缓冲区

构造方法
BufferedWriter(Writer out)
用BuffererWriter写文本文件过程

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

软件测试|好用的pycharm插件推荐(五)——Translation

前言 在我们的日常工作中,经常会遇到需要查看各个第三方库源码的问题,在很多情况下,我们的英语能力不能够满足我们完全读懂源码,所以我们就需要借助翻译工具来帮助我们理解第三方库的源码,如果我们将源码复制再使用其…

JavaScrip-初识JavaScript-知识点

初识JavaScript 编程基础编程计算机语言标记语言编译器&解释器 计算机基础计算机组成数据存储数据存储单位程序运行 认识JavaScript什么是JavaScriptJavaScript作用HTML&CSS&JavaScript的关系浏览器执行JavaScript过程JavaScript的组成JavaScript初体验 JavaScript…

对root用户的理解

1.什么是root用户? Windows、MacOS、Linux均采用多用户的管理模式进行权限管理。在Linux系统中,拥有最大权限的账户名为:root(超级管理员) root用户拥有最大的系统操作权限,而普通用户在许多地方的权限是受…

听劝,年度规划有它真的很必要!

2024年的时间进度条已走过一周,完成全年的1/52。 新年的flag悄然立下:愿逆风如解意,税后八个亿。 在不确定的世界中,发财暴富终归是确定的目标。 相比2023年的卷,年底的即兴生活正在悄悄上演,上一秒还在…

安达发|APS智能排产软件有哪些条件约束功能

APS智能排产软件是一种基于先进算法和人工智能技术的生产计划与调度系统,它可以帮助企业实现生产资源的优化配置,提高生产效率和降低生产成本。在实际应用中,APS智能排产软件需要满足多种条件约束功能,以满足不同企业的需求。以下…

VMware vSphere运维管理手册

适用版本:VMware vSphere 7.0 VMware vSphere 是 VMware 的虚拟化平台,可将数据中心转换为包括 CPU、存储和网络资源的聚合计算基础架构。vSphere 将这些基础架构作为一个统一的运行环境进行管理,并为您提供工具来管理加入该环境的数据中心。 ![[Pasted image 20231212132…

【DevOps-08-2】Harbor的基本操作

一、简要描述 Harbor作为镜像仓库,主要的交互方式就是将镜像上传到Harbor上,以及从Harbor上下载指定镜像 在传输镜像前,可以先使用Harbor提供的权限管理,将项目设置为私有项目,并对不同用户设置不同角色,从而更方便管理镜像。 二、Harbor添加用户和项目 1、添加Harbor用…

Python 编写不同时间格式的函数

该代码是一个时间相关的功能模块,提供了一些获取当前时间的函数。 Report_time() 函数返回当前时间的格式化字符串,例如 "20240110114512"。Y_M_D_h_m_s_time() 函数返回当前时间的年、月、日、时、分、秒的元组格式。Y_M_D_h_m_s() 函数返回…

Linux du和df命令

目录 一. df二. du 一. df ⏹用于显示系统级别,磁盘分区上的可用和已用空间的信息 -h:以人类可读的格式显示文件系统大小 ⏹每秒钟监视当前磁盘的使用情况 watch 用于周期性的执行特定的命令-n 1 表示每一秒刷新一次命令执行的结果df -h ./ 表示周期性…

如何利用期权解套股票?

我们都知道股票都是做多头排列的,但是当下行情其实并没有那么好,很多个股都是被套住的。这种情况下除了做T,利用期权也是降低自己损失的。有时候我们在投资上面可以交叉品种使用,这样可能我们的投资回报才会更好,也会更…

回顾基础--HTML篇

HTML语法规范 <html></html> 开始标签与结束标签 <br /> 单标签 包含关系 <head><title></title> </head>并列关系 <head></head> <body></body> 1、 标题标签 标题标签 【双标签】【不同标题字体大小…

GIT - 清除历史 Commit 瘦身仓库

目录 一.引言 二.仓库清理 ◆ 创建一个船新分支 ◆ 提交最新代码 ◆ 双指针替换分支 三.总结 一.引言 由于项目运行时间较长&#xff0c;分支较多&#xff0c;且分支内包含很多不同的大文件&#xff0c;随着时间的推移&#xff0c;历史 Git 库的容量日渐增发&#xff0c…

RocketMQ源码 Consumer 消费者源码架构分析

前言 消息消费者 MQConsumer 即消息的消费方&#xff0c;主要负责消息消息生产者 MQ Producer 投递的消息。它的源码架构如下图&#xff0c;以常用的消费者实现类 DefaultMQPushConsumer 视角分析消费者的源码架构&#xff0c;介绍消费者核心数据结构。 DefaultMQPushConsume…

蓝凌EIS智慧协同平台 ShowUserInfo.aspx SQL注入漏洞复现

0x01 产品简介 蓝凌EIS智慧协同平台是一款专为企业提供高效协同办公和团队合作的产品。该平台集成了各种协同工具和功能,旨在提升企业内部沟通、协作和信息共享的效率。 0x02 漏洞概述 由于蓝凌EIS智慧协同平台 ShowUserInfo.aspx接口处未对用户输入的SQL语句进行过滤或验证…

【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你探索和分析JMM并发模型之(重排序机制)

全方位带你探索和分析JMM并发模型之重排序机制 专栏介绍前提准备面向人群知识脉络重排序数据依赖性读后写依赖&#xff08;Read-After-Write Dependency&#xff09;写后读依赖&#xff08;Write-After-Read Dependency&#xff09;写后写依赖&#xff08;Write-After-Write De…

离线AI聊天清华大模型(ChatGLM3)本地搭建

在特定的情况下&#xff0c;要保证信息安全的同时还能享受到AIGC大模型带来的乐趣和功能&#xff0c;那么&#xff0c;离线部署就能帮助到你&#xff0c;最起码&#xff0c;它是一个真正可用的方案。 大模型本身清华的 (ChatGLM3)&#xff0c;为的是对中文支持友好&#xff0c…

重学JavaScript高级(八):ES6-ES12新增特性学习

ES6-ES12新增特性学习 ES6–对象字面量增强 属性的简写方法的简写计算属性名 let name "zhangcheng" //我想让sum作为obj的key值 let objKey "sum" let obj {//属性名的简写name//等同于name:name//方法的简写running(){}//等同于running:function()…

寒武纪显卡实现softmax算子

寒武纪显卡实现softmax基本逻辑 寒武纪实现softmax包括下面5个步骤&#xff0c;我们也采取5个kernel来实现softmax&#xff1a; unionMaxKernel(float* middle, float* source1, int num)&#xff0c;这个kernel使用的任务类型是union1&#xff0c;其中middle的长度为taskDim&…

如何设置电脑桌面提醒,电脑笔记软件哪个好?

对于大多数上班族来说&#xff0c;每天要完成的待办事项实在太多了&#xff0c;如果不能及时去处理&#xff0c;很容易因为各种因素导致忘记&#xff0c;从而给自己带来不少麻烦。所以&#xff0c;我们往往会借助一些提醒类的软件将各项任务逐一记录下来&#xff0c;然后设置上…

时序分解 | Matlab实现CPO-VMD基于冠豪猪优化算法(CPO)优化VMD变分模态分解时间序列信号分解

时序分解 | Matlab实现CPO-VMD基于冠豪猪优化算法(CPO)优化VMD变分模态分解时间序列信号分解 目录 时序分解 | Matlab实现CPO-VMD基于冠豪猪优化算法(CPO)优化VMD变分模态分解时间序列信号分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 【原创】CPO-VMD【24年新算法…