字符流

经过前面的学习,我们基本掌握的文件的读写操作,在操作过程中字节流可以操作所有数据,可是当我们操作的文件中有中文字符,并且需要对中文字符做出处理时怎么办呢?

字节流读取字符的问题

通过以下程序读取带有中文件的文件。

public class CharStreamDemo {

public static void main(String[] args) throws IOException {

//给文件中写中文

writeCNText();

//读取文件中的中文

readCNText();

}

//读取中文

public static void readCNText() throws IOException {

FileInputStream fis = new FileInputStream("c:\\cn.txt");

int ch = 0;

while((ch = fis.read())!=-1){

System.out.println(ch);

}

}

//写中文

public static void writeCNText() throws IOException {

FileOutputStream fos = new FileOutputStream("c:\\cn.txt");

fos.write("欢迎你".getBytes());

fos.close();

}

}

上面程序在读取含有中文的文件时,我们并没有看到具体的中文,而是看到一些数字,这是什么原因呢?既然看不到中文,那么我们如何对其中的中文做处理呢?要解决这个问题,我们必须研究下字符的编码过程。

字符编码表

我们知道计算机底层数据存储的都是二进制数据,而我们生活中的各种各样的数据,如何才能和计这时老美他们就把每一个字符和一个整数对应起来,就形成了一张编码表,老美他们的编码表就是ASCII表。其中就是各种英文字符对应的编码算机中存储的二进制数据对应起来呢?

编码表:其实就是生活中字符和计算机二进制的对应关系表。

1、ascii: 一个字节中的7位就可以表示。对应的字节都是正数。0-xxxxxxx

2、iso-8859-1:拉丁码表 latin,用了一个字节用的8位。1-xxxxxxx  负数。

3、GB2312:简体中文码表。包含6000-7000中文和符号。用两个字节表示。两个字节第一个字节是负数,第二个字节可能是正数

GBK:目前最常用的中文码表,2万的中文和符号。用两个字节表示,其中的一部分文字,第一个字节开头是1,第二字节开头是0

GB18030:最新的中文码表,目前还没有正式使用。

1、unicode:国际标准码表:无论是什么文字,都用两个字节存储。

l  Java中的char类型用的就是这个码表。char c = 'a';占两个字节。

l  Java中的字符串是按照系统默认码表来解析的。简体中文版 字符串默认的码表是GBK。

5、UTF-8:基于unicode,一个字节就可以存储数据,不要用两个字节存储,而且这个码表更加的标准化,在每一个字节头加入了编码信息(后期到api中查找)。

能识别中文的码表:GBK、UTF-8;正因为识别中文码表不唯一,涉及到了编码解码问题。

对于我们开发而言;常见的编码 GBK  UTF-8  ISO-8859-1

文字--->(数字) :编码。 “abc”.getBytes()  byte[]

(数字)--->文字 :  解码。 byte[] b={97,98,99}  new String(b)

字符输入流Reader

上述程序中我们读取拥有中文的文件时,使用的字节流在读取,那么我们读取到的都是一个一个字节。只要把这些字节去查阅对应的编码表,就能够得到与之对应的字符。API中是否给我们已经提供了读取相应字符的功能流对象,Reader,读取字符流的抽象超类。

l  read():读取单个字符并返回字符的编码值

l  read(char[]):将数据读取到数组中,并返回读取的个数。

FileReader类

查阅FileInputStream的API,发现FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。

打开FileReader的API介绍。用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的

l  构造方法

FileReader读取包含中文的文件

l  使用FileReader读取包含中文的文件

public class CharStreamDemo {

public static void main(String[] args) throws IOException {

//给文件中写中文

writeCNText();

//读取文件中的中文

readCNText();

}

//读取中文

public static void readCNText() throws IOException {

FileReader fr = new FileReader("D:\\test\\cn.txt");

int ch = 0;

while((ch = fr.read())!=-1){

//输出的字符对应的编码值

System.out.println(ch);

//输出字符本身

System.out.println((char)ch);

}

}

//写中文

public static void writeCNText() throws IOException {

FileOutputStream fos = new FileOutputStream("D:\\test\\cn.txt");

fos.write("欢迎你".getBytes());

fos.close();

}

}

字符输出流Writer

既然有专门用于读取字符的流对象,那么肯定也有写的字符流对象,查阅API,发现有一个Writer类,Writer是写入字符流的抽象类。其中描述了相应的写的动作。

flush();刷新

FileWriter类

查阅FileOutputStream的API,发现FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。

打开FileWriter的API介绍。用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。

l  构造方法

FileWriter写入中文到文件中

l  写入字符到文件中,先进行流的刷新,再进行流的关闭。

public class FileWriterDemo {

public static void main(String[] args) throws IOException {

//演示FileWriter 用于操作文件的便捷类。

FileWriter fw = new FileWriter("d:\\text\\fw.txt");

fw.write("你好谢谢再见");//这些文字都要先编码。都写入到了流的缓冲区中。

fw.flush();

fw.close();

}

}

flush()和close()的区别?

flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。

close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。

字符流练习

复制文本文件

练习:复制文本文件。

