当前位置: 首页 > news >正文

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-8reader = 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写文本文件过程

在这里插入图片描述

package 面向对象.文件的输入与输出;import java.io.*;public class 字符流输出 {public static void main(String[] args) {try {// 调用testWrite方法进行文件写入操作// testWrite();// 调用testWriteAndReader方法进行文件写入和读取操作testWriteAndReader();} catch (IOException e) {throw new RuntimeException(e);}}public static void testWrite() throws IOException {// 创建字符输出流对象// FileWriter继承自OutputStreamWriter,用于写入字符流到文件Writer writer = null;String str = "好好学习Java";// 创建文件写入的目标文件路径writer = new FileWriter("C:\\Java\\a.txt");// 将字符串写入文件writer.write(str);System.out.println("写入成功");// 关闭流,释放资源writer.close();}public static void testWriteAndReader() throws IOException {// 创建字符输出流和字符输入流对象FileWriter fw = null;BufferedWriter bw = null;FileReader fr = null;BufferedReader br = null;// 创建文件写入的目标文件路径fw = new FileWriter("C:\\Java\\a.txt");// 将文件写入字符缓冲区bw = new BufferedWriter(fw);// 向缓冲区写入内容bw.write("大家好");bw.write("我们正在学习Java流");// 写入一个换行符bw.newLine();bw.write("下周二就放寒假了");bw.newLine();// 刷新缓冲区,将内容写入目标文件bw.flush();// 创建文件读取的目标文件路径fr = new FileReader("C:\\Java\\a.txt");// 将文件读取到字符缓冲区br = new BufferedReader(fr);String str = null;// 逐行读取文件内容并打印while ((str = br.readLine()) != null) {System.out.println(str);}// 关闭流,释放资源fw.close();bw.close();fr.close();br.close();}
}

相关文章:

  • Java使用IText生产PDF时,中文标点符号出现在行首的问题处理
  • 第二证券:股指维持震荡格局 关注光伏设备等板块
  • B-树和B+树的特性,以及B+树在数据库中的应用
  • RESTful API使用它构建 web 应用程序
  • Mysql与Redis如何保证数据一致性问题
  • 找出字符串中第一个匹配项的下标(Leetcode28)
  • docker 容器添加指定网络地址
  • 坑记(HttpInputMessage)
  • 哪一款台灯适合孩子能用?分享适合孩子使用的护眼台灯
  • 分享一个实现侧滑菜单的Flutter页面所遇到的问题与解决思路
  • P4学习(二) 阅读《P4: Programming Protocol-Independent Packet Processors》论文
  • 小白入门基础 - spring Boot 入门
  • XUbuntu22.04之快速复制绝对路径(二百零五)
  • 基于Vue组合式API的实用工具集
  • 计算机组成原理之计算机硬件发展和计算机系统的组成
  • python3.6+scrapy+mysql 爬虫实战
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 2017年终总结、随想
  • CSS盒模型深入
  • github从入门到放弃(1)
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Java超时控制的实现
  • Python学习之路16-使用API
  • STAR法则
  • VUE es6技巧写法(持续更新中~~~)
  • vue:响应原理
  • 动手做个聊天室,前端工程师百无聊赖的人生
  • 简析gRPC client 连接管理
  • 算法---两个栈实现一个队列
  • 新手搭建网站的主要流程
  • Java性能优化之JVM GC(垃圾回收机制)
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • ​​​​​​​Installing ROS on the Raspberry Pi
  • #git 撤消对文件的更改
  • $jQuery 重写Alert样式方法
  • (01)ORB-SLAM2源码无死角解析-(66) BA优化(g2o)→闭环线程:Optimizer::GlobalBundleAdjustemnt→全局优化
  • (11)MSP430F5529 定时器B
  • (C语言)字符分类函数
  • (阿里云万网)-域名注册购买实名流程
  • (笔试题)合法字符串
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (九)信息融合方式简介
  • (转) RFS+AutoItLibrary测试web对话框
  • (转)iOS字体
  • (转)详解PHP处理密码的几种方式
  • **PHP分步表单提交思路(分页表单提交)
  • .bat批处理(四):路径相关%cd%和%~dp0的区别
  • .NET Micro Framework初体验(二)
  • .net 发送邮件
  • .net 提取注释生成API文档 帮助文档
  • .Net6使用WebSocket与前端进行通信
  • .NET值类型变量“活”在哪?
  • [20190401]关于semtimedop函数调用.txt
  • [AutoSar]BSW_OS 02 Autosar OS_STACK
  • [BeginCTF]真龙之力