[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 条评论
登录 后参与评论

相关文章

来自专栏每日一篇技术文章

Swift3.0 - 枚举

552
来自专栏二进制文集

JDK源码分析 异常

对于JDK源码分析的文章,仅仅记录我认为重要的地方。源码的细节实在太多,不可能面面俱到地写清每个逻辑。所以我的JDK源码分析,着重在JDK的体系架构层面,具体源...

664
来自专栏小白的技术客栈

Python基础语法-内置数据结构之元组

今天给大家讲解Python的内置数据结构元组。前面的内容大家有没有复习呢? 元组的特点:不可变的列表,但是可哈希的。列表是不可哈希的。 元组创建及使用 使用()...

34812
来自专栏代码拾遗

反射基础之Class

Java中每个类型要么是引用类型,要么是原生类型。类,枚举,数组(他们都继承于java.lang.Object)和接口都是引用类型。例如:java.lang.S...

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

Java 字符流文件读写

1342
来自专栏JetpropelledSnake

Python学习笔记之Super函数

1274
来自专栏李家的小酒馆

Java IO(IO流)-1

IO流 第一部分 (outputStream/InputStream Writer/Redaer) IO流对象中输入和输出是相辅相成的,输出什么,就可以输入什么...

1830
来自专栏拭心的安卓进阶之路

深入理解 Java 反射:Method (成员方法)

深入理解 Java 反射系列: 深入理解 Java 反射:Class (反射的入口) 深入理解 Java 反射:Field (成员变量) 深入理解 Java ...

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

Java 字符流操作

     上篇文章Java 字节流操作介绍了java中基本的字节流操作,但是我们常常对于字符操作,如果使用字节流来实现输入输出就显得麻烦,我们可以使用字符流...

1827
来自专栏云霄雨霁

Java--运行期类型鉴定(RTTI)

1485

扫码关注云+社区