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

本文介绍了Java中的字符流,包括字符输入流Reader和字符输出流Writer。重点讲解了FileReader和FileWriter的使用,以及如何进行数据的读写、续写和换行操作。字符流适用于处理文本文件,避免了中文字符显示不完整的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以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:字符流,只能操作文本文件,不能操作图片,视频等非文本文件,当我们单纯读或写文本文件时,使用字符流,其他情况使用字节流。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值