字符流

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

1. 字符输入流 ( Reader )

java.io.Reader抽象类是表示用于读取字符流的所有类的超类, 可以读取字符信息到内存中, 它定义了字符输入流的基本共性功能方法. 如果要使用, 需要使用它的子类, 常用的子类是FileReader

| 修饰符 | 返回值 | 方法名 | 参数列表 | 作用 | | ------ | ------ | ------- | ------------ | ----------------------------------------------------- | | public | void | close | ( ) | 关闭此流并释放与此流相关联的任何系统资源 | | public | int | read | ( ) | 从输入流读取一个字符 | | public | int | read | ( char[] c ) | 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 |

2. FileReader类

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

  1. 字符编码 : 字符与字节的对应规则, windows系统的中文编码默认是GBK编码, idea中是UTF-8
  2. 字节缓冲区 : 一个字节数组, 用来临时储存字节数据

2.1 构造方法

| 构造方法 | 作用 | | ----------------------------- | ------------------------------------------------------ | | FileReader(File file) | 参数要传递File类型的文件,表示从该文件中读取数据 | | FileReader(String fileName) | 参数要传递字符串类型的文件路径,表示从该文件中读取数据 |

当创建一个流对象时, 必须传入一个文件路径, 类似于FileInputStream.

2.2 读取字符数据

| 修饰符 | 返回值 | 方法名 | 参数列表 | 作用 | | ------ | ------ | ------ | ------------ | ------------------------------------------------------------ | | public | void | read | ( ) | 读取一个字符并返回, 如果已经读取结束, 返回值是-1 | | public | int | read | ( char[] c ) | 将数据读取到字符数组中,并返回读取到的字符个数,如果已经读取结束, 返回值是-1 |

字符输入流的使用步骤 :

  1. 创建字符输入流对象
  2. 调用read方法, 读取数据
  3. 调用close方法, 释放资源

字符输入流一次读取一个字节的方法 :

public class Demo01Reader {public static void main(String[] args) throws IOException {//1. 创建字符输入流对象Reader r = new FileReader("day11source03.txt");//2. 调用read方法,读取数据。//int read(): 读取一个字符并返回, 如果已经读取结束, 返回值是-1.//定义变量i,用来接收读取到的字符。int i;//开始循环读取while ((i = r.read()) != -1) {//如果条件成立表示读取到了数据,读取到的数据保存在了变量i中System.out.print((char)i);}//释放资源r.close();}
}

字符输入流一次读取一个字符数组的方法 :

int read (char[] c) : 将数据读取到字符数组中, 并返回读取到的字符个数, 如果已经读取结束, 返回值是-1

public class Demo02Reader {public static void main(String[] args) throws IOException {//创建字符输入流对象Reader r = new FileReader("day11source03.txt");//使用一次读取一个字符数组的方式读取数据。//int read(char[] cbuf): 将数据读取到字符数组中char[] cArr = new char[2];//定义变量len,用来接收读取到的字符个数int len;//开始循环读取while ((len = r.read(cArr)) != -1) {//如果条件成立表示读取到了数据,读取到的数据保存在了cArr这个数组中,变量len中保存的是读取到的字符个数。//将字符数组的一部分转成字符串输出。读取到了几个内容,就转几个。System.out.print(new String(cArr, 0, len));}//释放资源r.close();}
}

3. 字符输出流 ( Writer )

java.io.Writer抽象类是所有字符输出流的顶层父类, 可以按照字符为单位写数据, 可以将Java程序中的数据写到文件中, 它定义了字节输出流的基本共性方法. 常用的子类是FileWriter.

| 修饰符 | 返回值 | 方法名 | 参数列表 | 作用 | | ---------------- | ------ | ------- | -------------------------------- | ------------------------------------------------------------ | | public abstract | void | close | ( ) | 关闭此输出流并释放与此流相关联的任何系统资源。 | | public abstract | void | flush | ( char[] c ) | 刷新此输出流并强制任何缓冲的输出字符被写出。 | | public | void | write | ( int c ) | 写出一个字符 | | public | void | write | ( char[] c ) | 将 b.length字符从指定的字符数组写出此输出流 | | public abstract | void | write | (char[] c, int off, int length ) | 从指定的字符数组写出 len字符,从偏移量 off开始输出到此输出流 | | public | void | write | (String str) | 写出一个字符串 | | public | void | write | (String str, int off, int len) | 向文件中写字符串的一部分。参数off表示从哪个位置开始写,参数len表示写几个 |

4. FileWriter类

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

4.1 构造方法

| 构造方法 | 作用 | | ----------------------------- | -------------------------------------------------------- | | FileWriter(File file) | 参数要传递一个File类型的文件,表示向该文件中写数据 | | FileWriter(String fileName) | 参数要传递一个字符串类型的文件路径,表示向该文件中写数据 |

当创建一个流对象时, 必须传入一个文件路径, 类似于FileOutputStream

4.2 写出数据

字符输出流的使用步骤 :

