java文件处理外文翻译资料

 2022-01-08 21:19:08

英语原文共 719 页,剩余内容已隐藏,支付完成后下载完整资料


文献翻译:

文件处理

要求:

学完此章,你需要做到:

解释一系列输入输出设备输入输出的原理;

了解I/O流的概念;

会使用Java编写基本的文件处理;

区分数据的文本,二进制和对象编码;

区分串行访问文件和随机访问文件;

使用上述所有编码和访问方法在Java中创建和访问文件。

18.1 介绍

在之前11以及12章的学习中,可以发现若我们不对数据进行本地保存,那么在关闭电脑或关闭应用程序后,我们的数据会丢失,而我们的应用程序也就意义不大了。在之前章节的学习中,相信你已经发现我们提供了一种特殊的类TenantFileHandler来将我们的数据存储到光盘上。

现在是时候让你自己学习该如何做这件事了。而你也已经知道存储数据的块,我们命名为文件。

当我们进行面向对象的开发时,我们试图使行为与数据相分离,然而在存储数据时,我们只关心数据是如何被保存的。而且,在提及数据时,我们常用记录以及字段来称呼——例如人,库存项,学生等等。字段就是我们在面向对象中经常提及的属性——名字,库存号,考试成绩等等。

在本章节我们将会学习到如何创建文件,并且将信息写到里面,然后在我们需要的时候再读取出来。首先我们来了解输入与输出(通常我们称为I/O),你将学习到一系列不同的方法来备份你的数据。

18.2 输入与输出

任何计算机系统都必须提供一种方法,允许信息从外部世界(输入)进入,一旦处理完,就可以再次发送(输出)。输入和输出以及文件所涉及的问题,有时在程序员看来也是比较棘手的问题。

与计算机系统的所有方面一样,输入和输出过程由与系统软件(即操作系统(例如Windowstrade;、MacOStrade;或Linux))一起工作的计算机硬件处理。此时运行的特定应用程序通常通过与操作系统通信来处理输入和输出,并让它与硬件一起执行这些任务。

所有这些都涉及到一些真实、复杂程序猿一般不太关心的底层细节;例如,系统如何写入磁盘等外部媒体,或者它如何协调处理器磁盘驱动器之间的速度差异。

18.3 输入与输出设备

从外部世界获取数据输入的最常见方法键盘输入;显示输出数据的最常见方法是在屏幕上。因此,大多数系统通常都是这样设置的:标准输入和输出设备分别是键盘和屏幕。然而,还有许多与输入和输出有关的设备:用于永久存储数据(本地和远程)的磁性、固态和光盘;flash驱动器;用于与其他计算机通信的网络接口卡和调制解调器;以及用于打印硬拷贝的打印机。

我们应该记住,在某种意义上,不管输入或输出设备是什么,这个过程总是相同的。计算机中央处理单元根据程序指令处理的所有数据都存储在计算机的主存储器或RAM(随机存取存储器)中。输入是从某个外部设备到主存储器的数据传输,而输出是从主存储器到外部设备的数据传输。为了进行输入或输出,必须在设备和计算机存储器之间建立通信信道。这样的通道称为流。操作系统将建立一个标准输入流和一个标准输出流,通常分别是键盘和屏幕。除此之外,通常还有一个标准错误流,可以在其中显示错误消息;这通常也设置为屏幕。标准流的所有这些默认设置都可以通过操作系统或程序本身进行更改。

在前面的章节中,您已经看到System类有两个调用的属性。除此之外,它还有一个名为err的附加属性;这些对象已经设置为提供对标准输入、输出和错误流的访问。中的属性是名为InputStream的类的对象。这个类提供了一些处理基本输入的低级方法,它们是低级的,因为它们处理的是字节序列,而不是字符序列。作为一个更高级的类,InputStream可以围绕这个类来处理字符输入;InputStreamReader对象随后可以被另一个类BufferedReader包装,BufferedReader以字符串的形式处理输入。

在Java 5.0提供Scanner类之前,从键盘读取的这种复杂的方式是如何完成的。下面的程序演示了如何以这种方式获得键盘输入。

您可以看到BufferedReader的readline方法用于从键盘获取字符串;正如您预期的那样,该方法从键盘读取字符,直到用户按下Enter键。如果在过程中发生错误(如键盘锁定),它将抛出IOException,并且必须对此进行处理。

在本章中,我们将以文件的形式处理数据到外部磁盘驱动器的输入和输出,而不是处理标准流的输入和输出,但是,正如您将看到的,原理是相同的。

