JavaSE系列详解|Java基础IO流之字符流的使用

☆引言☆ 大家好,我是痛而不言笑而不语的浅伤。IO流分为字节流和字符流,而上一篇文章我们学习了字节流(Java基础IO流之字符流的使用),这篇文章带大家一起来学习字符流吧。对文章中描述错误的希望大家积极指出。
博客首页:痛而不言笑而不语的浅伤
欢迎关注点赞收藏留言
?:热爱Java学习,期待一起交流!
作者水平很有限,如果发现错误,求告知,多谢!
有问题可以私信交流!!!
目录
☆引言☆
什么是字符流?
字符流的分类
什么是字符输入流?
基本共性功能方法
字符输入流的分类
文件字符输入流
作用
构造方法
参数
作用
字符输入流的使用步骤
成员方法及使用
一次读取一个字符
一次读取多个字符
什么是字符输出流?
基本共性功能方法
字符输出流的分类
文件字符输出流
作用
构造方法
参数
作用
字符输出流的使用步骤
成员方法及使用
一次写入一个字符
一次写入多个字节
注意事项
追加写和换行写
总结

什么是字符流? 当我们在使用字节流读取文件时,可能会遇到一个小问题,就是在读取中文字符时,可能会显示不完整的字符,而这个原因就是使用的格式不同,一个中文字符可能会占用多个字节存储。比如UTF-8格式中,中文字符就占三个字节。所以Java中提供了字符流,以字符为单位,专门处理一些文本文件。
字符流的分类 字符流也和字节流一样,分为字符输入流FileReader和字符输出流。
什么是字符输入流? 字符输入流在Java中有一个类叫Reader,这个类也是一个抽象类,也是读取所有字符流的超类,就是读取字符信息到内存中。它定义了一些基本的共性功能方法。
基本共性功能方法

read()
读取单个字符。
从输入流读取一个字符
read(char[] cbuf)
将字符读入数组。
从输入流读取多个字符,并存储到数组中。
close()
关闭该流并释放与之关联的所有资源。
关闭流释放资源
字符输入流也分好几种,下面我们就看一下吧
字符输入流的分类 BufferedReader:带缓冲的
CharArrayReader:读取字符数组的
FilterReader:带过滤的
InputStreamReader:转换流
PipedReader:管道流
StringReader:读取字符串的
这么多分类,那我们怎么学呢?和上一篇文章中一样字节流我们学习了读取文件的字节流,这篇文章我们也学读取文件的字符流,而这个类是InputStreamReader类下的子类,叫FileReader,那我们就继续往下学吧!
文件字符输入流 FileReader是InputStreamReader的子类,我们通过它的作用、构造方法和成员方法等几方面来学习,先看一下它的继承关系,如下:
FileReader extends InputStreamReader extends Reader
作用 把硬盘中的文件以字符的方式读取到内存中
构造方法
FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新 FileReader。
FileReader(File file)
在给定从中读取数据的 File 的情况下创建一个新 FileReader。
参数
就是读取文件的数据源
String fileName:文件的路径
File File:一个文件
作用
  1. 创建一个FileReader对象
  2. 会把FileReader对象指向要读取的文件
字符输入流的使用步骤
  1. 创建FileReader对象,构造方法中绑定要读取的数据源
  2. 使用FileReader对象中的方法read读取文件
  3. 释放资源
成员方法及使用
void
close()
关闭此文件输出流并释放与此流有关的所有系统资源。
该成员方法的作用就是上面我们使用步骤里的第三步,释放资源。
一次读取一个字符
int
read()
读取单个字符。
表示该方法就是读取一个字符
此方法覆盖重写了超类Reader的read方法,使用该方法就是一次读取一个字符。此方法的使用步骤如下:
例如:
在C盘下有一个名称为Java的文件夹,这个文件夹中有一个a.txt的文件,里面有“你好abc”的数据,我们就把这个文件读取一下吧,代码如下:
public static void main(String[] args) throws IOException//抛IO Exception异常 { //1.创建FileReader对象,构造方法中绑定读取的数据源 FileReader fr=new FileReader("C:\\Java\\a.txt"); //2.使用FileReader对象中的方法read读取文件 //int read() 读取单个字符。 int len=0; //定义一个变量记录读取到的字符 while((len=fr.read())!=-1){//使用while死循环读取,读到-1时就停止读取 //因读取到的是整数类型的数字,需要用char类型来强转 System.out.print((char)len); } //3.释放资源 fr.close(); }

