[Java IO]03_字符流

Java程序中,一个字符等于两个字节。 Reader 和 Writer 两个就是专门用于操作字符流的类。

Writer

Writer是一个字符流的抽象类。 

它的定义如下:

public abstract class Writer implements Appendable, Closeable, Flushable

直接子类

BufferedWriter, 

CharArrayWriter, 

FilterWriter, 

OutputStreamWriter, 

PipedWriter, 

PrintWriter, 

StringWriter

详细细节可以参考Java API文档。

Reader

Reader是读取字符流的抽象类。

它的定义如下:

public abstract class Reader implements Readable, Closeable

直接子类

BufferedReader, 

CharArrayReader, 

FilterReader, 

InputStreamReader, 

PipedReader, 

StringReader

字节流 vs 字符流

字节流和字符流的使用方式非常相似,都有read()、write()、close()、flush()这样的方法。

它们的有以下几点:

区别

(1)操作数据

字节流

主要操作byte类型的数据。主要核心类是InputStream类和OutputStream类。

字符流

主要操作字符,一个字符等于两个字节。主要核心类是Reader类和Writer类。

(2)是否使用缓冲区

字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的。

字符流在操作时是使用了缓冲区,通过缓冲区再操作文件。

(3)字节流和字符流哪个好

所有的文件在硬盘或传输时都是以

字节方式保存的,例如图片,影音文件等都是按字节方式存储的。

字符流无法读写这些文件。所以,除了纯文本数据文件使用字符流以外,其他文件类型都应该使用字节流方式。

文件字符流

文件字符流有两个类:FileWriter 和 FileReader。

它们提供了方法将字符写入到文件和将数据以字符形式从文件中读取出来。

一般情形下,文件字节流操作遵循以下几个步骤: (1)使用File类绑定一个文件。 (2)把File对象绑定到流对象上。 (3)进行读、写操作。 (4)关闭输入、输出。

FileWriter

例 向文件中写入数据

import java.io.File;
import java.io.Writer;
import java.io.FileWriter;

public class WriterDemo {
 public static void main(String args[]) throws Exception { // 异常抛出,不处理
 // 第1步、使用File类找到一个文件
        File f = new File("d:" + File.separator + "test.txt"); // 声明File对象
 
 // 第2步、通过子类实例化父类对象
        Writer out = new FileWriter(f);
 // Writer out = new FileWriter(f, true); // 追加内容方式
 
 // 第3步、进行写操作
        String str = "Hello World!!!\r\n";
        out.write(str); // 将内容输出
 
 // 第4步、关闭输出流
        out.close();
    }
};

FileReader

例 从文件中读取内容

import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.io.FileReader;

public class ReaderDemo01 {
 // 将所有内容直接读取到数组中
 public static int read1(Reader input, char[] c) throws IOException {
 int len = input.read(c); // 读取内容
 return len;
    }

 // 每次读取一个字符,直到遇到字符值为-1,表示读文件结束
 public static int read2(Reader input, char[] c) throws IOException {
 int temp = 0; // 接收每一个内容
 int len = 0; // 读取内容
 while ((temp = input.read()) != -1) {
 // 如果不是-1就表示还有内容,可以继续读取
            c[len] = (char) temp;
            len++;
        }
 return len;
    }

 public static void main(String args[]) throws Exception {
 // 第1步、使用File类找到一个文件
        File f = new File("d:" + File.separator + "test.txt");

 // 第2步、通过子类实例化父类对象
        Reader input = new FileReader(f);

 // 第3步、进行读操作
 char c[] = new char[1024];
//        int len = read1(input, c);
 int len = read2(input, c);

 // 第4步、关闭输出流
        input.close();
        System.out.println("内容为:" + new String(c, 0, len)); // 把字符数组变为字符串输出
    }
};

参考资料

《Java编程思想》

《Java开发实战经典》 

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏盛国存的专栏

A Bite of GoLang(上)

A bite of GoLang(浅尝GoLang),本文只是Go语言的冰山一角,本文包含作者学习Go语言期间积累的一些小的经验,同时为了方便让读者了解到Go语...

50410
来自专栏Golang语言社区

动手实现一个JSON验证器(上)

分析 既然要验证JSON的有效性,那么必然需要清楚的知道JSON格式,这个在JSON官网已经给我们画出来了: ? ? ? ? ? 从官方的图上面可以看出,JSO...

3837
来自专栏云霄雨霁

词法分析程序

1420
来自专栏Python爱好者

Java基础笔记20

1014
来自专栏极客慕白的成长之路

Python字符串格式化

格式化字符串时,Python使用一个字符串作为模板。模板中有格式符,这些格式符为真实值预留位置,并说明真实数值应该呈现的格式。Python用一个tuple将多个...

972
来自专栏Python爱好者

Java基础笔记21

1354
来自专栏专注 Java 基础分享

Java 的字节流文件读取(二)

1341
来自专栏飞雪无情的博客

Go语言实战笔记(十九)| Go Writer 和 Reader

Go Writer 和 Reader接口的设计遵循了Unix的输入和输出,一个程序的输出可以是另外一个程序的输入。他们的功能单一并且纯粹,这样就可以非常容易的编...

621
来自专栏微信公众号:Java团长

Java IO流学习总结

流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直...

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

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

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

3309

扫码关注云+社区