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

测试结果:

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

2、PrintWriter

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

示例代码:

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

测定结果:

3、StringReader

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

示例代码:

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

输出结果:

5、BufferedReader

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

示例代码:

  1. package com.tianjh.io.reader;
  2.  
  3. import java.io.BufferedReader;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6.  
  7. /**
  8. * Created on 2020/12/15
  9. * $BufferedReaderDemo 的基本使用
  10. *
  11. */
  12. public class BufferedReaderDemo {
  13. public static void main(String[] args) throws IOException {
  14. // 声明一个文件
  15. String fileName = "D:\\hello.txt";
  16. String s2;
  17. StringBuilder s3 = new StringBuilder();
  18. FileReader fileReader = new FileReader(fileName);
  19. BufferedReader bufferedReader = new BufferedReader(fileReader);
  20. while ((s2 = bufferedReader.readLine()) != null) {
  21. s3.append(s2);
  22. }
  23. System.out.println(s3);
  24. // expected output: hello world!您们好!
  25. bufferedReader.close();
  26. }
  27. }

输出结果:

 

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. SpringBoot WebSocket 消息交互

    1. Websocket原理 Websocket协议本质上是一个基于TCP的独立协议,能够在浏览器和服务器之间建立双向连接,以基于消息的机制,赋予浏览器和服务器间实时通信能力. WebSocket资源 ...

  2. Zabbix监控笔记

    了解zabbix,有必要了聊一下监控系统相关内容 企业中常用的开源监视系统目前有 cacti.Nagios.Open-Falcon.zabbix.prometheus等 使用监控系统的目的在于 /1. ...

  3. 如何用Camtasia将喜欢的视频做出复古的感觉

    不知道各位可有看老电影的习惯,我个人觉得一些老电影那种别具一格的画面感是非常吸引人的韵味,尽管其色彩不是很鲜艳,但是这种黑白的感觉,对于现在的我们,往往有着不一样的吸引力.于是,我就尝试着用Camta ...

  4. ThreadLocal以及强软弱虚引用

    1.ThreadLocal ThreadLocal即线程本地,可以实现每个线程存入取出TreadLocal值互不影响.因为TheadLocal底层是用了一个Map结构存放数据,而这个Map是从当前这个 ...

  5. yii2-imagine的使用

    <?php /** * 图片常用处理 * * 需要 yii/yii2-imagine 的支持 * php composer.phar require --prefer-dist yiisoft/ ...

  6. Contest 1445

    A \(a\) 中第 \(i\) 小的配 \(b\) 中第 \(i\) 大的. 限制相同,这样配最平均. 时间复杂度 \(O\left(tn\log n\right)\). B 最终的一百名至少是第一 ...

  7. Java蓝桥杯——逻辑推理练习题

    逻辑推理题 谁是贼? 公安人员审问四名窃贼嫌疑犯.已知,这四人当中仅有一名是窃贼,还知道这四人中每人要么是诚实的,要么总是说谎.在回答公安人员的问题中: 甲说:"乙没有偷,是丁偷的.&quo ...

  8. Eclipse中构造方法自动生成

    代码中点击右键(快捷键Ctrl+Alt+S) ->Source ->Generate Constructor using Fields... ->默认全选(可选择需要作为构造方法参数 ...

  9. 【问题记录】— web页面调用本地程序

    起因: 最近由于项目需要在web页面中调用本地部署的exe程序:进而对该功能实现做了对应了解:以及存在的问题进行记录. 要实现该功能就不得不说浏览器自定义协议:解决办法:那么它是什么呢? 浏览器自定义 ...

  10. CentOS6.5配置KVM

    ///确认cpu是否支持kvm egrep '(vmx|svm)' --color=always /proc/cpuinfo ///安装包 yum -y install qemu-kvm libvir ...