打印结果:你好abc
一次读取多个字符
int
read(char[] cbuf)
将字符读入数组。
参数
char[] cbuf:表示传递的是存储多个字符的数组
int offset:表示要读取一部分数据在数组中的开头索引
int lenght:表示写入这部分数据的字符长度
这两个成员方法的作用也是从文件中读取数据的,不过可以一次读取多个字符,那么我们就继续看一下这两个方法在怎么使用吧。
例如:
还是在C盘下有一个名称为Java的文件夹,这个文件夹中有一个a.txt的文件,里面有“你好abc”的数据,我们就把这个文件读取一下吧,代码如下:
public static void main(String[] args) throws IOException { //1.创建FileReader对象,构造方法中绑定读取的数据源 FileReader fr=new FileReader("C:\\Java\\a.txt"); //2.使用FileReader对象中的方法read读取文件 //int read(char[] cbuf) 将字符读入数组。 char[]cs=new char[1024]; //创建字符数组存储读取到的多个字符 int len = 0; //记录的是每次读取的有效字符个数 //使用while死循环读取,读到-1时就停止读取 while((len=fr.read(cs))!=-1){ /* 读取到的字符数组要转换成字符串我们要用到String类的构造方法 String(char[] value)把字符数组转换成字符串 String(char[] value, int offset, int count) 把字符数组的一部分转换成字符串,offset数组的开始索引,count转换的个数 */ System.out.println(new String(cs,0,len)); } //3.释放资源 fr.close(); }

打印结果:你好abc
上面两个方法虽然结果一样但是他们读取的字符个数不一样。学完了文件字符输入流,我们再来学一下文件字符输出流吧!
什么是字符输出流? 就是将数据从内存写入到硬盘中的文件,Writer就是字符输出流的父类,而它也是一个抽象类,是所有字符输出流的最顶层父类,它定义了字符输出流的基本共性功能方法,而抽象类是无法直接使用的,我们就通过它的一些子类来学习这个类。以下就是一些基本共性功能方法和子类。
基本共性功能方法
void
write(int c)
写入单个字符。
void
write(char[] cbuf)
写入字符数组。
abstractvoid
write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
void
write(String str)
写入字符串。
void
write(String str, int off, int len)
写入字符串的某一部分。
abstractvoid
close()
关闭此流,但要先刷新它。
abstractvoid
flush()
刷新该流的缓冲。
字符输出流的分类 字符输出流分为以下几个类:
BufferedWriter:带缓冲流的
CharArrayWriter:写入字符数组的
FilterWriter:带过滤器到的
OutputStreamWriter:转换流
PipedWriter:管道流
StringWriter写入字符串的
本章我们重点来学习了解一下FileWriter,就是文件中写数据的字符输出流。
文件字符输出流 文件字符输出流FileWriter继承了它的父类OutputStreamWriter
它的继承关系如下:
FileWriter extends OutputStreamWriter extends Writer
作用 文件字符输出流就是将内存中的字符数据写入到硬盘的文件中。
学习一个类就要从它的构造方法学起来,我们就继续往下看吧!
构造方法
FileWriter(File file)
根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(String fileName)
根据给定的文件名构造一个 FileWriter 对象。
参数
就是写入数据的目的地
File file:此参数所传递的是一个文件
File name:此参数所传递的是一个文件的路径
作用
  1. 创建一个FileWriter对象
  2. 会根据构造方法中传递的文件或文件路径,创建一个空文件
  3. 会把FileWriter对象指向创建好的文件
字符输出流的使用步骤
  1. 创建一个FileWriter对象,构造方法中传递写入数据的目的地。
  2. 调用FileWriter对象中的方法write,把数据写入到内存缓冲区
  3. 用flush方法刷新缓冲区把数据刷新到文件中
  4. 释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提高程序的效率)。
