使用字节流读取中文的时候,如果使用的编码是GBK,则占用2个字节;如果使用UTF-8编码,则占用3个字节,意味着我们读取中文文档的时候如果每次读取1个字节,那么输出的将会是乱码,因为是不完整的中文。
所以为了更好的读取文本文档,java提供了字符流类,以字符为单位读写数据,专门拿来读写文本文档。
Java.io.Reader 字符输入流,是字符输入流的最顶层的父类,定义了一些共性方法,是一个抽象类
共性方法:
- int read() 读取单个字符并返回
- int read(char\[\] cbuf) 一次读取多个字符,将字符读入数组
- void close() 关闭流并且释放相关的资源
FileReader 文件字符输入流 ,继承自InputStreamReader类,InputStreamReader类又继承自Reader类,作用是将硬盘文件中的数据以字符的方式读入内存
构造方法:
- FileReader(String fileName)
- FileReader(File file)
- 字符输入流的使用步骤:
创建FileReader对象,构造方法中绑定要读的数据源
使用FileReader对象中的read方法(继承自父类Reader)读取文件
释放资源
javapublic static void test1() throws IOException{ FileReader fr=new FileReader("a.txt"); int len=0; //一次读取多个字符 char[] cbuf=new char[1024]; while((len=fr.read(cbuf))!=-1) { System.out.print(new String(cbuf,0,len)); } }
Java.io.writer 字符输出流,是所有字符输出流的父类
共性方法:
- void write(int c) 写入单个字符
- void write(char\[\] cbuf) 写入字符数组
- abstract void write(char\[\] cbuf,int off,int len) 写入字符数组的某一部分,off是开始下标,len是字符个数
- void flush() 刷新流的缓冲
- void close() 关闭流,但是要先刷新
Filewriter 文件字符输出流,继承自OutputStreamWriter ,而OutputStreamWriter又继承自Writer,作用是把内存中的字符写入到硬盘文件中。
构造方法:
- FileWriter(String fileName ,boolean append) 根据给定的路径创建一个FileWriter对象,apend为是否追加写入的标志
- FileWriter(File file, boolean append)根据给定的File对象创建一个FileWriter对象,apend为是否追加写入的标志
- 字符输出流的使用步骤:
创建FileWriter对象,构造方法中绑定写入数据的地址
使用FileWriter中的write方法将字符写入内存缓冲区中
刷新内存缓冲区将数据写入文件,这里可以使用flush直接刷入,然后再使用close方法关闭流;也可以使用close方法关闭流,关闭流的时候,会自动先调用flush刷入文件。
使用追加写入的方式
javapublic static void test2() throws IOException{ FileWriter fw=new FileWriter("a.txt",true); fw.write(98); //可以先调用flush,再调用close //fw.flush(); //fw.close(); //也可以直接调用close fw.close(); }
- 字符输出流写数据的其他方法
void write(char\[\] cbuf) 写入字符数组
abstract write(char\[\] cbuf,int off,int len) 写入字符数组的一部分,off是开始索引,len是字符个数
void write(String str) 写入一个字符串
void write(String str,int off,int len) 写入字符数组的一部分,off是开始索引,len是字符个数\
javapublic static void test3() throws IOException{ FileWriter fw=new FileWriter("a.txt",true); char[] cbuf={'a','b','c','d'}; //写入一个字符串组 fw.write(cbuf); //写入字符数组的一部分 fw.write(cbuf,0,2); //写入一个字符串 fw.write("hello"); //写入字符数组的一部分 fw.write("hello",0,3); fw.close(); }
java中的字符流
就是木子呀2023-08-04 8:18
相关推荐
Scott9999HH13 小时前
【IIoT流量实战】蒸汽管道阀门全关却仍有流量?用 Python 实现涡街信号 FFT 频谱分析与温压全补偿积算网关,深度拆解靠谱的涡街流量计厂家硬核技术标准腻害兔13 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统码智社14 小时前
AES加密原理详解及Java实现加解密实战AI云海14 小时前
python 列表、元组、集合和字典萧瑟余晖15 小时前
JDK 26 新特性详解马优晨16 小时前
Freemarker 完整讲解(后端 Java 模板引擎)人邮异步社区18 小时前
怎么把C语言学到精通?心平气和量大福大18 小时前
C#-WPF-控件-TextBox 数据绑定ttwuai18 小时前
Cursor 生成 CRUD 后,Go 后台接口别只测 200:JWT、RBAC 和 tenant_id 怎么验维天说19 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态