• 概述
  • Reader InputStreamReader FileReader and BufferedReader
  • Writer OutputStreamWriter FileWriter and BufferedWriter
  • Character Encoding and Charset
  • 示例
    • BufferedReader
    • BufferedWriter

概述

本篇博文主要介绍 如何使用java.io包中提供的类读取和写入文本(或字符)文件


Reader, InputStreamReader, FileReader and BufferedReader

Reader是读取字符流的抽象类。 它实现以下基本方法:

  • read(): reads a single character.
  • read(char[]): reads an array of characters.
  • skip(long): skips some characters.
  • close(): closes the stream.

InputStreamReader是从字节流到字符流的桥梁。 它使用指定的字符集将字节转换为字符。 字符集可以是操作系统的默认字符编码,也可以在创建InputStreamReader时显式指定。

FileReader是使用操作系统的默认字符编码读取文本文件的便捷类。

BufferedReader从字符流中读取文本(字符被缓冲以避免从基础流中经常读取),并提供了一种方便的阅读文本行readLine()的方法。

我们来看下Reader的继承关系


Writer, OutputStreamWriter, FileWriter and BufferedWriter

Writer是写入字符流的抽象类。 它实现以下基本方法:

  • write(int): writes a single character.
  • write(char[]): writes an array of characters.
  • write(String): writes a string.
  • close(): closes the stream.

OutputStreamWriter是从字节流到字符流的桥梁。 使用指定的字符集将字符编码为字节。 字符集可以是操作系统的默认字符编码,也可以在创建OutputStreamWriter时显式指定。

FileWriter是使用操作系统的默认字符编码编写文本文件的便捷类。

BufferedWriter有效地将文本写入字符流(字符,数组和字符串被缓冲以避免频繁写入底层流),并为写入行分隔符newLine()提供了一种方便的方法。


Character Encoding and Charset

当构建reader 或者 writer 对象时,使用操作系统的默认字符编码

    FileReader fileReader = new FileReader("myFile.txt");FileWriter fileWriter = new FileWriter("YourFile.txt");

所以,如果我们要使用特定的字符集,请改用InputStreamReader或OutputStreamWriter

InputStreamReader reader = new InputStreamReader(new FileInputStream("MyFile.txt"), "UTF-16");

这将创建一个具有Unicode字符编码UTF-16的InputStreamReader

构造具有UTF-8编码OutputStreamWriter

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("MyFile.txt"), "UTF-8");

如果我们想使用BufferedReader,只需将InputStreamReader包装在其中,例如:

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream("MyFile.txt"), "UTF-8"));

同样的 BufferedWriter 如下

OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("MyFile.txt"), "UTF-16");BufferedWriter bufferedWriter = new BufferedWriter(osw);

示例

BufferedReader

示例一: 从文件MyFile.txt读取单个字符,并将所有字符打印到输出控制台:

@Testpublic void test() {FileReader fileReader = null;try {fileReader = new FileReader(new File("D:/xgj.txt"));int character;while ((character = fileReader.read()) != -1) {System.out.println((char) character);}// close streamfileReader.close();} catch (IOException e) {e.printStackTrace();}}

示例二 读取文本文件,假设编码为UTF-8:

@Testpublic void test() {InputStreamReader in;try {in = new InputStreamReader(new FileInputStream(new File("D:/xgj.txt")), "UTF-8");int character;while ((character = in.read()) != -1) {System.out.println((char) character);}// close streamin.close();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}

示例三 使用BufferedReader逐行读取文本文件(这是最有效和首选的方式):

@Testpublic void test() {BufferedReader bufferedReader;try {bufferedReader = new BufferedReader(new FileReader(new File("D:/xgj.txt")));String line;while ((line = bufferedReader.readLine()) != null) {System.out.println(line);}// close streambufferedReader.close();} catch (IOException e) {e.printStackTrace();}}

BufferedWriter

使用FileWriter将两个单词“Hello World”和“Good Bye!”写入名为MyFile.txt的文件:

@Testpublic void test() {FileWriter fileWriter;try {// If the second argument is true, then bytes will be written to the// end of the file rather than the beginning.fileWriter = new FileWriter(new File("D:/MyFile.txt"), true);fileWriter.write("Hello World");fileWriter.write("\r\n"); // write new linefileWriter.write("Good Bye!");// close streamfileWriter.close();} catch (IOException e) {e.printStackTrace();}}

请注意,FileWriter默认使用操作系统的默认字符编码。 如果文件不存在将创建一个新的文件,存在则覆盖现有的。
如果要将文本附加到现有文件,请将FileWriter类的构造函数第二个入参true.

如下:

FileWriter writer = new FileWriter("MyFile.txt", true);

示例二 使用一个包含FileWriter的BufferedWriter 来将文本附加到现有文件中:

这是写入文本文件的首选方法,因为BufferedWriter 提供了写入字符流的有效方式。

@Testpublic void test() {BufferedWriter bufferedWriter;try {bufferedWriter = new BufferedWriter(new FileWriter("D:/Myfile.txt", true));bufferedWriter.write("Hello World");bufferedWriter.newLine(); // 分隔符bufferedWriter.write("See You Again!");// close streambufferedWriter.close();} catch (IOException e) {e.printStackTrace();}}

以下示例在写入文件时指定特定字符编码(UTF-8):

@Testpublic void test() {try {FileOutputStream outputStream = new FileOutputStream("D:/MyFile.txt");OutputStreamWriter outputStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);bufferedWriter.write("Hello");bufferedWriter.newLine();bufferedWriter.write("I/O");// close streambufferedWriter.close();} catch (IOException e) {e.printStackTrace();}}

注意:
从Java 7开始,我们可以使用try-with-resources语句简化打开和关闭读写器的代码。 例如:

try (FileReader reader = new FileReader("MyFile.txt")) {int character;while ((character = reader.read()) != -1) {System.out.print((char) character);}
} catch (IOException e) {e.printStackTrace();
}

Java-Java I/O 字节流之BufferedReader/BufferedWriter相关推荐

  1. java缓冲流,BufferedReader,BufferedWriter 详解

    缓冲流,BufferedReader,BufferedWriter 1)BufferedReader,BufferedWriter是更高级的流,二者的源和目的地必须是字符输入流和字符输出流.如果把字符 ...

  2. java 字符流与字节流区别_JAVA 字符流与字节流的区别

    Java 流在处理上分为字符流和字节流.字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符.字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组. Java 内用 U ...

  3. java基础 io流 字节流 字符流 节点流 包装流 转换流 缓冲流 对象流 打印流 Properties类

    目录 1.概念 2.常用的文件操作 2.1 创建文件 2.2 获取文件相关信息 2.3 目录的操作和文件删除 3. IO流原理及流的分类 3.1 流的分类 4.InputStream 字节输入流 4. ...

  4. 黑马程序员——Java字符流、字节流IO流

    黑马程序员--Java字符流.字节流Io流 ---------------------- <a href="http://www.itheima.com"target=&qu ...

  5. java的flush方法_Java中的BufferedWriter flush()方法及示例

    Java中buffered writer类的flush()方法用于刷新缓冲的writer流中的字符.语法:公共void flush()指定者:此方法由Flushable接口的flush()方法指定.重 ...

  6. Java 把一个InputStream转换为一个BufferedReader

    Java 把一个InputStream转换为一个BufferedReader InputStream inputStream = getResources().getAssets().open(&qu ...

  7. java字符流和字节流转换_java中字符流和字节流的转换

    看到InputStreamReader和OutputStreamWriter的一些说法, 说InputStreamReader是将字节流转换成字符流,而OutputStreamWriter则相反,是将 ...

  8. [Jmeter]通过批处理调用java,java从CSV动态读取登录的用户名和密码,并将其作为参数组合成字符串,写入外部.bat文件,然后通过Java执行这个外部批处理文件...

    问题1:怎样通过批处理调用java代码? 问题2:怎样通过java从CSV文件获取到用户名和密码存入变量? 问题3:怎样将获取到的用户名和密码组合成字符串,写入外部批处理文件? 问题4:怎样在批处理文 ...

  9. java java se_Java SE 9:尝试资源改进

    java java se 发表简要目录: (Post Brief Table of Content:) Introduction介绍 Java SE 7: Try-With-Resources Bas ...

最新文章

  1. VS.NET 学习方法论
  2. Java编程基础-变量
  3. JBox2D和JavaFX:事件与力量
  4. REVERSE-PRACTICE-BUUCTF-5
  5. MVC5+EF6 入门完整教程四
  6. redis相关技能积累
  7. java comparator_Java 集合排序策略接口 Comparator
  8. CRC校验 与 模2运算
  9. 论文学习13Reconstructing the house from the ad: Structured prediction on real estate classifieds(实体关系抽取)
  10. python进行回归方程显著性检验
  11. 华为设备配置OSPF的NSSA区域
  12. c语言 滑窗法_滑窗平均的另一种实现方式
  13. node_modules删不掉
  14. Spark面试题及其答案
  15. pyinstaller包含html文件,pyinstaller打包exe
  16. E08【选尺码】I'm looking for size 43
  17. 带你快速入门AXI4总线--汇总篇
  18. 2021年更新:火爆全网的抖音“蚂蚁牙黑”视频制作实战,附软件
  19. 2022化工自动化控制仪表考试题及答案
  20. 【特征工程】词袋模型/TF-IDF模型/词汇表模型的代码实现(文本特征提取)

热门文章

  1. Linux 下的动态链接库问题
  2. java post 打开新页面_JAVA后台POST/GET访问方法
  3. tensorflow就该这么学--4(识别手写数字)
  4. pytorch 笔记:torchsummary
  5. 文巾解题 leetcode993. 二叉树的堂兄弟节点
  6. 见光死怎么办?如何提升用户对网站的好感,提升转化?
  7. 深度学习核心技术精讲100篇(二十)-如何通过树模型实现梯度提升树(GBDT)+LR,随机森林(RandomForest) +LR
  8. android引用的java包_Android开发中jar包的创建及引用
  9. np.expand_dims()介绍
  10. 深度学习100例-卷积神经网络(CNN)识别眼睛状态 | 第17天