Java IO5:字符流

字符流

字节流提供了处理任何类型输入/输出操作的功能(因为对于计算机而言,一切都是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,这将在下一篇文章进行讲解。

时间: 2024-10-16 01:59:43

Java IO5:字符流的相关文章

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

1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序列的对象被称为输入流:能够向其写入一个字节序列的对象被称为输出流. 2. 字节流 Java中的字节流处理的最基本单位为单个字节,它通常用来处理二进制数据.Java中最基本的两个字节流类是InputStream和OutputStream,它们分别代表了组基本的输入字节流和输出字节流.InputStre

java中字符流的知识点---IO学习笔记(三)

字符流: 文本和文本文件的区别: 文本: java的文本(char)是16位无符号整数,是字符的unicode编码(双字节编码). 文件: 文件是byte byte byte-的数据序列. 文本文件: 文本文件是文本(char)序列按照某种编码方案(utf-8,utf-16be,gbk)序列化为byte的存储结果. 字符流(Reader,Writer) 操作的是文本文件.对于mp3,二进制文件是字节文件不适合用字符流读取,因为读取出来的是char,没有意义. 字符的处理,一次处理一个字符 字符的

Java IO字符流与字节流

一.基本概念 流:从一端流向另一端,从源头到目的地. 始终与程序为中心,都是程序与文件|数组|网络连接|数据库进行操作. 二.IO流分类 1.流向: 输入流和输出流 2.数据: 字节流:二进制,可以处理文本文件,视频,音频等 . 字符流:文本文件,只能处理纯文本,全款为可见字符(.txt..html). 3.功能: 节点:包裹源头 处理:增强功能,提高性能. 三.字节流与字符流 1.字节流 输入流:InputStream int read(byte[] b) int read(byte[] b,

Java: IO 字符流

FileInputStream和FileOutputStream分别是InputStream和OutputStream的子类,都是字节流.下面例子中有三个方法可以读写字节流: 1.一个一个的 2.一组一组的,可以自定义字节数组的长度 3.使用available方法,可以返回目标文件的长度从而利用该特性建立一个刚刚好长度的字节数组.但该方法有使用风险,例如目标文件过大,一个电影或者一个大数据文件,则会导致超过虚拟机内存的大小,从而出现错误.所以使用该方法要评估风险,如果可以确定目标是小文件,则可以

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

字符流处理的单元为2个字节的Unicode字符,分别操作字符.字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组.所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,所以它对多国语言支持性比较好!如果是音频文件.图片.歌曲,就用字节流好点,如果是关系到中文(文本)的,用字符流好点. 所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘.在读取文件(特别是文本文件)时,也是一个字节一

Java 字节流 字符流 转换流

我们知道Java中的流分为字符流和字节流,其中字符流主要针对字符文本进行处理,而字节流处理范围更为广泛,毕竟图片.电影等只要是文件都是以二进制的形式存在的,而不是字符. 字符流: FileReader FileWriter. BufferedReader BufferedWriter 字节流: FileInputStream FileOutputStream BufferedInputStream BufferedOutputStream 我们看一下J2SE文档: BufferedReader(

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

字符流读数据 – 按单个字符读取 创建字符流读文件对象: Reader reader = new FileReader("readme.txt"); 调用方法读取数据: int data = reader.read(); // 读取一个字符,返回该字符代表的整数,若到达流的末尾,返回-1 字符流读数据 – 按字符数组读取 创建字符流读文件对象: Reader reader = new FileReader("readme.txt"); 调用方法读取数据: // 读取

java - io字符流

1.字符流是什么 字符流是可以直接读写字符的io流 字符流读取字符,就是要先读取到字节数据,然后转为字符,如果要写出字符,需要把字符转为字节再写出 2.FileReader FileReader类的read(),可以按照字符大小读数 读取的是单个字符,返回的是int 读取字符,如果已到达流的末尾,则返回-1 3.FileWrite 写出字符 拷贝: 什么时候使用字符流: 字符流也可以拷贝文本文件,但不推荐使用,因为读取时会把字节转为字符,写出时还要把字符转回字节 程序需要读取一段文本,或者需要写

java -io字符流FileWrite操作演示

FileWriter字符输出流演示: /* * FiileWriter 字符流的操作 * FileWriter 的构造方法 可传递 File类型 还可以传递String类型 * * 方法 : * write(int c) 传递一个字节 * write(char[] a ) 传递一个字符数组 * write(char[]a , 开始索引 , 传递几个) * write(String s) 传递一个字符串 * * 注意:写完之后一定要刷新缓冲区 不然数据 写入不进 * 对象.flush() * */

Java+字节流+字符流转换

原文地址:http://blog.51cto.com/janephp/2150039