好了,昨天讲了字节流,现在我们就来讲字符流吧。。。

字符流可以这样理解,字符流 = 字节流 + 编码表,目的是为了更好的操作中文字符(注:字符流只可以可以操作字符类型的文件,不能操作影音图像文件,要操作这些文件必须使用字节流)

我们先看看字符流有几类:

A:OutputStreamWriter             (父类Writer)

OutputStreamWriter(OutputStream os):默认编码,GBK

OutputStreamWriter(OutputStream os,String charsetName):指定编码。

B:InputStreamReader              (父类Reader)

InputStreamReader(InputStream is):默认编码,GBK

InputStreamReader(InputStream is,String charsetName):指定编码

注:编码问题只要输入和输出流的编码一致即可。

C:FileWriter           (父类OutputStreamWriter)

FileWriter(File file)

FileWriter(String fileName)

FileWriter(File file,
boolean append)

用来写入字符文件的便捷类 ,通常我们操作字符流采取这个类即可,因为它是继承自OutputStreamWriter的类,方法和父类的一样,而且构造方法比较简便,当然使用上面的OutputStreamWriter(OutputStream
os)也行,参数是一个字节流对象。

D:FileReader           (父类InputStreamReader)

用来读取字符文件的便捷类

E:BufferedWriter         (父类Writer)

BufferedWriter(Writer out)

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

F:BufferedReader       (父类Reader)

BufferedReader(Reader in)

从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

注:为了获得最高效率,可考虑将 OutputStreamWriter或FileWriter 包装到 BufferedWriter
中,将 OutputStreamReader或FileReader 包装到 BufferedReader 中。

下面我们通过代码来具体看看字符流怎么使用:

1、OutputStreamWriter和InputStreamReader

public static void OutputStreamWriter() throws IOException{
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("c.txt"));
		char[] ch = new char[]{'a','b','c','d','e'};
		osw.write(ch);//字符数组形式写入
		osw.write(ch, 0, 3);//字符数组一部分写入
		osw.write("你好吗");//字符串形式写入
		osw.flush();//刷新,将缓冲区的数据写入到文件中
		osw.close();
		InputStreamReader isr = new InputStreamReader(new FileInputStream("c.txt"));
		char[] ch2 = new char[1024];
		int len = -1;
		while((len = isr.read(ch2))!=-1){//一次读1024个字符
			System.out.print(new String(ch2,0,len));//将读取到的字符转化为字符串显示出来
		}
		isr.close();
	}

结果为:abcdeabc你好吗

2、FileWriter 和FileReader

public static void FileWriterDemo() throws IOException{
		FileReader fr = new FileReader("a.txt");//创建一个读取字符流对象,并指向a.txt这个文件
		FileWriter fw = new FileWriter("b.txt");
		char[] ch = new char[1024];
		int len = -1;
		while((len=fr.read(ch))!=-1){//一次读1024个字符
			fw.write(ch, 0, len);//将读到多少数据写入缓冲区中
			fw.flush();//刷新缓冲区把数据写入文件中
		}
		fw.close();
		fr.close();
	}

3、最高效的BufferedWriter 和BufferedReader,缓冲字符流

  • 普通方式:
public static void Bufferwriter() throws IOException{
		//BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("a.txt")));
		BufferedReader br = new BufferedReader(new FileReader("a.txt"));//包装字符流
		BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));//包装字符流
		int len = -1;
		char[] cbuf = new char[1024];
		while((len=br.read(cbuf))!=-1){
			bw.write(cbuf, 0, len);//将读到多少数据写入缓冲区中
			bw.flush();//刷新缓冲区把数据写入文件中
		}
		bw.close();
		br.close();
	} 
