java.io包包含了用于管理文件和数据流的类。Java流是一大块顺序数据,你可以对它进行管理,让它适合你应用程序的需求。
文件被作为字节的顺序集保存在存储设备上。你可以使用输入流从文件里读出字节,并把这些字节保存到临时的字节数组里,或者使用输出流把它们写到新的文件里。使用流,你可以进行自动化任务,例如备份服务器上的一组目录,从文本文件读出字符,以及把文本信息写到日志文件里。
java.io包的关键组件是文件对象、InputStreams和OutputStreams、FileStreams、阅读器,以及编写器。
文件对象
在我们开始把这些文件转变成流之前,你需要对文件对象有一个很好的理解。文件对象代表了本地文件系统里的文件或者文件夹。要注意:声明一个文件对象并不会在文件系统里创建文件。
在你和文件系统打交道的时候,异常处理是很重要的。文件可能不存在——或者可能无法使用你指定的路径创建文件夹。
下面这些例子显示了文件对象的方法的使用。
创建一个新目录
使用下面的代码就能够创建一个新目录。让一个对象代表新目录,然后调用mkdir()方法创建这个目录:
//Create File Object
File newDir = new File(“d:/test/mydocs/”);
//Create New Directory
newDir.mkdir();
删除一个文件
删除一个文件很容易。只用为要删除的文件创建文件对象并调用文件的delete()方法就行了,见下面的代码片段:
//Create File Object
File f = new File(“d:/test.txt”);
//Delete the file
f.delete();
列出一个目录
要记住的是,文件对象代表着文件或者文件夹。所以如果想要列出一个目录里的所有文件,那你就要像下面这样把文件对象实例化:
//Create File Object
File dir = new File(“d:/test/”);
一旦有了合适的路径,你就可以在其内容中迭代了:
//List directory
if(dir.isDirectory())
{
String s[] = dir.list();
for (int i=0;
i
//Iterate through files
}
}
文件对象的list()方法将返回一个字符串数组,这会列出目录的内容——文件和文件夹都会被列出来。
字符串数组常常被用来向用户显示目录的内容,或者用于创建更多的文件对象来反复搜寻目录里所有的文件夹和子文件夹。
输入和输出流
流对象和过滤器对象常常会让程序员感到迷惑。图A概述了处理流和过滤器的抽象模型。
图A
抽象的输入和输出处理
输入
输入处理像下面这样工作:
输入流从输入设备读取字节。
输入过滤器从输入流里读取字节,并将数据返回给其调用者。
输出
输出处理以类似的方式工作:
输出过滤器接收数据,并把字节写到输出流。
输出流接收字节,并把它们写到输出设备。
这个简单的模型很灵活,因为你可以把其他过滤器串起来,从而扩展其处理能力,让其能够实现特定目标。
文件流和过滤器
让我们看上述模型的一个例子。在这个例子里,我们的目标是从文件系统里读取文件,对流进行缓冲,然后再用不同的名称把文件写到文件系统里。事实上,我们是在把文件从一个地方复制到另一个地方(见图B)。Listing A里的代码提供了达到这个目的的方法。
图B
文件输入和输出处理
要注意以下抽象模型和文件模型之间的关系:
FileInputStream是InputStream的子类。
BufferedInputStream是FilterInputStream的子类。
类似地:
BufferedOutputStream是FilterOutputStream的子类。
FileOutputStream是OutputStream的子类。
复制一个目录
Listing B使用了我们在Listing A里用过的copyFile方法,而且使用了文件的用于目录的list()方法,它把所有的文件(不是文件夹)从一个目录复制到了另一个目录。
这方法带有两个参数——要被复制文件夹的名称和我们要把文件复制到的文件夹。
阅读器和编写器超类
阅读器和编写器是用于所有字符流的超类。这两者都能处理Unicode字符,能够正确地处理本地编码和Unicode文本之间的相互转换。
Unicode是一项表示文本的标准,对诸如印度语、朝鲜语和汉语等字符集提供了支持。Java和XML都使用Unicode表示大量的人类语言。
当被读取的数据源是文本的时候,我们都要使用阅读器和编写器,而不是用InputStreams和 OutputStreams,后两者专门用于处理字节。
从文件读取文本
FileReader是InputStreamReader的子类,被用作从文件里读取文本。BufferedReader是阅读器的子类,能够提高字符输入操作的效率。
Listing C所包含的例子使用FileReader和BufferedReader从文件里读取文本。
把文本写入文件
FileWriter是OutputStreamWriter的子类,被用作把文本写入文件。BufferedWriter是编写器的子类,能够提高字符输出操作的效率。
Listing D使用FileWriter把Java字符串写入文件。
结论
本教程从解释文件对象开始,并把它作为理解输入和输出流,以及阅读器和编写器的基础。
你现在应该可以更好地了解了如何创建和删除文件,把文件从一个地方复制到另一个地方,以及读取和编写文本文件,所有这些都是在Java流对象的帮助下完成的。
[[The No.1 Link Start.]]
本文相关连接请点这里>>>[[The No.1 Link End.]]