首先我们先来了解一些IO流基本知识。

一,基本知识概括

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

具体的IO流有很多种,针对不同的应用场景应该使用相应的流对象。但怎么确定应该使用哪个IO流对象呢?

一般要有四个明确:

1)明确源和目的

源:InputStream Reader

目的: OutputStream Writer

2)明确是否纯文本数据(Reader和Writer只能处理纯文本数据)

源:是:Reader

    否:InputStream

目的:是:Writer

      否:OutputStream

3)明确具体的设备

源:

a.硬盘 File

b.键盘 System.in

c.内存 数组容器

d.网络 Socket流

目的:

a.硬盘 File

b.控制台 System.out

c.内存 数组

d.网络 Socket流

4)是否需要额外功能

a.提高效率

加缓存区

b.需要转换

加上转换流

 

二,转换流

缓存技术我的上一篇文章有讲到过,那么什么是转换流?具体又什么作用呢?

我们知道System.in是一个一个字节进行接收,这样的操作效率很慢,为了加快操作速度可以将字节流转换成字符流,这样就可以按行操作。对应的类为:

InputStreamReader 字节流转化成字符流,此外该对象还可以指定特定的编码集

那么,我们的输出对象System.out也是按字节流进行输出,那么在输出的时候,就需要将读入的字符流转换成字节流再传给out进行输出。对应的类为;

OutputStreamWriter 字符流转换成字节流,此外该对象还可以指定特定的编码集

另外,在加上缓存技术,提高效率,具体的IO流输入和输出方向可以形象的用下图表示:

Java:IO流-流的操作规律和转换流 随笔 第1张

 

三,应用示例

需求描述:

              * 获取用户的键盘输入

              * 将数据变成大写显示在控制台上

              * 如果用户输入的是over,结束键盘输入

private static void readEff() throws IOException { /*InputStream in = System.in; InputStreamReader inr = new InputStreamReader(in);//将字节流转换成字符流 BufferedReader br = new BufferedReader(inr);//加入缓存技术,提高读取效率 OutputStream out = System.out; OutputStreamWriter ow = new OutputStreamWriter(out);//将字符流转换成字节流 BufferedWriter bw = new BufferedWriter(ow);//加入缓存技术,提高输出效率*/
        //更简洁的写法
        /* * 另外可以根据输入输出的源头,替换相应的输入输出对象 * 需求1,将键盘输入写入到文本文件中 * 需求2,将文件中的数据输出到控制台 */ BufferedReader br = new BufferedReader(new InputStreamReader(System.in));//需求2,System.out=>new FileInputStream("xx.txt")
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));//需求1.System.out=>new FileOutputStream("xx.txt")
 String line = null; while((line=br.readLine())!=null) { if("over".equals(line)) break; bw.write(line.toUpperCase()); bw.newLine(); bw.flush(); } }

 

最后,美景来一张,Life is beautiful!

Java:IO流-流的操作规律和转换流 随笔 第2张

 

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