字符流

Java平台使用Unicode约定存储字符值,字符流I/O自动将此内部格式与本地字符集进行转换,在Western语言环境中,本地字符集通常是ASCII的8位超集。

对于大多数应用程序,具有字符流的I/O并不比具有字节流的I/O复杂,使用流类完成的输入和输出会自动转换为本地字符集和从本地字符集转换,使用字符流代替字节流的程序会自动适应本地字符集并为国际化做了准备 — 所有这些都无需程序员的额外努力。

如果国际化不是优先事项,你可以简单地使用字符流类,而不必过多关注字符集问题,之后,如果国际化成为优先事项,你的程序可以进行调整而无需进行大量重新编码。

使用字符流

所有字符流类都派生自Reader和Writer,与字节流一样,有专门用于文件I/O的字符流类:FileReader和FileWriter,CopyCharacters示例说明了这些类。

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;public class CopyCharacters {public static void main(String[] args) throws IOException {FileReader inputStream = null;FileWriter outputStream = null;try {inputStream = new FileReader("xanadu.txt");outputStream = new FileWriter("characteroutput.txt");int c;while ((c = inputStream.read()) != -1) {outputStream.write(c);}} finally {if (inputStream != null) {inputStream.close();}if (outputStream != null) {outputStream.close();}}}
}

CopyCharactersCopyBytes非常相似,最重要的区别是CopyCharacters使用FileReaderFileWriter代替FileInputStreamFileOutputStream进行输入和输出。请注意,CopyBytesCopyCharacters都使用int变量来读取和写入,但是,在CopyCharacters中,int变量在其最后16位中保存一个字符值,在CopyBytes中,int变量在其最后8位中保存一个字节值。

使用字节流的字符流

字符流通常是字节流的“包装器”,字符流使用字节流来执行物理I/O,而字符流处理字符和字节之间的转换,例如,FileReader使用FileInputStream,而FileWriter使用FileOutputStream

有两种通用的字节到字符“桥接”流:InputStreamReader和OutputStreamWriter,当没有符合你需求的预打包字符流类时,使用它们来创建字符流。

面向行的I/O

字符I/O的单位通常比单个字符大,一个常见的单位是行:一串字符,末尾有一个行终止符,行终止符可以是回车/换行序列(“\r\n”),单个回车符(“\r”)或单个换行符(“\n”),支持所有可能的行终止符允许程序读取在任何广泛使用的操作系统上创建的文本文件。

让我们修改CopyCharacters示例以使用面向行的I/O,为此,我们必须使用两个我们以前从未见过的类,BufferedReader和PrintWriter。

CopyLines示例调用BufferedReader.readLinePrintWriter.println来一次输入和输出一行。

import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
import java.io.PrintWriter;
import java.io.IOException;public class CopyLines {public static void main(String[] args) throws IOException {BufferedReader inputStream = null;PrintWriter outputStream = null;try {inputStream = new BufferedReader(new FileReader("xanadu.txt"));outputStream = new PrintWriter(new FileWriter("characteroutput.txt"));String l;while ((l = inputStream.readLine()) != null) {outputStream.println(l);}} finally {if (inputStream != null) {inputStream.close();}if (outputStream != null) {outputStream.close();}}}
}

调用readLine会返回一行文本,CopyLines使用println输出每一行,println附加当前操作系统的行终止符,这可能与输入文件中使用的行终止符不同。

有许多方法可以在字符和行之外构建文本输入和输出,有关更多信息,请参阅扫描和格式化。


上一篇:字节流

下一篇:缓冲流