18.4 文件处理

输出过程包括将数据从存储器传输到文件,通常称为写入;输入过程包括将数据从文件传输到存储器,称为读取。这两种方法都涉及到一些底层细节,与数据物理存储在磁盘上的方式有关。作为程序员,我们不想过分担心这个过程,当然,这个过程在不同的机器之间和在不同的操作系统之间是不同的。幸运的是,Java使我们很容易处理这些过程。正如我们将看到的,Java提供了低级类,这些类创建了用于处理主存和磁盘上的命名的通信的文件输入或输出流。它还提供了更高级的类,我们可以“围绕”低级对象,使我们能够使用与我们的逻辑思考数据方式更紧密相关的方法。这样,我们就不必知道太多关于特定系统存储和检索文件数据的细节。

正如我们将看到的,整个过程使我们能够以我们理解的单位来读取和写入数据,例如,字符串、文本行或基本类型(如整数或字符)的形式;Java甚至允许我们存储和检索整个对象。

18.4.1 编码

Java支持三种不同的编码数据的方式,即表示磁盘上的数据。它们是文本、二进制和对象。

文本编码意味着磁盘上的数据以外部系统(通常是ASCII)使用的格式存储为字符。如我们所知,Java使用Unicode字符集,因此,取决于外部系统所使用的窗体,在该过程中可能会发生一些转换,但幸运的是程序员不必为此担心。例如,考虑将数字107保存到文本文件中,它将以ASCII代码(或系统使用的任何字符)中的字符“1”保存,后跟字符“0”,后跟字符“7”。因此,文本编辑器(如Windowstrade;记事本)可以读取文本文件。

另一方面,二进制编码意味着数据的存储格式与程序用于在内存中存储数据的数据的内部表示形式相同。所以107号将被保存为二进制数1101011。文本编辑器无法正确读取二进制文件,如第节所示。18.6。

最后,对象编码是Java提供的一种强大的机制,从而可以用单个命令输入或输出整个对象。

您可能会问自己,当您开始编写读写文件的应用程序时,哪种方法是最好的。好吧,如果你的文件是用同一个应用程序读写的,那么它们的编码方式就没有什么区别了。只需使用对于您正在存储的数据类型似乎最简单的方法。但是,请记住,如果您希望文本编辑器读取文件,那么您当然必须使用文本编码方法。

18.4.2 访问

在我们演示如何在Java中写入文件之前,您需要考虑的一个问题是文件是可访问的。有两种方法可以实现串行访问和随机访问。在第一种(也是更常见的)方法中,每个数据项依次被读取(或写入)。操作系统提供了所谓的文件指针,它实际上只是内存中的一个位置,用来跟踪我们在读或写文件的过程中要到达的位置。

另一种在文件中访问数据的方法是直接访问您想要的记录,这被称为随机访问,有点像直接访问您想要的DVD上的剪辑;而串行访问就像使用一种老式的录像带,您必须在整个磁带中工作,才能达到您想要的位。Java提供了一个可用于随机访问的类(RandomAccessFile)。不过,我们将从串行访问开始。

18.5 文本文件读写

在本节和下一节中,我们将使用一个名为car的非常简单的类作为示例;此类的代码如下所示:

下面的程序TextFileTester是一个非常简单的菜单驱动程序,它可以操作作为列表保存在内存中的汽车列表;它提供了向列表中添加新车、从列表中删除汽车以及显示列表中所有汽车的详细信息的功能。因为它只是一个演示程序,所以在我们尝试删除某个项目之前,我们不必为输入验证或检查列表是否为空而烦恼。

与我们之前讨论过的其他类似程序之间的区别在于我们前面提到的现有临时记录,我们在第12章中对我们的案例研究进行了类似的思考,但这一过程对您是不利的。

程序的设计是这样的:当选择退出选项时,列表被写为一个永久性的文本文件Cars.txt;每次程序运行时,这个文件被读到内存中。

程序如下所示;要注意为了访问文件,我们提供了两个助手方法,即writeList和readList;正如我们将要解释的,writeList方法还首次处理创建文件。还要注意,为了方便起见,我们正在使用我们在第8章中开发的EasyScanner类。

这里我们只需要分析writeList和readList方法,其他方法都不涉及任何新的东西。让我们从writeList开始:

