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. ServiceStack.Redis 的 ASP.NET Core 扩展库

    给大家安利一款 ServiceStack.Redis 的 ASP.NET Core 扩展库,它是基于 ServiceStack.Redis.Core 开发的. 简单易用,开源免费,使用ASP.NET ...

  2. cmd编译java代码为什么总是说找不到main方法;请园子里大神指点迷津!!!

    编写源代码如下: cmd,编译路径:E: cd Notepad cd src javac Character.java jvav Character 运行结果: 实在是找不到问题点,请评论区给予指导啊 ...

  3. 面试官:你说你精通源码,那你知道ArrayList 源码的设计思路吗?

    Arraylist源码分析 ArrayList 我们几乎每天都会使用到,但是通常情况下我们只是知道如何去使用,至于其内部是怎么实现的我们不关心,但是有些时候面试官就喜欢问与ArrayList 的源码相 ...

  4. 在Camtasia中对录制视频进行转换编辑

    在我们的日常学习生活中,课件是我们经常需要接触的东西,一份精美的课件会让我们的学习生活看起来不那么的枯燥,学习也就不会索然无味.当精美的课件加上老师的谆谆教导,学习便会变成一件非常简单的事情.将课件制 ...

  5. 如何用EasyRecovery恢复受损的SD卡?

    SD卡的主要功能是拓展便携式设备.包括:数据相机.手机及其他的多媒体播放器等的存储空间,缓解设备本身的存储压力.即便是在产品内存已经逐渐增加的情况下,还是拥有一大批的忠实用户. 很多用户反应,SD卡使 ...

  6. 肝了一周的 UDP 基础知识终于出来了。

    我把自己以往的文章汇总成为了 Github ,欢迎各位大佬 star https://github.com/crisxuan/bestJavaer 已提交此篇文章 运输层位于应用层和网络层之间,是 O ...

  7. 【ACwing 100】InDec序列——差分

    (题面来自AcWing) 给定一个长度为 n 的数列 a1,a2,-,an,每次可以选择一个区间 [l,r],使下标在这个区间内的数都加一或者都减一. 求至少需要多少次操作才能使数列中的所有数都一样, ...

  8. 深入浅出之mysql索引--上

    当着小萌新之际,最近工作中遇到了mysql优化的相关问题,然后既然提到了优化,很多像我这样的小萌新不容置喙,肯定张口就是 建立索引 之类的. 那么说到底,索引到底是什么,它是怎么工作的?接下来就让我和 ...

  9. AndroidStudio新导入项目,无法编译,rebuild、clean都无效

    此按钮,可以用gradle重新编译

  10. k8s 部署 Java 项目

    前几天安装了 k8s 并测试了自动伸缩功能(HPA),今天来部署一个简单的 Java 应用到 k8s. 开始之前需要先安装一下 ingress 插件.ingress 作为 k8s 的流量入口,有多种实 ...