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. PHP如何使用GeoIP数据库

    1.首先下载GeoIP的IP库.参考<利用GeoIP数据库及API进行地理定位查询>.下载后解压,得到一个GeoIP.dat文件 2.新建一个文件geoip.inc.内容为 <?ph ...

  2. windows多线程编程星球(一)

    以前在学校的时候,多线程这一部分是属于那种充满好奇但是又感觉很难掌握的部分.原因嘛我觉得是这玩意儿和编程语言无关,主要和操作系统的有关,所以这部分内容主要出现在讲原理的操作系统书的某一章,看完原理是懂 ...

  3. 完成整个DAO的实现及测试代码

    package cn.itcast.domain; import java.util.Date; public class User { private int id; private String ...

  4. 系统监控工具 Tsar

    Tsar是淘宝的一个用来收集服务器系统和应用信息的采集报告工具,如收集服务器的系统信息(cpu,mem等),以及应用数据(nginx.swift等),收集到的数据存储在服务器磁盘上,可以随时查询历史信 ...

  5. C#中自己动手创建一个Web Server(非Socket实现)

    目录 介绍 Web Server在Web架构系统中的作用 Web Server与Web网站程序的交互 HTTPListener与Socket两种方式的差异 附带Demo源码概述 Demo效果截图 总结 ...

  6. iOS开发系列--C语言之指针

    概览 指针是C语言的精髓,但是很多初学者往往对于指针的概念并不深刻,以至于学完之后随着时间的推移越来越模糊,感觉指针难以掌握,本文通过简单的例子试图将指针解释清楚,今天的重点有几个方面: 什么是指针 ...

  7. 从天猫和支付宝身上学习opcity与rgba

    不知道什么时候,一个双层透明的对话框悄然流行了起来. 我们在各大网站上都能见到类似这样的对话框: 这样的聚焦更明显,用户体验更好,也显得更加的高大上. 先说点题外话,这种布局如何用CSS+DIV去实现 ...

  8. VBA批量查找和复制文件

    Function findAndCopy(srcFile As String, destFile As String, cmdFile As String) Dim WSH As Object, wE ...

  9. C#设计模式之外观

    IronMan之外观 接着上篇观察者内容的“剧情”,没看过的朋友也没关系,篇幅之间有衔接的关系但是影响不大. 需求: 为"兵工厂"提供各种支持,生产了各式各样的"Iron ...

  10. Android学习——第一个NDK程序

    在前面的学习中,我们已经讲解了关于NDK编程的环境搭建流程,简单的使用我们也通过官网本身自带的例子进行说明了.可是相信大家一定还存在这么的一个疑惑:“如果我要自己利用NDK编写一个Android应用, ...