Java IO流字符流简介及常用字符流的基本使用  

  字符流分为输入字符流(Writer)和输出字符流(Reader),这两种字符流及其子类字符流都有自己专门的功能。在编码中我们常用的输出字符流有FileWriter、PrintWriter等,而常用的输入字符流有StringReader、FileReader、BufferedReader和InputStreamReader等等。Writer是用于写入字符流的抽象类。它的子类必须实现的唯一方法是write(char [],int,int),flush()和close()。 而Reader是用于读取字符流的抽象类。它的子类必须实现的唯一方法是read(char [],int,int)和close()。我们在使用Writer和Reader的过程中,可以通过继承的方式实现,同时我们也可以在继承了Writer或Reader的子类中将重写这里定义父类中已有的一些方法,来实现我们想要的功能。

字符流的结构体系图为(JDK 1.8):

输入字符流(Writer)和输出字符流(Reader)咋区分?

就简单的用磁盘和内存来说,以内存为核心。从内存出来的叫输出,进入内存的叫输入。那么从内存中把流输出写入到磁盘上的就是输出字符流,从磁盘上读取数据写入到内存中的就叫输入流。不知这样说是否合理,有问题还望大家多多指教。

下面来看看常用的几种字符流的使用:

1、FileReader & FileWriter

FileReader类从InputStreamReader类继承而来,该类按字符读取流中数据。它的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。 若要自己来指定这些值,需要在FileInputStream上构造一个InputStreamReader。 FileReader是用于读取字符流,要读取原始字节流,请考虑使用FileInputStream。而FileWriter类从OutputStreamWriter类继承而来,该类按字符向流中写入数据。它的构造函数假定默认字符编码和默认字节缓冲区大小是可以接受的。若也要自己指定这些值,则需要在FileOutputStream上构造一个OutputStreamWriter。 FileWriter类创建对象之后所传入的文件是否可用或是否可能被创建取决于底层平台,特别是某些平台允许一次只能打开一个文件来写入一个FileWriter (或其他文件写入对象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。FileWriter是用于写入字符流,要编写原始字节流,请考虑使用FileOutputStream

示例代码:

 1 package com.tianjh.io.writer;
2
3 import java.io.*;
4
5 /**
6 * Created on 2020/12/15
7 * $FileReaderWriterDemo 包含FileWriter、FileReader的简单使用
8 * <p>
9 * FileWriter 是向指定的文件写入数据,write方法会把字符一个一个的写入磁盘中
10 * FileReader 是向指定的文件读取数据,read方法会一个一个字符的从磁盘往回读数据
11 *
12 * @author tianjh
13 */
14 public class FileReaderWriterDemo {
15 public static void main(String[] args) {
16
17 // 声明一个文件
18 String fileName = "D:\\hello.txt";
19 // 实例化一个file对象
20 File file = new File(fileName);
21 /*
22 * 1.使用FileWriter的write向磁盘上写文件
23 * write方法会把字符一个一个的写入磁盘中
24 */
25 try {
26 // 实例化一个fileWriter对象
27 FileWriter fileWriter = new FileWriter(file);
28 fileWriter.write(99);
29 fileWriter.write("您好!");
30 fileWriter.write("hello world!");
31 fileWriter.flush();
32 // 关闭流,释放资源文件
33 fileWriter.close();
34 } catch (IOException e) {
35 e.printStackTrace();
36 }
37
38 /*
39 * 2.使用FileReader的read方法从磁盘上读入文件
40 * read方法会一个一个字符的从磁盘往回读数据
41 */
42 try {
43 int a;
44 // 1. 输出指定文件的每个字节的ASCII码
45 FileReader fileReader = new FileReader(fileName);
46 while ((a = fileReader.read()) != -1) {
47 // 输出指定文件的每个字节的ASCII码
48 System.out.print(a + " ");
49 // expected output: 99 24744 22909 65281 104 101 108 108 111 32 119 111 114 108 100 33
50 }
51 System.out.println();
52 fileReader.close();
53
54 // 2. 输出每个字节ASCII码所对应的字符
55 FileReader fileReader1 = new FileReader(fileName);
56 while ((a = fileReader1.read()) != -1) {
57 // 输出每个字节ASCII码所对应的字符
58 System.out.print((char) a);
59 // expected output: c您好!hello world!
60 }
61 fileReader1.close();
62 System.out.println();
63 } catch (IOException e) {
64 e.printStackTrace();
65 }
66 }
67 }

测试结果:

写入到hello.txt文件之后的数据为:

2、PrintWriter

PrintWriter将对象的格式化表示形式打印到文本输出流。这个类实现了全部在PrintStream中找到的所有打印方法。但它不包含用于编写原始字节的方法,程序应使用未编码的字节流。它与PrintStream类不同,PrintStream是针对字节流的,而PrintWriter是针对字符流的。如果PrintWriter启用自动刷新,它只会在调用的println,printf,或format方法来完成,而不是当一个换行符恰好是输出。这些方法使用平台自己的行分隔符而不是换行符。这个类中的方法不会抛出IO异常,尽管它的一些构造函数可能会抛出异常。我们可以通过调用checkError()方法查询是否发生错误。

示例代码:

 1 package com.tianjh.io.writer;
2
3 import java.io.PrintWriter;
4
5 /**
6 * Created on 2020/12/15
7 *
8 */
9 public class PrintWriterDemo {
10 public static void main(String[] args) throws Exception {
11 String fileName = "D:\\hello.txt";
12 String s1 = "hello world!";
13 String s2 = "您们好!";
14 PrintWriter printWriter = new PrintWriter(fileName);
15 printWriter.println(s1);
16 printWriter.println(s2);
17 printWriter.close();
18 }
19 }

测定结果:

3、StringReader

StringReader是一个字符流,其源是一个字符串。它主要用于处理字符串。

示例代码:

 1 package com.tianjh.io.reader;
2
3 import java.io.IOException;
4 import java.io.StringReader;
5
6 /**
7 * Created on 2020/12/15
8 * $StringReaderDemo 测试使用StringReader
9 *
10 */
11 public class StringReaderDemo {
12 public static void main(String[] args) throws IOException {
13 String s = "hello,world!";
14 s = s + "我是一条测试数据";
15 System.out.println(s);
16 // expected output: hello,world!我是一条测试数据
17
18 // 实例化一个stringReader对象,使用read方法进行读取
19 StringReader stringReader = new StringReader(s);
20 int a;
21 while ((a = stringReader.read()) != -1) {
22 System.out.print((char) a);
23 // expected output: hello,world!我是一条测试数据
24 }
25 System.out.println();
26 }
27 }

输出结果:

5、BufferedReader

BufferedReader它的用法和BufferedInputStream类似,只是它们一个一个处理字符,一个处理字节。BufferedReader用来处理字符。BufferedInputStream的使用可参考https://www.cnblogs.com/jhtian/p/14115355.html

示例代码:

package com.tianjh.io.reader;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException; /**
* Created on 2020/12/15
* $BufferedReaderDemo 的基本使用
*
*/
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
// 声明一个文件
String fileName = "D:\\hello.txt";
String s2;
StringBuilder s3 = new StringBuilder();
FileReader fileReader = new FileReader(fileName);
BufferedReader bufferedReader = new BufferedReader(fileReader);
while ((s2 = bufferedReader.readLine()) != null) {
s3.append(s2);
}
System.out.println(s3);
// expected output: hello world!您们好!
bufferedReader.close();
}
}

