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。所以,判定是否退出循环的条件是非空。
欢迎使用本黄鸭编写的小程序~
微信公众号二维码:
领取专属 10元无门槛券
私享最新 技术干货