思路:

1,既然是文本涉及编码表。需要用字符流。

2,操作的是文件。涉及硬盘。

3,有指定码表吗?没有,默认就行。

操作的是文件,使用的 默认码表。使用哪个字符流对象。直接使用字符流操作文件的便捷类。FileReader  FileWriter

public class CopyTextFileTest {

public static void main(String[] args) throws IOException {

copyTextFile();

}

public static void copyTextFile() throws IOException {

//1,明确源和目的。

FileReader fr = new FileReader("c:\\cn.txt");

FileWriter fw = new FileWriter("c:\\copy.txt");

//2,为了提高效率。自定义缓冲区数组。字符数组。

char[] buf = new char[1024];

int len = 0;

while((len=fr.read(buf))!=-1){

fw.write(buf,0,len);

}

/*2,循环读写操作。效率低。

int ch = 0;

while((ch=fr.read())!=-1){

fw.write(ch);

}

*/

//3,关闭资源。

fw.close();

fr.close();

}

}

转载于:https://www.cnblogs.com/miaoxingren/p/9515556.html

java -IO流_字符流相关推荐

  1. python字节流和字符流_字符流与字节流

    [一]写在前面 简单总结一下分别用(一直混淆的)字节流or字符流读写文件. [二]字节流 2.1 字节流介绍 程序中的输入输出都是以流的形式保存的(输入流or输出流),流中保存的实际上全都是字节(一个 ...

  2. Java IO 字节流与字符流 (三)

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  3. [19/04/02-星期二] IO技术_字符流分类总结(含字符转换流InputStreamReader/ OutputStreamWriter,实现字节转字符)...

    一.概念 ------->1.BufferedReader/BufferedWriter [参考19.03.31文章] *Reader/Writer-------->2.InputStre ...

  4. java.IO字节流和字符流详解

    IO流的分类 在学习字节流和字符流之前因该先学习IO流的分类,效果会更好 有多种分类方式: 一种方式是按照流的方向进行分类: 以内存作为参照物, 往内存中去,叫做输入(Input).或者叫做读(Rea ...

  5. Java IO 字节流、字符流详解

    1. 字节流与字符流 流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接.类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流 ...

  6. java之高级的IO流,字符流与字节流

    IO流 今日内容介绍  标准输入流 & 转换流 & 打印流  对象操作流  Properties集合 第1章标准输入流 & 转换流 & 打印流 1.1标准输入输出 ...

  7. 01-21 IO流(字符流与字节流)

    IO流(字符流与字节流) 今日内容介绍  标准输入流 & 转换流 & 打印流  对象操作流  Properties集合 第1章标准输入流 & 转换流 & 打印流 ...

  8. 复习Java字节流_字符流使用及案例

    字节流_字符流 主要内容 IO流 字节流 字符流 异常处理 Properties 第一章 IO概述 1.1 什么是IO 生活中,你肯定经历过这样的场景.当你编辑一个文本文件,忘记了ctrl+s ,可能 ...

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

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

最新文章

  1. 1709: Fire or Retreat(zzuli)
  2. android studio导出apk步骤
  3. 混合云应用双活容灾实践
  4. 计数排序之python 实现源码
  5. 计算机课件比赛总结,课件制作比赛活动总结
  6. 高斯公式,斯克托斯公式
  7. Elasticsearch地理位置
  8. BMC AR 配置AREA LDAP
  9. Java虚拟机(三)垃圾标记算法与Java对象的生命周期
  10. 普洱学院java教务系统_2020年普洱学院教务处登录入口
  11. 使用计算机键盘的基本步骤,用键盘怎样关机(win7电脑键盘关机的操作方法)...
  12. 计算机硬盘的文件怎么删除文件,电脑硬盘删除文件怎么恢复
  13. c语言 L1-009 N个数求和 (20分)
  14. DW_axi_dmac控制器(概述)
  15. STM32F103ZET6的芯片工程改为STM32F103C8T6的工程
  16. 大米新闻微信小程序和Springboot新闻管理系统项目源码
  17. java需要记住什么英文_JAVA英语面试题(苦涩的记忆)
  18. Mysql翻页查询数据重复怎么办?
  19. Linux战地日记—date命令详细示例
  20. 实用技巧| 电脑系统提升20%上网速度,记得学会拿去装X哈

热门文章

  1. Perl Debug error: SetConsoleMode failed, LastError=|6|
  2. 为了测试Writer的发图功能,也为了让girls现身。
  3. 修改title样式_css常见样式命名规则
  4. html行间距1.8em,雅黑字体下WordPress 行高与字符间距最佳实践:1.8em与0.06em
  5. JAVA连接数据库使用的API是什么呢,如何使用JDBC API在Java中建立数据库连接?
  6. 和方舟rust一样的手游_方舟生存进化手游2.0版本的泰克科技有多强?恐龙大军都顶不住...
  7. serverless mysql_Serverless 解惑——函数计算如何访问 MySQL 数据库
  8. oracle雾化试图_Oracle创建物化视图
  9. 产品运行所需的信息检索失败_域名解析失败
  10. day13 内置函数一