面向对象的编程-Application 25

Previously on OOP:

Copying the entire content of one file to another can be implemented using either byte-based or block-based approach.FileInputStreamandFileOutputStreamare the two classes used to open files. In addition, we have introduced two types of read() and write() functions.

在理论部分,我们除了FileInputStream和FileOutputStream学习过这两个类之外,还有FileReader和FileWriter。前面一组和Stream有关,比较适合处理byte相关的文件。后面一组更加适合处理character相关的文件,每次能读取一个character,block of characters,或者是一行。选用前面一组还是后面一组,要根据文件的内容来确定。

现在有一份鸭的成绩单,我们将要使用FileReader和FileWriter来读写。

与其说这份文件的内容是由characters构成的,选用FileReader类,不如直接用regular expression。所谓regular expression,就是用计算机可以看得懂的语言来表达字符串的pattern。比如可以把“marks.txt”中的每一行看做是一个字符串,“-”的前半部分是名字,后半部分是分数。用regular expression能把前后两部分分别取出来,并且存放到数据结构中去。

虽然regular expression非常好用,但是本黄鸭还是决定先举一个FileReader的例子。

虽然编译器认为main函数可能产生的Exception是FileNotFoundException,但是编译器的这个suggestion是不对的,正确的Exception应该是IOException。

Solution 1Read one character at a time.

使用FileReader类把“marks.txt”打开,然后调用FileReader类中的read()函数读取文件中的一个character。需要注意的是read()函数返回的类型是int,所以还需要把int强制转换为char类型。

接下来是一个当循环结构,即当读取的character不是“-1”,也就是文件还没有结束的时候,进入循环体。先把当前的character打印出来,再读取下一个字符。

最后用close()文件把文件关闭,这是一个极好的编程习惯。

Solution 2Read a buffer's size at a time.

和前一篇文章的implementation of read and write by block差不多。创建一个名字叫做buffer的数组,数组的大小要比1大上很多。用read()函数往buffer数组里面存放读取到的characters,返回值是读到的characters的个数,或者是“-1”,代表end of the file。写一个直到循环体,根据返回值来判定是否要退出循环。

Solution 3Read one line at a time.

readLine()是一个函数,不是Reader或者是FileReader类的,而是BufferedReader类的。创建一个BufferedReader类的实例有一些特别,因为constructor需要的参数是FileReader类的实例。

另外还有一点需要注意,文件结束时,readLine()函数取得的值不是“-1”,而是null。所以,判定是否退出循环的条件是非空。

欢迎使用本黄鸭编写的小程序~

微信公众号二维码:

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181030G1DI6J00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券