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. Web 入门之 XML

      160916   1. 什么是XML?   XML 是 EXtensible Markup Language 的缩写,称为可扩展标记语言,所谓可扩展指用户可根据XML规则自定义标记.例子1-1 = ...

  2. 实践Html5的上传文件

    技术点: 1.通过input的change事件获取文件信息: onchange = function() { this.files } 这个files属性是htmlInputElement接口的属性, ...

  3. java 遍历arrayList的四种方法

    package com.test; import java.util.ArrayList;import java.util.Iterator;import java.util.List; public ...

  4. 纯jQuery-添加/修改/删除 标签,属性

    <h1>通过学习<精彩绝伦的jQuery>与W3C,大致了解JQuery的一些方法.</h1> PS:需要有一些前置条件,比如JQuery源代码,比如html就要有 ...

  5. PHP文件相关的操作函数——文件操作

    1.文件的代开与关闭 1.1 fopen() 作用:该函数用于打开一个文件 具体使用访问:http://www.w3school.com.cn/php/func_filesystem_fopen.as ...

  6. 基于腾讯手Q样式规范Frozen UI

    Frozen UI是一个开源的简单易用,轻量快捷的移动端UI框架.基于手Q样式规范,选取最常用的组件,做成公用离线包减少请求,升级方式友好,文档完善,目前全面应用在腾讯手Q增值业务中. css组件包括 ...

  7. 【nginx配置】nginx做非80端口转发

    一个场景 最近在使用PHP重写一个使用JAVA写的项目,因为需要查看之前的项目,所以要在本地搭建一个Tomcat来跑JAVA的项目.搭建成功后,因为Tomcat监听的端口是8080,因此,访问的URL ...

  8. 我所记录的git命令(非常实用)

    一.前言 记录一下工作中常用到的git命令,只是简单的笔记,欢迎大家交流... [ 顺便问下园友们,怎么感觉博客园发布的博客搜索有时都搜不到,后台编辑能填的都填写了,还是觉得搜索排名不高? 相同的标题 ...

  9. [公告]Senparc.Weixin.MP v14.2.1 升级说明

    在Senparc.Weixin.MP v14.2.1中,所有Senparc.Weixin.MP下的Container,命名空间已经从 Senparc.Weixin.MP.CommonAPIs 改为了  ...

  10. 在JS中获取文件点之后的后缀字符

    var upFileName = $("#fileToUpload").val();var index1=upFileName.lastIndexOf(".") ...