字符流
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(); } } } }
CopyCharacters与CopyBytes非常相似,最重要的区别是CopyCharacters使用FileReader和FileWriter代替FileInputStream和FileOutputStream进行输入和输出。请注意,CopyBytes和CopyCharacters都使用int变量来读取和写入,但是,在CopyCharacters中,int变量在其最后16位中保存一个字符值,在CopyBytes中,int变量在其最后8位中保存一个字节值。
使用字节流的字符流字符流通常是字节流的“包装器”,字符流使用字节流来执行物理I/O,而字符流处理字符和字节之间的转换,例如,FileReader使用FileInputStream,而FileWriter使用FileOutputStream。
有两种通用的字节到字符“桥接”流:InputStreamReader和OutputStreamWriter,当没有符合你需求的预打包字符流类时,使用它们来创建字符流。
面向行的I/O字符I/O的单位通常比单个字符大,一个常见的单位是行:一串字符,末尾有一个行终止符,行终止符可以是回车/换行序列(“ ”),单个回车符(“ ”)或单个换行符(“ ”),支持所有可能的行终止符允许程序读取在任何广泛使用的操作系统上创建的文本文件。
让我们修改CopyCharacters示例以使用面向行的I/O,为此,我们必须使用两个我们以前从未见过的类,BufferedReader和PrintWriter。
CopyLines示例调用BufferedReader.readLine和PrintWriter.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附加当前操作系统的行终止符,这可能与输入文件中使用的行终止符不同。
有许多方法可以在字符和行之外构建文本输入和输出,有关更多信息,请参阅扫描和格式化。
上一篇:字节流 下一篇:缓冲流文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72967.html
Java™ 教程 Java教程是为JDK 8编写的,本页面中描述的示例和实践没有利用在后续版本中引入的改进。 Java教程是希望使用Java编程语言创建应用程序的程序员的实用指南,其中包括数百个完整的工作示例和数十个课程,相关课程组被组织成教程。 覆盖基础知识的路径 这些教程以书籍的形式提供,如Java教程,第六版,前往Amazon.com购买。 入门 介绍Java技术和安装Java开发软件并使用...
命令行I/O 程序通常从命令行运行,并在命令行环境中与用户交互,Java平台以两种方式支持这种交互:通过标准流和控制台。 标准流 标准流是许多操作系统的一个特性,默认情况下,它们从键盘读取输入并将输出写入显示器,它们还支持文件和程序之间的I/O,但该功能由命令行解释器控制,而不是程序。 Java平台支持三种标准流:标准输入,可通过System.in访问;标准输出,可通过System.out访问;和...
格式化流 实现格式化的流对象是PrintWriter(字符流类)或PrintStream(字节流类)的实例。 你可能需要的唯一PrintStream对象是System.out和System.err(有关这些对象的更多信息,请参阅命令行中的I/O),当你需要创建格式化的输出流时,请实例化PrintWriter,而不是PrintStream。 与所有字节和字符流对象一样,PrintStream和Pri...
字节流 程序使用字节流来执行8位字节的输入和输出,所有的字节流类都是从InputStream和OutputStream派生出来的。 有许多字节流类,为了演示字节流的工作原理,我们将重点关注文件I/O字节流,FileInputStream和FileOutputStream,其他类型的字节流以大致相同的方式使用,它们的不同之处主要在于它们的构造方式。 使用字节流 我们将通过检查名为CopyBytes的...
缓冲流 到目前为止,我们看到的大多数示例都使用无缓冲的I/O,这意味着每个读取或写入请求都由底层操作系统直接处理,这可以使程序效率低得多,因为每个这样的请求通常触发磁盘访问、网络活动或一些相对昂贵的其他操作。 为了减少这种开销,Java平台实现了缓冲的I/O流,缓冲输入流从称为缓冲区的内存区读取数据,仅当缓冲区为空时才调用原生输入API,类似地,缓冲输出流将数据写入缓冲区,并且仅在缓冲区已满时才调...
阅读 1521·2023-04-26 02:50
阅读 3497·2023-04-26 00:28
阅读 1912·2023-04-25 15:18
阅读 3163·2021-11-24 10:31
阅读 961·2019-08-30 13:00
阅读 979·2019-08-29 15:19
阅读 1744·2019-08-29 13:09
阅读 2952·2019-08-29 13:06