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

①、为什么要使用字符流?
因为使用字节流操作汉字或特殊符号语言的时候容易乱码,因为汉字不止一个字节,为了解决这个问题,建议使用字符流。
②、什么情况下使用字符流?
一般可以用记事本打开的文件,我们可以看到内容不乱码的。就是文本文件,可以使用字符流。而操作二进制文件(比如图片、音频、视频)必须使用字节流
1、字符输出流:FileWriter
|
1
2
3
|
public abstract class Writer extends Object implements Appendable, Closeable, Flushable |
用于写入字符流的抽象类
方法摘要:

下面我们用 字符输出流 Writer 的典型实现 FileWriter 来介绍这个类的用法:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
//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
|
1
2
3
|
public abstract class Reader extends Object implements Readable, Closeable |
用于读取字符流的抽象类。
方法摘要:

下面我们用 字符输入流 Reader 的典型实现 FileReader 来介绍这个类的用法:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
|
//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、用字符流完成文件的复制
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
/** * 将 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(); |
《四》JAVA 字符输入输出流的更多相关文章
- Java IO详解(四)------字符输入输出流
File 类的介绍:http://www.cnblogs.com/ysocean/p/6851878.html Java IO 流的分类介绍:http://www.cnblogs.com/ysocea ...
- Java中的字节输入出流和字符输入输出流
Java中的字节输入出流和字符输入输出流 以下哪个流类属于面向字符的输入流( ) A BufferedWriter B FileInputStream C ObjectInputStream D In ...
- 深入理解Java输入输出流
Java.io包的File类,File类用于目录和文件的创建.删除.遍历等操作,但不能用于文件的读写. Java 对文件的写入和读取涉及到流的概念,写入为输出流,读取为输入流.如何理解流的概念呢?可以 ...
- Java输入输出流(一)——常用的输入输出流
1.流的概念:在Java中,流是从源到目的地的字节的有序序列.Java中有两种基本的流--输入流(InputStream)和输出流(OutputStream). 根据流相对于程序的另一个端点的不同,分 ...
- Java输入/输出流体系
在用java的io流读写文件时,总是被它的各种流能得很混乱,有40多个类,理清啦,过一段时间又混乱啦,决定整理一下!以防再忘 Java输入/输出流体系 1.字节流和字符流 字节流:按字节读取.字符流: ...
- java基础---->java输入输出流
今天我们总结一下java中关于输入流和输出流的知识,博客的代码选自Thinking in java一书.我突然很想忘了你,就像从未遇见你. java中的输入流 huhx.txt文件的内容如下: I l ...
- Java精选笔记_IO流(字符输入输出流、字符文件输入输出流、字符流的缓冲区)
字符流 Reader是字符输入流的基类,用于从某个源设备读取字符 Writer是字符输出流,用于向某个目标设备写入字符 字符流操作文件 字符输入流FileReader,通过此流可以从关联的文件中读取一 ...
- Java基础 FileReader-FileWriter / 缓冲字符输入输出流 / 缓冲字节输入输出流 三种方式 进行文本文件的复制
易错的地方: /** 出错的地方: * 1.缓冲流儿输出时,务必:flush();不然可能输出不尽! * 2. bw缓冲字符输出流,记得这里! bw.write(b,0,len); * 3.字符流不能 ...
- java中字符输入输出流在输出结果的结尾多一个乱码字符:'?'
原因以及解决方法: 核心方法如下: public static void main(String[] args) throws Exception{ // TODO Auto-generated me ...
随机推荐
- [Python] Pandas load DataFrames
Create an empty Data frame with date index: import pandas as pd def test_run(): start_date='2017-11- ...
- 理解Linq查询
using System; using System.Linq; static class Program { static double Square(double n) { Console.Wri ...
- legend---七、jquery如何选中select的selected的选择上的自定义属性
legend---七.jquery如何选中select的selected的选择上的自定义属性 一.总结 一句话总结:用冒号属性选择器 var type=$(this).children('option ...
- spring security oauth2 架构---官方
原文地址:https://projects.spring.io/spring-security-oauth/docs/oauth2.html Introduction This is the user ...
- excel操作小技巧
excel拼接sql语句时,时间格式问题 问题:若直接插入时间的单元格 :="insert into t_entity_car (create_time,name,age) value (' ...
- js编码方式详解
escape.encodeURI 和encodeURIComponent 的区别 escape(), encodeURI()和encodeURIComponent()是在Javascript中用于编码 ...
- unbound和mail服务的部署和简单应用
1.服务的介绍 Unbound是一个缓存DNS解析器.unbound官网 它使用根区域的内置权威名称服务器列表 (.),所谓的根提示.在收到DNS查询时,它会询问 答案的根名称服务器,几乎在所有情况下 ...
- 发送邮件被退回,提示: Helo command rejected: Invalid name 错误
我自己配置的 postfix + dovecot server, 配置了outlook 后, 相同的账号. 在有的电脑上能收发成功, 在有的电脑上发送邮件就出现退信.提示 Helo command r ...
- 数据库范式小结 1NF 2NF BCNF 3NF 4NF DB normal form
1. 1NF指关系中的每个变量不可再分 2. 2NF指消除了非主属性对码(candidate key)的部分依赖的1NF 比如(S#,C#)-> SN ,(S#,C#)-> SD .S#- ...
- MySQL架构组成之逻辑模块组成
MySQL 能够看成是二层架构 第一层SQL Layer.包含权限推断.sql 解析.运行计划优化,query cache 的处理等等. 第二层存储引擎层(Storage Engine Lay ...