首先要注意的是,我们已经将所有内容封闭在一个try块中。在这里,我们用14章介绍的try - with-- resources来创建文件。我们之所以使用它,是因为在我们完成使用之后,企业将失去它。关闭文件有两个目的。首先,它确保一个特殊的字符,即文件结尾标记,1被写入文件结尾。这使我们能够在浏览readlist方法时,更详细地了解文件结尾是什么时候到达的。第二,关闭文件意味着它不再可访问到程序,因此不会出现书面错误。

使用Try with Resources可确保文件始终处于关闭状态,无论在Try with Resources出现之前发生了什么其他错误或异常,我们都必须通过调用PrintWriter的Close方法(这将在finally子句中完成)。如您所见,打开文件的说明已放在try关键字后的括号中。我们将使用Try with Resources在本章中创建和打开文件。

文件是通过使用一个名为FileWriter的类打开的;这是我们前面讨论过的提供程序和文件之间低级通信的类之一。通过打开文件,我们建立了一个流,通过它我们可以向文件输出数据。我们创建了一个FileWriter对象carFile,并为其提供要写入数据的文件名:

在这种情况下,我们称文件 Cars.txt(尽管我们没有给出绝对地址,但该文件将保存在当前文件目录下)。创建新的FileWriter对象会导致文件在输出模式下打开,这意味着它已准备好接收数据;如果不存在此名称的文件,则将创建一个文件。以这种方式打开文件(在输出模式下),意味着我们写入文件的任何数据都将清除以前的内容。这就是这个特定应用程序所需要的,因为我们只需要在程序终止时编写整个列表。但是,有时需要在附加模式下打开文件;在此模式下,写入文件的任何数据都将在现有数据之后写入。要做到这一点,我们只需要使用另一个构造函数,它接受一个额外的(boolean)参数,指示我们是否需要附加模式:

我们要做的下一件事是在PrintWriter类中创建carWriter对象,并将该对象作为一个参数。

这个对象现在可以通过carFile对象与我们的文件通信;PrintWriter对象的方法比FileWriter对象(例如print和println)更高级,它使我们能够像在输出到屏幕时那样编写整个字符串。

现在,我们准备好将列表中的每辆车写入我们的文件,我们可以使用for循环:

在每次迭代中,我们使用PrintWriter对象CarWriter的println方法将汽车的注册号、品牌和价格写入文件;println在写入之前将价格转换为字符串。请注意,println方法在它打印的字符串的末尾插入一个换行符;如果不希望插入换行符,我们将使用print方法。

最后,我们必须处理FileWriter方法可能引发的任何IOExceptions:

稍后,我们将探讨阅读文件的代码。但请记住,如果我们运行程序并添加一些记录,然后退出程序,我们会将数据保存到一个名为cars.txt的文本文件中,因此我们应该能够使用文本编辑器读取此文件。当我们这样做的时候,我们创造了三辆车,然后使用Windowstrade;记事本查看文件内部。图18.1显示了结果。

18-1 用Windows记事本打开文件

正如我们使用println语句编写的每个字段一样,正如您所看到的,每个字段都从一行开始。如果我们的目标是像刚才那样使用文本编辑器查看文件,那么这可能不是最合适的格式,例如,我们可能希望每行有一条记录;如果我们愿意,也可以打印一些标题。然而,实际上,我们的目的是让我们的程序在程序启动时将整个文件读到我们的列表中,正如我们现在看到的,每行一个字段可以使文本的阅读变得轻松愉快。让我们来看一下readlist方法:

首先,我们已经声明了一些变量来保存每个字段的值,因为我们在逐步读取文件。记住这是一个文本文件,我们已经声明了三个字符串:

最后一个值必须转换为double,然后才能存储在列表中,因此在转换后,我们还需要一个变量来保存该值:

现在,和以前一样,我们将所有内容放入一个try块,因为我们将不得不处理由我们将要使用的各种方法抛出的异常。同样,我们使用的是Try with Resources,因此打开文件的过程在尝试之后放在括号中。从代码中可以看到,我们首先创建一个类filereader的对象carfile,它处理读取文件过程中涉及的低级细节。我们希望读取的文件cars.txt的名称作为参数发送给构造函数;然后在读取模式下打开该文件。

现在,为了使用一些更高级的读取方法,我们将carFile对象包装在一个名为Bufferedreader的类的对象中。我们称这个新的对象为carStream。

现在我们将依次读取

全文共11237字,剩余内容已隐藏,支付完成后下载完整资料


资料编号:[1855]

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。