黑马程序员_Java_I/O流学习(第二天)

-------android培训java培训、期待与您交流! ----------

 

java对于数据的操作都是通过流(I/O)的方式来实现的。java提供了异常强大的流体系。java中用于操作流的的对象都在java.io包下。流按照流向分为:字节流(InputStream和OutputStream)和字符流(Reader和Writer)。这是流体系中的四个顶层的抽象基类。其有非常多的实现子类,这些类的名称有个特点:以四个基类名为后缀,功能为前缀组成,例如处理文件的字符输入流就是FileReader,处理文件的字节输入流就是FileInputStream。按这个特点我们很容易记住流体系中的绝大数的类名以及能够大致知道它们的功能。

字符流:专门用于操作字符的流。它是由字节流发展而来的。为我们操作文本数据提供了非常方便的功能。我们在操作文本数据的时候可以使用字符流也可以使用字节流来实现。因为计算机中的一切数据、文件等都是二进制形式存在的。所以使用字节流可以实现一切跟流有关的操作。字符流的出现极大的方便了我们对于文本,字符的处理。

以FileWriter和FileReader为例来看看它们的用法。

FileWriter fw = new FileWriter("test.txt");

创建一个FileWriter对象,该对象一旦被创建就必须要明确被操作的文件。而且该文件会被创建到指定目录下。如果该目录已有同名文件则文件会被覆盖!所以在使用该构造器的时候要特别注意。如果不想覆盖文件,我们可以使用一个重载的构造器FileWriter(“test.txt”,true);指定将新的文本内容追加到原文件末尾。

我们可以调用fw.write(“文本内容”);将文字信息写入到该流中,注意:写进去的在内存中,如果我们想将内容保存到实际的文件中则需要接着调用fw.flush();方法刷新流。或者使用close方法来关闭流,在关闭流之前会先调用flush来刷新流。同样能将流中字符信息写入到磁盘上。flush和close方法的区别在于:flush后可以接着往流中写内容。而如果在调用close方法后再向流中写内容会报异常。一般我们写代码时都是将流的关闭动作放在finally块中。这样保证流的一定会被关闭。

FileReader fw = new FileReader("test.txt");

 创建一个FileReader对象。用于从磁盘上读取一个文本文件。通过调用read()方法返回读取到的字符所对应的ascii码值。该方法是一个字符一个字符的读取。通常使用while循环来操作。也可以使用read(char[])方法。我们需要先定义一个临时字符数组。该方法一次读取数据将数据填充到字符数组中。一般字符数组定义时大小被指定为1024的整数倍。

java中提供了缓冲流的功能:可以将已有流对象作为参数传给缓冲流的构造函数,以达到功能增强的目的。这是一种装饰设计模式。之所以采用装饰模式而不是继承已有类,原因在于,如果继承已有类会将io的集成体系变得异常臃肿和复杂,装饰模式更加灵活,并且降低了类与类之间的关系。

缓冲流的用法和前面说的类似。不过读取数据时装饰流(BufferedReader)提供了readLine方法。它可以一次读取一行数据,不过不会将结尾的'\r','\n'字符读出。实际开发中通常采用装饰流来包装已有流的方式。在关闭资源的时候只需要关闭装饰流即可。因为其内部调用的就是被装饰流的close方法。

 

转换流:InputStreamReader和OutputStreamWriter

问题:键盘录入(System.in)的read方法是字节流InputStream的方法,能不能将字节流转化成字符流再使用缓冲区中的readLine方法?

我们可以使用InputStreamReader转换流来包装System.in对象。从而将字节流转化成字符流。

同理我们可以使用OutputStreamWriter来包装System.out对象。转换后我们就可以使用操作字符流的方式来操作字节流了。为我们的开发提供了极大的方便。

 

java的流体系如此庞大,我们编码时该如何确定使用哪个体系的哪个类呢?做好三个明确,效率事半功倍!

1.明确源和目的:

        源:输入流,InputStream,Reader

          目的:输出流,OutputStream,Writer

2.操作的数据是否是纯文本?

        是:字符流,不是:字节流。

3.当体系明确后再明确具体要使用哪个对象

        通过设备来区分:

        源设备:内存,硬盘,键盘。

        目的设备:内存,硬盘,控制台

明确以上三点之后。我们就可以很快速的知道如何使用流对象来操作我们的数据了。

 

-------android培训java培训、期待与您交流! ----------

详细请查看:http://edu.csdn.net/heima/ 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值