简介

Java平台使用Unicode约定存储字符值。字符流I / O自动将此内部格式转换为本地字符集。在西方,本地字符集通常是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。 当没有满足您需求的预包装字符流类时,可以使用它们来创建字符流。
网络中的套接字课程显示了如何通过套接字类提供的字节流创建字符流

线性IO

字符I / O通常发生在比单个字符更大的单位中。一个常用单位是行:一串字符,末尾有一个行终止符。行终止符可以是回车/换行顺序(“\ r \ n”),单个回车(“\ r”)或单行换行(“\ n”)。支持所有可能的线路终端器允许程序读取在任何广泛使用的操作系统上创建的文本文件。 
我们使用线性IO去修改CopyCharacters示例。要做到这一点,我们必须使用我们以前没有用到的两个类,BufferedReader和PrintWriter。我们将在缓冲I / O和格式化中更深入地探索这些类。现在,我们只是对支持线性I / O感兴趣。 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输出每一行,并附加当前操作系统的行终止符。这可能不是输入文件中使用的行终止符。 


IO Streams:字符流的更多相关文章

  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. IO之字符流

    什么是字符流 对于文本文件(.txt .java .c .cpp) 使用字符流处理 注意点 读入的文件一定要存在 否则就会报FileNotFoundException 异常的处理 为了保证流资源 一定 ...

  6. java IO之 字符流 (字符流 = 字节流 + 编码表) 装饰器模式

    字符流 计算机并不区分二进制文件与文本文件.所有的文件都是以二进制形式来存储的,因此, 从本质上说,所有的文件都是二进制文件.所以字符流是建立在字节流之上的,它能够提供字符 层次的编码和解码.列如,在 ...

  7. Java——IO类 字符流概述

    body, table{font-family: 微软雅黑} table{border-collapse: collapse; border: solid gray; border-width: 2p ...

  8. Java IO(四--字符流基本使用

    在上一节,介绍了字节流的基本使用,本节介绍一下字符流的使用 Reader: public abstract class Reader implements Readable, Closeable { ...

  9. 文本数据IO操作--字符流

    一.Reader和Writer 1. 字符流原理 Reader是所有字符输入流的父类而Writer是所有字符输出流的父类.字符流是以字符(char)为单位读写数据的.一次处理一个unicode.字符流 ...

  10. Java IO系统--字符流

    字符流:尽管字节流提供了处理任何类型输入/输出操作的足够功能,它们补鞥呢直接操作Unicode字符.字符流层次结构的顶层是Reader和Writer抽象类.类似于InputStream和OutputS ...

随机推荐

  1. 手工恢复OSSIM数据库密码

    1,现象 今天需要远程连接ossim的mysql数据库读取些东西,于是登录ossim的终端,发现这个mysql客户端无法直接登录,使用自己安装时候那些口令都不行 alienvault:~# mysql ...

  2. 洛谷 P1001 A+B Problem

    题目描述 输入两个整数a,b,输出它们的和(|a|,|b|<=10^9). 注意 1.pascal使用integer会爆掉哦! 2.有负数哦! 3.c/c++的main函数必须是int类型,而且 ...

  3. 使用tensorflow object_detection API训练自己的数据遇到的问题及解决方法

    1.Windows下出现找不到object_detection包的问题. 解决方法 在Anaconda3\soft\Lib\site-packages新建一个pth文件,将PedestrianDete ...

  4. Android读书笔记三

    通过一章的学习体会到Git的重要性,因为想要获取开源的源代码,必须要使用Git,而且Linux内核完全是由Git管理的.Git是对源代码进行管理,在使用之前需要先安装,命令是 (1)apt-get i ...

  5. java 会话跟踪技术

    1.session用来表示用户会话,session对象在服务端维护,一般tomcat设定session生命周期为30分钟,超时将失效,也可以主动设置无效: 2.cookie存放在客户端,可以分为内存c ...

  6. 【线段树 泰勒展开】Codechef April Challenge 2018 Chef at the Food Fair

    第一次写泰勒展开:本地和CC差距好大 题目大意 大厨住的城市里办了一场美食节.一条街上开设了$N$个摊位,编号为$1∼N$.这天开始时,第$i$个摊位的食物会导致食物中毒的概率是$P_i$.在这一天中 ...

  7. 【Python学习之五】高级特性5(切片、迭代、列表生成器、生成器、迭代器)

    5.迭代器 由之前的生成器可知,for循环用于可迭代对象:Iterable.包括集合数据类型: list.tuple.dict.set.str 等,以及两种生成器.判断迭代器,使用 isinstanc ...

  8. MYSQL不能显示中文字,显示错误“ERROR 1366 (HY000): Incorrect string value: '\xE5\xBC\xA0\xE4\xB8\x89'”

    或者建表时带上编码utf8 CREATE TABLE `students`( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY, `name` VARCHAR( ...

  9. css制作三角形,下拉框三角形

    网站制作中常常需要下拉框,而如果下拉框如果只是单纯的矩形则会显得太过单调,所以这次教大家利用css制作三角形放在矩形上面 首先利用css制作三角形 div { width:0px; height:0p ...

  10. 【HIHOCODER 1176】 欧拉路·一

    描述 小Hi和小Ho最近在玩一个解密类的游戏,他们需要控制角色在一片原始丛林里面探险,收集道具,并找到最后的宝藏.现在他们控制的角色来到了一个很大的湖边.湖上有N个小岛(编号1..N),以及连接小岛的 ...