Java™ 教程(字符流)相关推荐

  1. java中字符流和字节流的区别_java中字节流和字符流有哪些区别

    java中字节流和字符流的区别有:1.定义不同:2.结尾不同:3.处理方式不同:4.缓冲区不同:5.编码方式不同.字节流默认不使用缓冲区,而字符流使用缓冲区.字节流采用ASCII编码,字符流采用uni ...

  2. Java IO: 字符流的Buffered和Filter

    作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍缓冲与过滤相关的reader和writer,主要涉及BufferedReader.B ...

  3. Java IO: 字符流的Piped和CharArray

    转载自   Java IO: 字符流的Piped和CharArray 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍管道与字符数组相 ...

  4. java binaryreader_Java字符流与字节流区别与用法分析

    本文实例讲述了Java字符流与字节流区别与用法.分享给大家供大家参考,具体如下: 字节流与字符流主要的区别是他们的的处理方式 流分类: 1.Java的字节流 InputStream是所有字节输入流的祖 ...

  5. Java io字符流读入英文_Java IO 系列教程(四)-字符输入流(2)

    本文介绍字符输入流 在前面一节中,我们向一个文件中写入了一些字符,通过图片可以看出总共是6个中文字符和一个换行,总共是20个字节,可以推算出字符编码是utf-8,每个汉子占3三个字节.本文就用字符输入 ...

  6. java中字符流 字节流_理解Java中字符流与字节流的区别

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个"流动的方向",通常可 ...

  7. 在java中字符流怎么复制_Java 使用字符流拷贝数据

    使用字符流拷贝数据时,需要注意在文件末尾处的数据,因为最后一次读取的长度不会刚好与数组input长度相同,所以需要引入新的变量来存储每次读取的长度. import java.io.File; impo ...

  8. java字节字符流实验报告_Java第09次实验(IO流)--实验报告

    0.字节流与二进制文件 我的代码 用DataOutputStream和FileOutputStream将Student对象写入二进制文件student.data package test; impor ...

  9. java io字符流_Java IO流字符流简介及基本使用

    Java IO流字符流简介及常用字符流的基本使用 字符流分为输入字符流(Writer)和输出字符流(Reader),这两种字符流及其子类字符流都有自己专门的功能.在编码中我们常用的输出字符流有File ...

  10. 【JAVA】-- 字符流(Reader、Writer)

    InputStream和OutputStream类在读写文件时操作的都是字节,如果希望在程序中操作字符,则可以使用字符流:FileReader对象返回的字符流是char,而InputStream对象返 ...

最新文章

  1. python 坐标连线_从具有和角度的坐标绘制线 - python
  2. jdk 9和jdk8_JDK 9 –给圣诞老人的信?
  3. 【Win 10 应用开发】分析 URI 中的查询字符串
  4. 原生node创建路由的分层
  5. 这个华人程序员是如何 6 个月狂赚 125 亿的?
  6. 基于matlab的光伏电池通用数学模型,基于MATLAB的光伏电池通用数学模型.doc
  7. 给你个选择Mac的理由,浅谈Macos系统的优点
  8. 排序算法基础+冒泡排序+冒泡排序的小优化
  9. tomcat与mysql分离部署_apache+tomcat+mysql 实现动静分离
  10. C++ 中 Windows 编程概述
  11. xcode,cocoa开发:如何使用第三方的dylib
  12. select count(*) ,count() , select *
  13. 个性化hexo博客,添加评论系统,分享,友情链接功能
  14. 中国 / 省市区县 / 四级联动 / 地址选择器(京东商城地址选择)
  15. 13.CUDA编程手册中文版---附录I C++ 语言支持
  16. 无线射频专题《射频合规,无线电认证系列简介,IC/CE/FCC/NCC/KCC/SRRC/ROHS/TELET/REACH/ANATEL》
  17. adobe清理工具_Adobe终于通过其新的渐变工具实现了这一点-UX评论
  18. 幸运数划分 lucky
  19. vim保存分享录制宏
  20. 升升不息——给电脑升级的人一些建议

热门文章

  1. python项目开发实战-给缺少Python项目实战经验的人
  2. python怎么导入时间-python初步学习-import和datetime模块
  3. python计算每月工资-[Python] 2018新税法下工资计算
  4. python中的format什么意思中文-Python中.format()常见的用法
  5. python基础语法第10关作业-【python基础语法】第8天作业练习题
  6. python if语句多个条件-python if条件判断语句
  7. python自学网站推荐-有哪些值得推荐的Python学习网站?
  8. python项目设计-Python:实际项目中抽象出的小项目设计
  9. python基础菜鸟教程-菜鸟教程学习python
  10. suse linux不能识别u盘,SUSE Linux mount u盘