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

相关文章

来自专栏杨龙飞前端

scrollto 到指定位置

2894
来自专栏跟着阿笨一起玩NET

c#实现打印功能

3592
来自专栏张善友的专栏

Miguel de Icaza 细说 Mix 07大会上的Silverlight和DLR

Mono之父Miguel de Icaza 详细报道微软Mix 07大会上的Silverlight和DLR ,上面还谈到了Mono and Silverligh...

2997
来自专栏菩提树下的杨过

Flash/Flex学习笔记(23):运动学原理

先写一个公用的小球类Ball: package{ import flash.display.Sprite; //小球 类 public class B...

27110
来自专栏Ceph对象存储方案

Luminous版本PG 分布调优

Luminous版本开始新增的balancer模块在PG分布优化方面效果非常明显,操作也非常简便,强烈推荐各位在集群上线之前进行这一操作,能够极大的提升整个集群...

3625
来自专栏芋道源码1024

熔断器 Hystrix 源码解析 —— 断路器 HystrixCircuitBreaker

本文主要基于 Hystrix 1.5.X 版本 1. 概述 2. HystrixCircuitBreaker 3. HystrixCircuitBreaker....

5717
来自专栏闻道于事

js登录滑动验证,不滑动无法登陆

js的判断这里是根据滑块的位置进行判断,应该是用一个flag判断 <%@ page language="java" contentType="text/html...

8368
来自专栏落花落雨不落叶

canvas画简单电路图

81311
来自专栏张善友的专栏

LINQ via C# 系列文章

LINQ via C# Recently I am giving a series of talk on LINQ. the name “LINQ via C...

2965
来自专栏陈仁松博客

ASP.NET Core 'Microsoft.Win32.Registry' 错误修复

今天在发布Asp.net Core应用到Azure的时候出现错误InvalidOperationException: Cannot find compilati...

5208

扫码关注云+社区