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

字符流(字符输入流和字符输出流)

概述

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

字符输入流Reader

java.io.Reader抽象类是标识用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

磁盘-->内存

public void close():关闭此流并释放与此流相关联的任何系统资源。

public int read():从输入流读取一个字符。

public int read(char[] cbuf):从输入流中读取一些字符。

FileReader

java.io.FileReader类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

作用:把硬盘文件中的数据以字符的方式读取到内存中。

Tips:字节与字符的对应规则。Windows系统的中文编码默认时GBK编码表。IDEA中utf-8。

构造方法:(红色为常用)

构造方法摘要
FileReader(File file)
          在给定从中读取数据的 File 的情况下创建一个新 FileReader。
FileReader(FileDescriptor fd)
          在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader。
FileReader(String fileName)
          在给定从中读取数据的文件名的情况下创建一个新 FileReader。

参数:String name文件路径;File file文件

构造方法的作用:

1.创建一个FileReader对象

2.会把FileReader对象指向要读取的文件

字符输入流的使用步骤:

1.创建FileReader对象,构造方法中绑定要读取的数据源;

2.使用FileReader对象中的方法read读取文件;

3.释放资源。

// 创建FileReader对象,构造方法中绑定要读取的数据源;
FileReader fr = new FileReader("D:\\a\\a.txt");
// 使用FileReader对象中的方法read读取文件
int len = 0;
while((len = fr.read()) != -1){ // 读到末尾
    // 一个字符-->ASCII码对应
    // 你-->20320
    System.out.println(len);
    // 你-->20320-->你
    System.out.println((char)len); // 大到小,强制转换
}
fr.close(); // 释放资源
// int read(char[] cbuf)一次读取读个字符,将字符读入数组。
char[] cs = new char[1024]; // 存储读取到的多个字符
int len = 0; // 记录每次读取的有效字符个数
while((len = fr.read(cs)) != -1){
    /*
    String类的构造方法
    String(char[] value)把字符数组转换为字符串
    String(chaar[] value,int offset,int count)把字符数组的一部分转换为字符串
    offset数组的开始索引,count转换的个数
     */
    System.out.println(new String(cs,0,len));
}
fr.close(); // 释放资源

字符输出流Writer

java.io.Writer抽象类时标识用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。

void write(int c):写入单个字符

void write(char[] cbuf):写入字符数组

abstract void write(char[] cbuf,int off,int len):写入字符数组的某一部分,off数组的开始索引,len写的字符个数

void write(String str):写入字符串

void write(String str,int off,int len):写入字符串的某一部分,off字符串的开始索引,len写的字符个数

void flush():刷新该流的缓冲

void close():关闭此流,但要先刷新它。

FileWriter类

java.io.FileWriter类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

作用:把内存中的字符数据写入到文件中

构造方法:(红色为常用)

构造方法摘要
FileWriter(File file)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(FileDescriptor fd)
          构造与某个文件描述符相关联的 FileWriter 对象。
FileWriter(String fileName)
          根据给定的文件名构造一个 FileWriter 对象。

FileWriter(String fileName, boolean append)
          根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

 参数:写入数据的目的地

String name 文件路径;File file 文件

构造方法作用:

1.创建一个FileWriter对象;

2.会根据构造方法中传递的文件/文件路径,创建文件;

3.会把FileWriter对象指向创建好的文件。

字符输出流的使用步骤:

1.创建一个FileWriter对象;

2.构造方法中绑定要写入数据的目的地;

3.使用FileWriter对象中的方法writer,把数据据写入到内存缓冲区(字符转换为字节的过程)中;

4.使用FileWriter对象中的方法flush,把内存缓冲区中的数据,刷新到文件中;

4.释放资源(会把内存缓冲区中的数据刷新到文件中,故flush可不写)。

FileWriter fw = new FileWriter("D:\\a\\abc.txt");
// 97-->a
fw.write(97); 
fw.flush(); // 如果都不写,则在缓冲区,没有刷新进文件中
fw.close();

flush方法和close方法的区别(关闭和刷新)

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush方法。

