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

相关文章

来自专栏mySoul

设计模式-策略模式

将原先耦合的if进行拆分成类,然后使用的时候注入类即可。或者使用枚举类型,如果需要增加,需要实现抽象方法。

881
来自专栏向治洪

Kotlin 包和 import 语句使用

Kotlin 包和 package 语句 Kotlin 包与 Java 包的概念是一样的,都表示文件结构(语法上并不严格要求),可以起到区分同名源代码文件、组织...

2487
来自专栏程序员宝库

Java编程常见问题汇总(一)

字符串连接误用 错误的写法: String s = ""; for (Person p : persons) { s += ", " + p....

3719
来自专栏个人随笔

Java IO流

package cn.bdqn.demo; import java.io.File; import java.io.FileInputStream; impo...

2826
来自专栏cloudskyme

java在指定目录下执行dos命令或者bat文件

直接看源程序吧 public static void main(String[] args) throws IOException { File dir =...

5225
来自专栏醒者呆

编程语言的基础——搞定JavaIO

关键字:IO基础,JUnit生命周期,字节流,字符流,字符编码,对象流,序列化,反序列化 Java I/O 流是一组有顺序的,有起点和终点的字节集合。是对设...

4035
来自专栏别先生

Java中IO流,输入输出流概述与总结

总结的很粗糙,以后时间富裕了好好修改一下。 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中。其中, 所有输入流类都...

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

java学习:使用dom4j读写xml文件

dom4j是一个优秀的开源项目,专用于xml文件的读写,而且支持强大的xpath. 下面的代码演示了对xml文件demo.xml的读写 demo.xml内容: ...

2656
来自专栏Python爱好者

Java基础笔记20

1374
来自专栏一个会写诗的程序员的博客

《Kotin 极简教程》第15章 Kotlin 文件IO操作、正则表达式与多线程第15章 Kotlin 文件IO操作与多线程《Kotlin极简教程》正式上架:

我们在使用 Groovy 的文件 IO 操作的时候,感觉非常便利。同样的Kotlin也有好用的文件 IO 操作的 API。同样的在 Kotlin 中对 Java...

1822

扫码关注云+社区

领取腾讯云代金券