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开发实战经典》 

[Java IO]03_字符流的更多相关文章

  1. Java IO: 其他字符流(下)

    作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本小节会简要概括Java IO中的PushbackReader,LineNumberReader,St ...

  2. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  3. Java IO编程——字符流与字节流

    在java.io包里面File类是唯一 一个与文件本身有关的程序处理类,但是File只能够操作文件本身而不能够操作文件的内容,或者说在实际的开发之中IO操作的核心意义在于:输入与输出操作.而对于程序而 ...

  4. java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

    字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...

  5. Java——IO类 字符流概述

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  6. Java IO(四--字符流基本使用

    在上一节,介绍了字节流的基本使用,本节介绍一下字符流的使用 Reader: public abstract class Reader implements Readable, Closeable { ...

  7. Java IO系统--字符流

    字符流:尽管字节流提供了处理任何类型输入/输出操作的足够功能,它们补鞥呢直接操作Unicode字符.字符流层次结构的顶层是Reader和Writer抽象类.类似于InputStream和OutputS ...

  8. Java IO之字符流

    public static void main(String[] args) { FileWriter fw = null; try { fw = new FileWriter("/User ...

  9. java字节流和字符流,以及java文件操作

    A.首先说字节流:1.字节流在操作的时候不会用到缓冲区(也就是内存)2.字节流可用于任何类型的对象,包括二进制对象3.字节流处理单元为1个字节,操作字节和字节数组.InputStream是所有字节输入 ...

随机推荐

  1. 浏览器访问Servlet

    浏览器访问Servlet1.指定一个Servlet路径(                     在web.xml :              <servlet>             ...

  2. snmp学习笔记

    snmp5.5 client 包含头文件 #include <net-snmp/net-snmp-config.h> #include <net-snmp/net-snmp-incl ...

  3. SQL Server AlwaysOn

    标签:SQL SERVER/MSSQL SERVER/数据库/DBA/高性能解决方案 概述 环境: 域服务器:windows server 2008 R2 SP1,192.168.2.10 DNS:1 ...

  4. 翻译-使用Ratpack和Spring Boot打造高性能的JVM微服务应用

    这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中 ...

  5. 可扩容分布式session方案

    分布式session有以下几种方案: 1. 基于nfs(net filesystem)的session共享 将共享服务器目录mount各服务器的本地session目录,session读写受共享服务器i ...

  6. Qt5中的信号槽

    Qt4中的信号槽 Qt4中的信号槽是通过SIGNAL,SLOT两个宏,将参数转换成字符串.Qt编译前,会从源码的头文件中提取由signal和slot声明的信号和槽的函数, 将其组成一张信号和槽对应的字 ...

  7. [CORS:跨域资源共享] W3C的CORS Specification

    随着Web开放的程度越来越高,通过浏览器跨域获取资源的需求已经变得非常普遍.在我看来,如果Web API不能针对浏览器提供跨域资源共享的能力,它甚至就不应该被称为Web API.从另一方面来看,浏览器 ...

  8. 《Hive编程指南》—— 读后总结

    知识图谱

  9. edit

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  10. mac下tomcat的安装与配置

    1.到 apache官方主页 下载 Mac 版本的完整 tar.gz文件包.解压拷贝到 /Library目录下,并命名为Tomcat,其他目录也可.   2.修改目录权限 到终端输入 sudo chm ...