flush:刷新缓冲区,流对象可以继续使用。

close:先刷新缓冲区,然后通知系统释放资源,流对象不可以再被使用了。

fw.write(97);
fw.flush();
fw.write(98);
fw.close();

运行截图:

写出其他数据

1.写出字符数组:write(char[] cbuf)和write(char[] cbuf,int off,int len),每次可以写出字符数组中的数据,用法类似于FileOutStream。

FileWriter fr = new FileWriter("D:\\a\\bc.txt");
// 写入字符数组
char[] cs = {'1','2','3','a','d','你'};
fr.write(cs); // 同样进入字符数组进行字符-->字节转换,需要刷新
fr.flush(); // 123ad你
//写入字符数组一部分
fr.write(cs,1,2);
fr.flush(); // 23

2.写出字符串:write(String str)和write(String str,int off,int len),每次可以写出字符串中的数据或部分数据,用法类似于FileOutStream。

// 写出字符串
fr.write("好呀!");
fr.flush(); // 好呀!

// 写出字符串的一部分
fr.write("我是猪猪",1,2);
fr.flush(); // 是猪

续写和换行

操作类似于FileOutputStream。

FileWriter(String name/File file,boolean append)

参数:append:续写开关。

true不会创建新的文件覆盖源文件,可以续写;默认false,创建新的文件覆盖源文件。

FileWriter fw = new FileWriter("D:\\a\\bc.txt",true); // 允许续写
fw.write(new char[]{'1','2'});
fw.write("\r\n");
fw.write("你们好");
fw.flush();
/*
123ad你23好呀!是猪12
你们好
 */
fw.close();

Tips:字符流,只能操作文本文件,不能操作图片,视频等非文本文件,当我们单纯读或写文本文件时,使用字符流,其他情况使用字节流。

相关文章:

  • IO异常的处理
  • 栈Stack(数组模拟、单链表模拟)
  • 属性集合Properties
  • 缓冲流
  • 转换流InputStreamReader类和OutputStreamWriter(字符编码和字符集)
  • 序列化与反序列化和transient瞬态关键字
  • 打印流
  • 前缀(波兰)、中缀、后缀(逆波兰)表达式
  • 递归(回溯之迷宫问题+八皇后)
  • 算法题-Java实现:从 1 到 n 整数中 1 出现的次数(时间复杂度O(logn))
  • 软件结构/网络通信协议/IP地址/端口号
  • TCP通信程序
  • C/S结构文件上传案例
  • 排序算法(冒泡排序、选择排序、插入排序、希尔排序、快速排序、归并排序、基数排序)
  • 二分查找和插值查找
  • @angular/forms 源码解析之双向绑定
  • 08.Android之View事件问题
  • canvas 高仿 Apple Watch 表盘
  • Fabric架构演变之路
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • Javascript设计模式学习之Observer(观察者)模式
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • Leetcode 27 Remove Element
  • sessionStorage和localStorage
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • Yii源码解读-服务定位器(Service Locator)
  • 算法之不定期更新(一)(2018-04-12)
  • 物联网链路协议
  • 详解NodeJs流之一
  • 数据库巡检项
  • ​低代码平台的核心价值与优势
  • # 安徽锐锋科技IDMS系统简介
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #### go map 底层结构 ####
  • (20050108)又读《平凡的世界》
  • (附源码)ssm户外用品商城 毕业设计 112346
  • (四)c52学习之旅-流水LED灯
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (原)本想说脏话,奈何已放下
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • (转)setTimeout 和 setInterval 的区别
  • (转)菜鸟学数据库(三)——存储过程
  • (转)德国人的记事本
  • (转)四层和七层负载均衡的区别
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .chm格式文件如何阅读
  • .NET Conf 2023 回顾 – 庆祝社区、创新和 .NET 8 的发布
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .net的socket示例
  • .NET使用存储过程实现对数据库的增删改查
  • .NET与java的MVC模式(2):struts2核心工作流程与原理
  • .sdf和.msp文件读取
  • .so文件(linux系统)
  • @Autowired自动装配
  • @staticmethod和@classmethod的作用与区别