字符流

字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是0和1,只需把数据以字节形式表示就够了),但它们不可以直接操作Unicode字符,因为上一篇文章写了,一个Unicode字符占用2个字节,而字节流一次只能操作一个字节。既然Java的口号就是"一次编写、处处运行",那么包含直接的字符输入/输出的支持是必要的。因此就有一些字符输入/输出流,之前已经说明过了,字符流顶层是Reader和Writer这两个抽象类,因此就从这里开始本文。

Reader

Reader是定义Java的字符输入流的抽象类,该类的所有方法在出错的情况下都将引发IOException。Reader类中有这些方法:

方    法 作    用
abstract void close() 关闭该流并释放与之关联的所有资源
void mark(int readAheadLimit) 标记流中的当前位置
boolean markSupported() 判断此流是否支持mark()操作
int read() 从文件中读取单个字符
int read(char[] cbuf) 从文件中读取字符到cbuf
abstract int read(char[] cbuf, int off, int len) 将文件中的字符读入cbuf数组,从off位置开始,读取len个字符。三个read方法在字符可用、发生I/O异常或者已经到达流的末尾前,此方法会一直阻塞
int read(CharBuffer target) 试图将文件中的字符读入指定的字符缓冲区
boolean ready() 判断是否准备读取此流
voi reset() 重置该流
long skip(long n) 跳过n个字符

Writer

Writer是定义字符输出流的抽象类,所有该类的方法都返回一个void值并在出错的条件下引发IOException。Writer类中的方法有:

方    法 作    用
Writer append(char c) 将制定字符添加到此writer
Writer append(CharSequence csq) 将制定字符序列添加到此writer
Writer append(CharSequence csq, int start, int end) 将指定字符序列的子序列添加到此writer.Appendable
abstract void close() 关闭此流,但要先flush()它
abstract void flush() 刷新该流的缓冲
void write(char[] cbuf) 将cbuf中的内容写入文件
abstract void write(char[] cbuf, int off, int len) 将字符数组cbuf中从off开始的len个字节写入文件
void write(int c) 写入单个字符到文件中
void write(String str) 写入字符串到文件中
void write(String str, int off, int len) 写入str从off位置开始的len个字符到文件中

FileReader和FileWriter

FileReader类创建了一个可以读取文件内容的Reader类,最常用的构造方法是:

1、FileReader(String fileName)

2、FileReader(File file)

FileWriter创建了一个可以写文件的Writer类,最常用的构造方法是:

1、FileWriter(String fileName)

2、FileWriter(String fileName, boolean append)

3、FileWriter(File file)

其中第二个构造方法,如果append为true,那么输出是追加到文件结尾的FileWriter类的创建不依赖文件是否存在,在创建文件之前,FileWriter将在创建对象时打开它来作为输出。如果试图打开一个只读文件,那么将引发一个IOException。看一下FileWriter和FileReader的使用,现在D盘目录下没有"writer.txt":

public static void main(String[] args) throws Exception
{
File file = new File("D:/writer.txt");
Writer out = new FileWriter(file);
// 声明一个String类型对象
String str = "Hello World!!!";
out.write(str);
out.close(); // 读文件操作
Reader in = new FileReader(file);
// 开辟一个空间用于接收文件读进来的数据
char c0[] = new char[1024];
int i = 0;
// 将c0的引用传递到read()方法之中,同时此方法返回读入数据的个数
i = in.read(c0);
in.close(); if (-1 == i)
{
System.out.println("文件中无数据");
}
else
{
System.out.println(new String(c0, 0, i));
}
}

利用FileWriter和FileReader进行了一次的读写操作,先看一下D盘下是否有"writer.txt",假如有"writer.txt"那"writer.txt"中又是什么:

看来利用FileWriter写入一个内存中的字符串到文件中是成功了,那么利用利用FileReader读入文件中的内容到内存呢,看一下运行结果:

Hello World!!!

打印结果和文件中的内容一致,说明FileReader的操作也成功。