  1. 创建字符输出流对象
  2. 调用write方法写数据
  3. 刷新
  4. 关流

只有字符输出流必须要勤刷新.

public class Demo01Writer {public static void main(String[] args) throws IOException {//1. 创建字符输出流对象。Writer w = new FileWriter("day11file01.txt");//2. 调用write方法写数据w.write("雷猴");//字符输出流写数据并没有将数据直接写到文件中,而是先写到了内存缓冲区中。//如果想要把内存缓冲区中的数据放到文件中,那么需要刷新。//3. 刷新w.flush();//4. 关流w.close();}
}

刷新方法和关闭方法的区别flush():
刷新。 流在刷新之后还可以使用。
close():先刷新,然后关闭流。 流在关闭之后就不能使用了。
调用close的时候, 也会先刷新, 再关闭, 但是如果要写入很多的数据, 那么内存缓冲区就会过载 , 所以需要时不时的清空内存缓冲区, 将数据先写入文档内在继续.

5种字符输出的方法 :

public class Demo03Writer {public static void main(String[] args) throws IOException {//创建字符输出流对象Writer w = new FileWriter("day11file03.txt");//调用write方法写数据。//void write(String str): 向文件中写一个字符串//w.write("hello");//void write(String str, int off, int len): 向文件中写字符串的一部分//w.write("hello", 1, 3);//将hello的一部分写到文件中,从索引为1的位置开始写,写3个//void write(int c):向文件中写一个字符//w.write(100);//d  会查询ASCII码表写入对应的字符。//w.write('a');//w.write('中');//void write(char[] cbuf): 向文件中写一个字符数组。//char[] cArr = {'h', 'e', 'l', 'l', 'o'};//w.write(cArr);//void write(char[] cbuf, int off, int len): 向文件中写字符数组的一部分char[] cArr = {'h', 'e', 'l', 'l', 'o'};w.write(cArr, 1, 3);//表示将cArr的一部分写到文件中,从索引为1的位置开始写,写3个//刷新w.flush();//关流w.close();}
}

图片流写出 并带数据_IO流阶段---字符流相关推荐

  1. 图片流写出 并带数据_第九章 IO流

    1. 输入流和输出流联系和区别,节点流和处理流联系和区别 首先,你要明白什么是"流".直观地讲,流就像管道一样,在程序和文件之间,输入输出的方向是针对程序而言,向程序中读入东西,就 ...

  2. 学生的基本信息包括学号、姓名、成绩, 写出表示学生数据的结构类型,编写一个程序,输入整数n,再输入n个学生的信息,输出成绩最高的学生信息。

    学生的基本信息包括学号.姓名.成绩, 写出表示学生数据的结构类型,编写一个程序,输入整数n,再输入n个学生的信息,输出成绩最高的学生信息. 代码如下: #include<stdio.h>s ...

  3. java基础学习_IO流03_字符流、IO流小结、案例_day21总结

