今天因为要写一个模仿cp的小程序(就叫作Copy吧),所以学习了下Java的文件读写机制。虽然是个非常简单的东西,不过自己还是弄了很久,感到非常挫败。由于自己才是初学(Java和CS都是),所以这篇笔记肯定会有很多错误,既是总结,也是对自己学习程度的记录吧。
从读写的数据类型来看,Java的文件读写共分两类:一种是字符(Character),另一种是字节(Byte)。前者要用到FileReader, FileWriter之类的字符处理接口,而后者要用到FileInputStream和FileOutputStream这样的字节流接口。
由于Copy不单要处理字符文件,所以要使用字节流接口。
无论是字符流还是字节流,既然涉及到文件的读写,就会碰到至少两大问题:
虽然FileInputStream和FileOutputStream都支持String file_path作为参数来构建对象,但考虑到以上两个问题的存在,我还是先构建两个File对象f1和f2。假如f2已经存在,则询问是否覆盖。如果不存在,则创建f2。由于Java的exception机制,假如f1不存在,Java会抛出异常,因此不需要作特殊处理。
解决了File对象的问题之后,就以f1和f2为参数,构建inputStream和outputStream,并进行读写。
在Java中,当涉及到文件的读写问题是,会强制要求在该method的header中加入异常处理。由于Copy同时涉及到读写,因此FileNotFoundException和IOException这两个Exception都需要加入。当读写操作遇到上述的两个问题是,会自动抛出异常,并提供相关的信息。
当碰到目标文件已经存在时,Copy会询问是否覆盖以存在的文件,因此会需要命令行交互。一开始我尝试使用Scanner来实现这个功能,发觉并不合适(功能完全不对)。命令行交互应该使用Console来实现。
import java.io.*; //for Console
Console cons = System.console;当需要与命令行交互时,只需要:
String next;
next = cons.readLine();即可。
需要注意的是,由于next是String,因此用==来判断next的值是不行的。需要用String.equals(String another_string)。
尽管是个非常非常非常简单的程序,不过已经让我碰到了很多麻烦。总结问题如下: