Java IO详解(四)------字符输入输出流

 File 类的介绍:https://cloud.tencent.com/developer/article/1012532

Java IO 流的分类介绍:https://cloud.tencent.com/developer/article/1012539

Java IO 字节输入输出流:https://cloud.tencent.com/developer/article/1012565

那么这篇博客我们讲的是字节输入输出流:Reader、Writer(下图红色长方形框内),红色椭圆框内是其典型实现(FileReader、FileWriter)

①、为什么要使用字符流?

  因为使用字节流操作汉字或特殊符号语言的时候容易乱码,因为汉字不止一个字节,为了解决这个问题,建议使用字符流。

②、什么情况下使用字符流?

  一般可以用记事本打开的文件,我们可以看到内容不乱码的。就是文本文件,可以使用字符流。而操作二进制文件(比如图片、音频、视频)必须使用字节流

 1、字符输出流:FileWriter

public abstract class Writer
  extends Object
  implements Appendable, Closeable, Flushable

  用于写入字符流的抽象类

  方法摘要:

  下面我们用 字符输出流 Writer  的典型实现 FileWriter 来介绍这个类的用法:

//1、创建源
		File srcFile = new File("io"+File.separator+"a.txt");
		//2、创建字符输出流对象
		Writer out = new FileWriter(srcFile);
		//3、具体的 IO 操作
			/***
			 * void write(int c):向外写出一个字符
			 * void write(char[] buffer):向外写出多个字符 buffer
			 * void write(char[] buffer,int off,int len):把 buffer 数组中从索引 off 开始到 len个长度的数据写出去
			 * void write(String str):向外写出一个字符串
			 */
		//void write(int c):向外写出一个字符
		out.write(65);//将 A 写入 a.txt 文件中
		//void write(char[] buffer):向外写出多个字符 buffer
		out.write("Aa帅锅".toCharArray());//将 Aa帅锅 写入 a.txt 文件中
		//void write(char[] buffer,int off,int len)
		out.write("Aa帅锅".toCharArray(),0,2);//将 Aa 写入a.txt文件中
		//void write(String str):向外写出一个字符串
		out.write("Aa帅锅");//将 Aa帅锅 写入 a.txt 文件中
		
		//4、关闭流资源
		/***
		 * 注意如果这里有一个 缓冲的概念,如果写入文件的数据没有达到缓冲的数组长度,那么数据是不会写入到文件中的
		 * 解决办法:手动刷新缓冲区 flush()
		 * 或者直接调用 close() 方法,这个方法会默认刷新缓冲区
		 */
		out.flush();
		out.close();

 2、字符输入流:Reader

public abstract class Reader
  extends Object
  implements Readable, Closeable

  用于读取字符流的抽象类。

  方法摘要:

  下面我们用 字符输入流 Reader  的典型实现 FileReader 来介绍这个类的用法:

//1、创建源
		File srcFile = new File("io"+File.separator+"a.txt");
		//2、创建字符输出流对象
		Reader in = new FileReader(srcFile);
		//3、具体的 IO 操作
			/***
			 * int read():每次读取一个字符,读到最后返回 -1
			 * int read(char[] buffer):将字符读进字符数组,返回结果为读取的字符数
			 * int read(char[] buffer,int off,int len):将读取的字符存储进字符数组 buffer,返回结果为读取的字符数,从索引 off 开始,长度为 len
			 * 
			 */
		//int read():每次读取一个字符,读到最后返回 -1
		int len = -1;//定义当前读取字符的数量
		while((len = in.read())!=-1){
			//打印 a.txt 文件中所有内容
			System.out.print((char)len); 
		}
		
		//int read(char[] buffer):将字符读进字符数组
		char[] buffer = new char[10]; //每次读取 10 个字符
		while((len=in.read(buffer))!=-1){
			System.out.println(new String(buffer,0,len));
		}
		
		//int read(char[] buffer,int off,int len)
		while((len=in.read(buffer,0,10))!=-1){
			System.out.println(new String(buffer,0,len));
		}
		//4、关闭流资源
		in.close();

3、用字符流完成文件的复制

/**
		 * 将 a.txt 文件 复制到 b.txt 中
		 */
		//1、创建源和目标
		File srcFile = new File("io"+File.separator+"a.txt");
		File descFile = new File("io"+File.separator+"b.txt");
		//2、创建字符输入输出流对象
		Reader in = new FileReader(srcFile);
		Writer out = new FileWriter(descFile);
		//3、读取和写入操作
		char[] buffer = new char[10];//创建一个容量为 10 的字符数组,存储已经读取的数据
		int len = -1;//表示已经读取了多少个字节,如果是 -1,表示已经读取到文件的末尾
		while((len=in.read(buffer))!=-1){
			out.write(buffer, 0, len);
		}
		
		//4、关闭流资源
		out.close();
		in.close();

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏闻道于事

Java I/O流输入输出,序列化,NIO,NIO.2

30030
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-20(01)总结,递归,IO流

1:递归(理解) (1)方法定义中调用方法本身的现象 举例:老和尚给小和尚讲故事,我们学编程 (2)递归的注意事项; A:要有出口,否则就是死递归 B...

36690
来自专栏Crossin的编程教室

【编程课堂】文本包装 textwrap

欢迎回到编程课堂,本周我们将了解一个与文字处理相关的模块—— textwrap,依照惯例,此处应该有一思考题: 现在有一文本文件 ‘abc.txt’,有 100...

351100
来自专栏Ryan Miao

Java XML解析工具 dom4j介绍及使用实例

Java XML解析工具 dom4j介绍及使用实例 dom4j介绍   dom4j的项目地址:http://sourceforge.net/projects/d...

40960
来自专栏Coding迪斯尼

自制Monkey语言编译器:解释执行哈希表对象

我们在上节完成了对哈希表对象的解析,这一节我们给编译器添加执行哈希表对象的功能,完成本节代码后,编译器能执行以下代码:

9420
来自专栏Java帮帮-微信公众号-技术文章全总结

Java基础-22总结转换流,随机访问流,合并流,序列化流,Properties

(3)转换流: package cn.itcast_04; import java.io.BufferedWriter; import java.io.IOEx...

45170
来自专栏Java3y

JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】

什么是EL表达式? 表达式语言(Expression Language,EL),EL表达式是用"${}"括起来的脚本,用来更方便的读取对象! EL表达式主要用来...

51870
来自专栏码云1024

不同方式复制文件效率的比较

33260
来自专栏开发与安全

《linux c 编程一站式学习》课后部分习题解答

1、假设变量x和n是两个正整数,我们知道x/n这个表达式的结果要取Floor,例如x是17,n是4,则结果是4。如果希望结果取Ceiling应该怎么写表达式呢?...

48160
来自专栏老马说编程

(57) 二进制文件和字节流 / 计算机程序的思维逻辑

查看历史文章,请点击上方链接关注公众号。 本节我们介绍在Java中如何以二进制字节的方式来处理文件,上节我们提到Java中有流的概念,以二进制方式读写的主要流有...

271100

扫码关注云+社区

领取腾讯云代金券