这就是FileWriter和FileReader的使用,和FileOutputStream和FileInputStream的使用差不多,不过实际操作中一般不会用FileWriter和FileReader,这将在下一篇文章进行讲解。

Java IO5:字符流的更多相关文章

  1. Java Io 字符流

    Java Io 字符流包含: 1. InputStreamReader  它是由byte流解析为char流,并且按照给定的编码解析. 2. OutputStreamWrite  它是char流到byt ...

  2. 理解Java中字符流与字节流

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...

  3. 理解Java中字符流与字节流的区别(转)

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  4. Java IO: 字符流的Buffered和Filter

    作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍缓冲与过滤相关的reader和writer,主要涉及BufferedReader.B ...

  5. Java IO: 字符流的Piped和CharArray

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍管道与字符数组相关的reader和writer,主要涉及PipedReader.Pip ...

  6. 理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  7. Java中字符流与字节流的区别

    字符流处理的单元为2个字节的Unicode字符,分别操作字符.字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组.所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单 ...

  8. Java:文件字符流和字节流的输入和输出

    最近在学习Java,所以就总结一篇文件字节流和字符流的输入和输出. 总的来说,IO流分类如下: 输入输出方向:     输入流(从外设读取到内存)和输出流(从内存输出到外设) 数据的操作方式: 字节流 ...

  9. Java之字符流操作-复制文件

    package test_demo.fileoper; import java.io.*; /* * 字符输入输出流操作,复制文件 * 使用缓冲流扩展,逐行复制 * */ public class F ...

  10. Java之字符流读写文件、文件的拷贝

    字符流读数据 – 按单个字符读取 创建字符流读文件对象: Reader reader = new FileReader("readme.txt"); 调用方法读取数据: int d ...

随机推荐

  1. 有向图强连通分量的Tarjan算法

    有向图强连通分量的Tarjan算法 [有向图强连通分量] 在有向图G中,如果两个顶点间至少存在一条路径,称两个顶点强连通(strongly connected).如果有向图G的每两个顶点都强连通,称G ...

  2. SQLYog快捷键大全

    Ctrl+M   创建一个新的连接 Ctrl+N   使用当前设置新建连接 Ctrl+F4   断开当前连接 对象浏览器 F5   刷新对象浏览器(默认) Ctrl+B   设置焦点于对象浏览器 SQ ...

  3. Tier和RBD Cache的区别

    相同点 缓存 数据不会持久保存在ssd或者内存:预读回写直写 都需要解决缓存数据和磁盘数据不一致和“内存页”置换的问题. 差异点 缓存的位置不同,tier是rados层在osd端进行数据缓存,也就是说 ...

  4. iOS Xcode添加ios10.0的路径

    /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport

  5. js中typeof与instanceof用法区别

    今天写JS代码,遇到动态生成多个名称相同的input复选按钮 需要判断其是否是数组,用到了if (typeof(document.MapCheckMgr.checkid)!="undefin ...

  6. 【转】Crontab定时任务配置

    原文出处:http://www.cnblogs.com/kerrycode/p/3238346.html CRONTAB概念/介绍 crontab命令用于设置周期性被执行的指令.该命令从标准输入设备读 ...

  7. IE6的连接数限制问题

    今天解决了一个bug.看似是UI的bug,最后发现IE的设置问题(严格来说,IE6这么做没有问题,因为HTTP协议的规范如此). 先描述一下问题: 有一个页面管理Job,选中一些Job可以Run,每次 ...

  8. Hibernate配置步骤

    1.创建WEB项目 2.从http://www.hibernate.org/下载hibernate-release-4.3.11.Final.zip,并解压. 3.将hibernate必须的包加入li ...

  9. Surfer 软件做等值线图

    使用surfer软件做等值线图 Surfer软件美国Golden Software公司编制的一款以画三维图(等高线,image map,3d surface)的软件. Surfer具有的强大插值功能和 ...

  10. pd name与comment互换,或者code互换,总之互换

    1 PowerDesigner中批量根据对象的name生成comment的脚本 执行方法:Open PDM -- Tools -- Execute Commands -- Run Script Opt ...