既然知道了构造方法的参数、作用和字节输出流的使用步骤那么下面我们就学习成员方法来用一下吧。
成员方法及使用 一次写入一个字符
void
write(int c)
写入单个字符。
参数
int c:表示该方法传递的就是一个字符
该成员方法作用就是在文件中写入数据,不过一次只能写入一个字符。此方法的使用步骤如下:
例如:
在C盘下有一个名称为Java的文件夹,这个文件夹中有一个a.txt的文件,我们就在这个文件中写入“a,b,c”这三个字符,代码如下:
public static void main(String[] args) throws IOException {// 1.创建FileWriter对象,构造方法中绑定要写入数据的目的地 FileWriter fw1 = new FileWriter("C:\\Java\\.txt"); // 2.使用FileWriter中的方法writer把数据写入到内存缓冲区中 // void write(int c) 写入单个字符。 fw1.write("a"); fw1.write("b"); fw1.write("c"); // 3.使用FileWriter中的方法flush,把内存缓冲区的数据刷新到文件中 fw1.flush(); // 4.释放资源 fw1.close(); }

运行结果:在a.txtx文件中显示“abc”。
既然可以一次写入一个字符,那我们也可以一次写入多个字符,比如下面的。
一次写入多个字节
void
write(char[] cbuf)
写入字符数组。
abstractvoid
write(char[] cbuf, int off, int len)
写入字符数组的某一部分。
参数
char[] cbuf:表示传递的是存储多个字符的数组
int off:表示要写入一部分数据在数组中的开头索引
int len:表示写入这部分数据的字符长度
这两个成员方法的作用也是在文件中写入数据的,不过可以一次写入多个字符,那么我们就继续看一下这两个方法在怎么使用吧。
例如:
还是在C盘下有一个名称为Java的文件夹,这个文件夹中有一个b.txt的文件,我们在这个文件中写入“你,好,J,a,v,a”这几个字符代码如下
private static void show02() throws IOException { // 1.创建FileWriter对象,构造方法中绑定要写入数据的目的地 FileWriter fw1=new FileWriter("F:\\workspace\\新建文件夹\\a.txt"); //创建一个存储了多个字符的数组 char[] ch={'你','好','J','a','v','a'}; // 2.使用FileWriter中的方法writer把数据写入到内存缓冲区中 fw1.write(ch); //3.使用FileWriter中的方法flush,把内存缓冲区的数据刷新到文件中 fw1.flush(); //4.释放资源 fw1 .close(); }

运行结果:在a.txt 文件中显示“你好,Java”。
注意事项
flush方法和close方法的区别
flush:刷新缓冲区,流对象可以继续使用
close:先刷新缓冲区,然后通知系统释放资源,流对象不可以再使用
例如:
还是在C盘下有一个名称为Java的文件夹,这个文件夹中有一个.txt的文件,我们在这个文件中写入一个字符"a",写完再写一个字符“b”,代码如下:
public static void main(String[] args) throws IOException { // 1.创建Filewriter对象,构造方法中绑定要写入数据的目的地 FileWriter fw1 = new FileWriter("C:\\Java\\c.txt"); // 2.使用FileWriter中的方法writer把数据写入到内存缓冲区中 // void write(int c) 写入单个字符。 fw1.write(97); // 3.使用FileWriter中的方法flush,把内存缓冲区的数据刷新到文件中 fw1.flush(); fw1.write(98); //再次写入字符b // 4.释放资源 fw1.close(); }

追加写和换行写
追加写(续写)
使用两个参数的构造方法
FileWriter(File file, boolean append)
根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)
根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
参数:
File file,String name:都表示写入数据的目的地
boolean append:表示追加写开关
true:创建对象不会覆盖源文件,继续在文件末尾追加写数据
false:创建一个新文件,覆盖源文件
例如:
C盘下有一个文件:a.txt,里面原本有“你好,Java。”,再追加写入一个“你好,helloworld!”,结果显示“你好!Java。”,代码如下:
private static void show03() throws IOException { //创建FileWriter对象,传递目的地,设置追加写开关 FileWriter fw1=new FileWriter("F:\\workspace\\新建文件夹\\a.txt", true); //2.使用FileWriter中的方法writer把数据写入到内存缓冲区中 fw1.write("你好,helloworld!"); //3.使用FileWriter中的方法flush,把内存缓冲区的数据刷新到文件中 fw1.flush(); // 4.释放资源 fw1.close(); }

运行结果:在a,txt文件中显示“你好,Java。你好,helloworld!”
换行写
就是加上换行符
window:\r\n
Linux:/n
mac:/r
例如在上面文件后面我们继续写入:我热爱学习Java。
private static void show03() throws IOException { //创建FileWriter对象,传递目的地,设置追加写开关 FileWriter fw1=new FileWriter("F:\\workspace\\新建文件夹\\a.txt", true); //2.使用FileWriter中的方法writer把数据写入到内存缓冲区中 fw1.write("你好,helloworld!"+"\r\n"); fw1.write("我热爱学习Java"); //3.使用FileWriter中的方法flush,把内存缓冲区的数据刷新到文件中 fw1.flush(); // 4.释放资源 fw1.close(); }

文件显示结果:
你好,Java。
你好,helloworld!
我热爱学习Java
总结 今日的分享到此结束,由于笔者还在学习的路上辗转徘徊,水平有限,文章中可能有一些不对之处,还请各位大佬指正,最后祝愿每一个热爱编程的小伙伴,学习的路上不迷路,实现自己的追求。如果大家觉得还不错,希望多多支持一下,点赞,关注加收藏。

【JavaSE系列详解|Java基础IO流之字符流的使用】

    推荐阅读