BufferedReader特有方式,一次读取一行的数据,即读一行字符串:
public static void BufferDemo() throws IOException{
		BufferedReader br = new BufferedReader(new FileReader("a.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("b.txt"));
		String line = null;
		while((line=br.readLine())!=null){//br.readLine()返回值是一个字符串,因为它是一次读取一行字符串数据。当它返回值为null时,表示读取完毕
			bw.write(line);//写入刚刚读取到的字符串到缓冲区
			bw.newLine();//换行
			bw.flush();//将缓冲区的字符串写入文件中,如果不刷新,那么就没有数据写入
		}
		bw.close();//将写入流关闭时会默认刷新一遍缓冲区,建议在每写一遍数据时候调用flush()刷新一遍
		br.close();
	}

ok,字符流就讲完了。

java之IO流详解(二)的更多相关文章

  1. Java io流详解二

    原文地址https://www.cnblogs.com/xll1025/p/6418766.html 一.IO流概述 概述: IO流简单来说就是Input和Output流,IO流主要是用来处理设备之间 ...

  2. Java之IO流详解

    IO流 Input/Output 完成输入/输出 应用程序运行时——数据在内存中  ←→ 把数据写入硬盘(磁带)  内存中的数据不可持久保存的  输入:从外部存储器(硬盘.磁带.U盘)把数据读入内存. ...

  3. JAVA中IO流详解

    IO流:数据传输是需要通道的,而IO流就是数据传输的通道. IO流可以形象的比喻为运送货物的传输带. IO流的分类: ①根据操作的数据类型的不同可以分为 :字节流与字符流. ②根据数据的流向分为:输入 ...

  4. java之IO流详解(一)

    IO流的分类: A:流向 输入流 读取数据 输出流 写出数据 B:数据类型 字节流 字节输入流  InputStream 字节输出流  OutputStream 字符流 字符输入流  Reader 字 ...

  5. 基于JavaSE阶段的IO流详解

    1.IO流基本概述 在Java语言中定义了许多针对不同的传输方式,最基本的就是输入输出流(俗称IO流),IO流是属于java.io包下的内容,在JavaSE阶段主要学下图所示的: 其中从图中可知,所有 ...

  6. Java IO流详解(二)——File类

    在上一章博客中简单的介绍了Java IO流的一些特征.也就是对文件的输入输出,既然至始至终都离不开文件,所以Java IO流的使用得从File这个类讲起. File类的描述:File类是文件和目录路径 ...

  7. Java io流详解四

    转载地址:http://www.cnblogs.com/rollenholt/archive/2011/09/11/2173787.html 写在前面:本文章基本覆盖了java IO的全部内容,jav ...

  8. Java io流详解一

    原文地址http://www.cnblogs.com/xdp-gacl/p/3634409.html java基础学习总结——流 一.JAVA流式输入/输出原理

  9. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

随机推荐

  1. [Codeforces 920E]Connected Components?

    Description 题库链接 给你一个 \(n\) 个点 \(m\) 条边的无向图,求其补图的连通块个数及各个连通块大小. \(1\leq n,m\leq 200000\) Solution 参考 ...

  2. [HAOI2007]分割矩阵

    题目描述 将一个a*b的数字矩阵进行如下分割:将原矩阵沿某一条直线分割成两个矩阵,再将生成的两个矩阵继续如此分割(当然也可以只分割其中的一个),这样分割了(n-1)次后,原矩阵被分割成了n个矩阵.(每 ...

  3. [FJOI2007]轮状病毒

    题目描述 轮状病毒有很多变种.许多轮状病毒都是由一个轮状基产生.一个n轮状基由圆环上n个不同的基原子和圆心的一个核原子构成.2个原子之间的边表示这2个原子之间的信息通道,如图1. n轮状病毒的产生规律 ...

  4. ●51NOD 1705 七星剑

    题链: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1705题解: 期望dp,期望的线性性质 (首先对于第k颗星,一定只 ...

  5. 【NOIP2011TG】solution

    老师最近叫我把NOIPTG的题目给刷掉,于是就开始刷吧= = 链接:https://www.luogu.org/problem/lists?name=&orderitem=pid&ta ...

  6. hdu5630 BestCoder Round #73 (div.2)

    Rikka with Chess  Accepts: 393  Submissions: 548  Time Limit: 2000/1000 MS (Java/Others)  Memory Lim ...

  7. oracle安装过程和创建本地数据库

    环境: win7 64位 工具: PLSQL Developer 百度云下载:链接:https://pan.baidu.com/s/14L3VCG8YwHzpdhEN7ama0w 密码:jlre or ...

  8. 笔记8 AOP练习2

    场景描述: 一张唱片有好多磁道,假设每个磁道只有一首歌,现在需要记录每首歌的播放次数,然后输出. 主要业务:歌曲播放 辅助功能:记录播放次数(切面) 1.创建唱片接口,CompactDiscs.jav ...

  9. pix2code:从截图生成图形用户界面代码

    将设计人员创建的图形用户界面截图转换为计算机代码是开发人员为构建定制的软件,网站和移动应用程序而进行的一项典型任务. 在本文中,我们展示了深入的学习方法可以用于训练一个端对端的模型,以便从三个不同的平 ...

  10. Go 实现 NumberFormat 函数

    [转] http://www.syyong.com/Go/Go-implements-the-NumberFormat-algorithm.html NumberFormat - 以千位分隔符方式格式 ...