IO流(上)

java程序经常要与计算机硬件进行数据交换,向磁盘文件写入数据,或者从磁盘文件向程序读入数据,向控制台输出数据,或者接收控制台的键盘输入。凡是这些与数据有关的操作,都要用到java中的数据流,也就是IO流。

下面代码在工作目录下创建了一个fwdemo.txt文本文件

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

要注意的是,这种方法不管当前目录下有没有这个名字的文件,都会创建这个文件,如果原来有同名文件,则会被这里创建的文件覆盖掉。

如果不想覆盖已有文件,而是在已有文件中添加内容,则要用到FileWriter类的另一个构造方法来初始化fw对象。

查阅API文档可以看到另一个构造方法:FileWriter(String fileName, boolean append)

布尔型的参数append表示是否对已有数据进行追加,为true表示追加,在原文件内容的末尾写内容,为false表示不追加。其实也就是是否覆盖已有文件。

FileWriter fw = new FileWriter("fwdemo.txt",true);

write()方法:向流中写数据

                  不是直接写入目的地,而是写入流的缓冲区里。

                  必须调用flush()方法才可以把流缓冲区里的内容写入目的地。

flush()方法:刷新流

                  用流对象的write方法写入数据后,并没有写入目的地,而仅仅是写入了输出流的缓存中。要调用flush方法刷新流对象,才可以把数据写入目的地。

如图,在调用write()方法后并没有把内容写入文本文件中。

使用了flush()方法才把内容写入文件中。

flush()方法什么时候用?

没必要每写一次数据就调用一次flush()方法,把所有数据写完后,再使用flush()方法刷新即可。

close()方法: 关闭流

                  关闭流的close()方法其实不仅仅是关闭流,它执行了两个动作,在关闭流之前,先刷新流,所以有些地方没有用flush()方法也可以把数据写入目的地,就是因为使用了close()方法。

                 java向硬盘文件读写数据并非直接用自己的流读写的,而是调用系统(Windows或Linux)的读写功能进行读写,所以当用完了系统的读写功能后,要释放掉读系统读写功能的调用,不然的话就会形成资源的浪费。所以在用完IO流之后,要记得关闭流。

                 输入输出里面会有很多不确定性,可能要写入数据的目的地根本就不存在,比如要往M盘的一个文件中写数据,而当前机器上根本不存在M盘,又比如要从D盘的“hello.txt”文件读数据,可是D盘并不存在“hello.txt”这个文件,等等这样的错误情况。一旦存在不确定性,程序就可能会产生异常,所以在IO这一部分,异常是很重要的,对异常的处理自然相当重要。

                  java中会出现异常的动作有:1.write    2.read     3.flush      4.close    。也就是说在IO操作中每一个动作都可能存在异常,所以都要对异常进行处理。

                  对异常进行处理。

                  直接抛异常是最简单的方法,但同时也是最差的处理方式。虽然编译运行不会出错,但是一当产生异常,程序的功能就无法实现。我们写程序为的是完成功能,而不是不出错。对于初级的编程者而言,我觉得应该尽可能多的扑捉异常,查看异常出现的地方,要弄明白为什么出异常。

                   当出现异常是,程序将进入异常捕获代码catch中执行,出现异常以后的代码将不能被执行。但是流还得关闭,所以关闭流的代码要不能放在try中,而应该放在catch或者finally中。

 在上面的代码中,finally代码块中,首先判断fw对象是否为空,不为空才调用close()方法关闭流,这样做的好处是,如果在前面的语句中出现异常,那么有可能fw对象就没有被实例化,为空,空的流对象调用close()方法肯定会产生异常,当然在进行异常处理也行,不过浪费资源,如果通过判断流对象不为空才调用close()方法,就不会产生关闭流的异常,也就不用再进行异常处理。

下面说说IO读中的一些小问题。

在使用read()方法读时,一次读一个字节。有一个现象要注意,就是当读一次之后,再进行读时,不会读已经读过的,会自动向后读。

如上图,fr对象进行两次读,分别村让c1,ci字符变量,可以看到两次读得内容不一样,查看所读文件可以发现,是从文件第一个字符开始读的。

read()方法返回的是一个整数,代表的是当前字符在编码表中所对应的整数。,返回整数的范围是-1~65535,0~65535表示的是字符,-1表示的是文件的末尾。也就是说,文件在保存时,会自动在文件末尾加上一个-1。

所以,在对文件进行字符读操作时,可以通过判断read()方法返回的数字是不是-1,如果是-1,表示已经读到文件的末尾。

可以看到直接输出c的话输出的是数字,这些数字代表的是文件中的字符在编码表中对应的数字编码。

通过类型转换就输出了文件本来的内容。

通过上面的程序也可以看出,输入流具有记忆功能,前面读到哪里,以后再读的话,就从上一次读到的地方开始读。

通过今天的学习,对java输入输出流有了更深入的理解,也加强了这部分内容的记忆。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值