输出结果:

 

Java IO流字符流简介及基本使用的更多相关文章

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

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

  2. Java IO之字符流和文件

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

  3. [Java IO]03_字符流

    Java程序中,一个字符等于两个字节. Reader 和 Writer 两个就是专门用于操作字符流的类. Writer Writer是一个字符流的抽象类.  它的定义如下: public abstra ...

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

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

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

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

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

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

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

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

  8. Java IO系统--字符流

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

  9. Java IO之字符流

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

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

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

随机推荐

  1. DocView 现在支持自定义 Markdown 模版了!

    前言 有小伙伴反馈说希望可以自定义 Markdown 模版,这样就可以导出自己想要的样式了!这个功能可以有,毕竟大家不可能都生成一模一样的文档.现在来一起看看如何实现自定义模版吧! 设置模版 Sett ...

  2. 如何在Vegas中安装激活Continuum插件

    视频剪辑插件Boris FX Continuum安装程序包含了多达250种插件.而视频剪辑软件Vegas Pro 18 Suite中提供了Boris FX Continuum Film Style U ...

  3. ABBYY FineReader文档对比实例讲解

    ABBYY FineReader企业版与标准版有一个重大的区别,就是企业版有对比文档的功能,今天通过下面的文档对比实例,来向大家展示一下OCR文字识别工具ABBYY FineReader的使用技巧. ...

  4. 思维导图MindManager属性功能怎么合理使用

    在MindManager中为主题添加相应的标注可以使读者更好的理解主题内容,增强导图的可读性,因此,如何在MindManager中为主题添加标注也就成了我们的关注点. 巧妙使用这款思维导图软件的属性功 ...

  5. 换系统之后为什么iMindMap会提示“许可证使用的次数过多”

    iMindMap是一款十分受欢迎的思维导图软件,随着12版本的上线,iMindMap新增了很多新用户,最近小编发现有不少新用户在群里反映:"为什么购买iMindMap时说可以支持换机,但是在 ...

  6. LaTeX中的插图

    插图代码及注释: 显示效果: 更多命令可以看相关文档,通过在命令行终端输入 texdoc graphicx 命令打开文档.

  7. DNS、IP地址、子网掩码和默认网关

    一.DNS服务器 DNS是指:域名服务器(Domain Name Server).在Internet上域名与IP地址之间是一一对应的,域名虽然便于人们记忆,但机器之间只能互相认识IP地址,它们之间的转 ...

  8. Markdown 语法详解

    Markdown 学习 标题 三级标题 四级标题 最多支持六级标题 "#... + 标题名称" 字体 hello, world "** 内容 **" hello ...

  9. 2、Spring Cloud和dubbo简介

    1.Spring Cloud简介 (1).Spring Cloud简介 SpringCloud,基于SpringBoot提供了一套微服务解决方案,包括服务注册与发现,配置中心,全链路监控,服务网关,负 ...

  10. python 爬虫 汽车之家车辆参数反爬

    水平有限,仅供参考. 如图所示,汽车之家的车辆详情里的数据做了反爬对策,数据被CSS伪类替换. 观察 Sources 发现数据就在当前页面. 发现若干条进行CSS替换的js 继续深入此JS 知道了数据 ...