    java基础学习_IO流03_字符流.IO流小结.案例_day21总结 ================================================================ ...

  4. Java18-day09【字节缓冲流、字符流、编码表、字符串与字符流中的编码解码问题、字符流读写数据的方式、字符缓冲流、IO流小结】

    视频+资料(工程源码.笔记)[链接:https://pan.baidu.com/s/1MdFNUADVSFf-lVw3SJRvtg   提取码:zjxs] Java基础--学习笔记(零起点打开java ...

  5. 【Java-IO】File、搜索删除剪切、字符集、字符编码、字节流、将内存中的数据写入文件、字符流、缓冲流、Scanner、格式化输出、数据流、对象流、序列化与反序列化、Files工具类

    IO 文章目录 IO 简介 File 分隔符.大小写 常用方法 练习:搜索.删除.剪切 字符集(Character Set) 字符编码(Character Encoding) 字符编码比较 乱码 字节 ...

  6. java---编写一个程序,分别使用字节流和字符流拷贝一个文本文件。

    题目: 编写一个程序,分别使用字节流和字符流拷贝一个文本文件.要求如下: (1)使用FileInputStream.FileOutputStream和FileReader.FileWriter分别进行 ...

  7. 一文带你看懂JAVA IO流,史上最全面的IO教学啦(附送JAVA IO脑图

    一.IO流是什么 惯例引用百科的回答 流是一种抽象概念,它代表了数据的无结构化传递.按照流的方式进行输入输出,数据被当成无结构的字节序或字符序列.从流中取得数据的操作称为提取操作,而向流中添加数据的操 ...

  8. 使用layui在前端接收后端的图片流来显示二维码,在前端使用iframe接收后端流来预览pdf

    消息弹框的形式 因为我是在生成二维码之后,用zxing的工具类输出的流 所以这里介绍一下我用到的工具类的依赖 gradle // https://mvnrepository.com/artifact/ ...

  9. 运筹学修炼日记:如何优雅地写出大规模线性规划的对偶

    运筹学修炼日记:如何优雅地写出大规模线性规划的对偶问题 运筹学修炼日记:如何优雅地写出大规模线性规划的对偶 最短路问题 多商品流问题`Multicommodity Network Flow Probl ...

最新文章

  1. Nginx反向代理负载均衡时,验证码不正确
  2. 香港虚拟主机怎么转服务器,香港虚拟主机好慢怎么办
  3. .net core webapi 前后端开发分离后的配置和部署
  4. flare3d_clone
  5. vscode 使用 ssh 登录
  6. python中string.digits_Python string.hexdigits方法代码示例
  7. mysql—数据库优化——如何选择合适的索引
  8. dismiss 多个viewController
  9. Linux chapter 8
  10. atitit 图像处理机器视觉专业博硕连读课程表.xlsx
  11. TBS 腾讯浏览服务(X5WebView) 集成指南
  12. 消费券或可让消费增速超过8%
  13. 【Excel】根据空格拆分单元格
  14. 海贼王python代码_这顶海贼王的帽子,我Python给你带上了 | 【人脸识别应用】
  15. JavaFX教程资源
  16. html没有注册类,电脑提示没有注册类别的解决方法大全
  17. 一文带你了解c++使用endl和使用‘\n‘的区别
  18. 2022跨年烟花代码
  19. oracle nvl和nvl2的区别
  20. android手机密码忘了,安卓手机密码忘记了怎么解锁

热门文章

  1. MySQL MGR集群搭建
  2. idea maven dependencies 总是报红
  3. MySQL数据库----触发器
  4. Nginx伪静态配置和常用Rewrite伪静态规则集锦
  5. Unity手机摇一摇
  6. 教你制作U盘,内存卡,硬盘等等等的漂亮背景
  7. memcached完全剖析
  8. 我们都有冲动了的飞鸽传书2011
  9. GetRegisterAsBrowser CHtmlView::GetRegisterAsBrowser
  10. 一个顶级程序员要多久才能独自写完Win10代码?