15.4.3 转换流

15.4.3 转换流

转换流 将字节流转成字符流

输入/输岀流体系中还提供了两个转换流,这两个转换流用于实现将字节流转换成字符流,其中

  • InputStreamReader字节输入流转换成字符输入流,
  • OutputStreamWriter字节输出流转换成字符输出流

为什么没有把字符流转换成字节流的转换流

  • 字节流比字符流的使用范围更广,
  • 字符流比字节流操作方便

字节流转成字符流是为了使用更方便

如果现在有一个字节流,但可以确定这个字节流的内容都是文本容,那么把它转换成字符流来处理就会更方便一些.

没有必要将 使用方便的 字符流转成 使用更麻烦 的字节流

如果有一个流已经是字符流了,也就是说,是个用起来更方便的流,没有必要转换成使用起来不方便的字节流

所以Java只提供了将字节流转换成字符流的转换流,没有提供将字符流转换成字节流的转换流。

程序 读取键盘输入

下面以获取键盘输入为例来介绍转换流的用法。Java使用System.in代表标准输入,即键盘输入,但这个标准输入流是InputStream类的实例,使用不太方便,而且键盘输入内容都是文本内容,所以可以使用InputStreamReader将其转换成字符输入流,普通的Reader读取输入内容时依然不太方便,可以将普通的Reader再次包装成BufferedReader,利用BufferedReaderheadLine方法可以一次读取一行内容。
如下程序所示。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
import java.io.*;

public class KeyinTest
{
public static void main(String[] args)
{
try(
// 将Sytem.in对象转换成Reader对象
InputStreamReader reader = new InputStreamReader(System.in);
// 将普通Reader包装成BufferedReader
BufferedReader br = new BufferedReader(reader))
{
String line = null;
// 采用循环方式来一行一行的读取
while ((line = br.readLine()) != null)
{
// 如果读取的字符串为"exit",程序退出
if (line.equals("exit"))
{
System.exit(1);
}
// 打印读取的内容
System.out.println("输入内容为:" + line);
}
}
catch (IOException ioe)
{
ioe.printStackTrace();
}
}
}

上面程序将System.in包装成BufferedReader,BufferedReader流具有缓冲功能它可以一次读取一行文本(以换行符为标志),如果它没有读到换行符,则程序阻塞,等到读到换行符为止。
运行上面程序可以发现这个特征,在控制台执行输入时,只有按下回车键,程序才会打印出刚刚输入的内容。

通常把读取文本内容的输入流包装成BufferedReader

由于BufferedReader具有一个readLine()方法,可以非常方便地一次读入一行内容,所以经常把读取文本内容的输入流包装成BufferedReader,用来方便地读取输入流的文本内容.