文档库 最新最全的文档下载
当前位置:文档库 › 第10章_Java_IO系统

第10章_Java_IO系统

第10章_Java_IO系统
第10章_Java_IO系统

第10章Java IO系统

“对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务。”

由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的。其中最大的挑战似乎是如何覆盖所有可能的因素。不仅有三种不同的种类的I/O需要考虑(文件、控制台、网络连接),而且需要通过大量不同的方式与它们通信(顺序、随机访问、二进制、字符、按行、按字等等)。

Java库的设计者通过创建大量类来攻克这个难题。事实上,Java的I/O系统采用了如此多的类,以致刚开始会产生不知从何处入手的感觉(具有讽刺意味的是,Java的I/O设计初衷实际要求避免过多的类)。从Java 1.0升级到Java 1.1后,I/O库的设计也发生了显著的变化。此时并非简单地用新库替换旧库,Sun的设计人员对原来的库进行了大手笔的扩展,添加了大量新的内容。因此,我们有时不得不混合使用新库与旧库,产生令人无奈的复杂代码。

本章将帮助大家理解标准Java库内的各种I/O类,并学习如何使用它们。本章的第一部分将介绍“旧”的Java 1.0 I/O流库,因为现在有大量代码仍在使用那个库。本章剩下的部分将为大家引入Java 1.1 I/O库的一些新特性。注意若用Java 1.1编译器来编译本章第一部分介绍的部分代码,可能会得到一条“不建议使用该特性”(Deprecated feature)警告消息。代码仍然能够使用;编译器只是建议我们换用本章后面要讲述的一些新特性。但我们这样做是有价值的,因为可以更清楚地认识老方法与新方法之间的一些差异,从而加深我们的理解(并可顺利阅读为Java 1.0写的代码)。

10.1 输入和输出

可将Java库的I/O类分割为输入与输出两个部分,这一点在用Web浏览器阅读联机Java类文档时便可知道。通过继承,从InputStream(输入流)衍生的所有类都拥有名为read()的基本方法,用于读取单个字节或者字节数组。类似地,从OutputStream衍生的所有类都拥有基本方法write(),用于写入单个字节或者字节数组。然而,我们通常不会用到这些方法;它们之所以存在,是因为更复杂的类可以利用它们,以便提供一个更有用的接口。因此,我们很少用单个类创建自己的系统对象。一般情况下,我们都是将多个对象重叠在一起,提供自己期望的功能。我们之所以感到Java的流库(Stream Library)异常复杂,正是由于为了创建单独一个结果流,却需要创建多个对象的缘故。

很有必要按照功能对类进行分类。库的设计者首先决定与输入有关的所有类都从InputStream继承,而与输出有关的所有类都从OutputStream继承。

10.1.1 InputStream的类型

InputStream的作用是标志那些从不同起源地产生输入的类。这些起源地包括(每个都有一个相关的InputStream子类):

(1) 字节数组

(2) String对象

(3) 文件

(4) “管道”,它的工作原理与现实生活中的管道类似:将一些东西置入一端,

它们在另一端出来。(5) 一系列其他流,以便我们将其统一收集到单独一个流内。

(6) 其他起源地,如Internet连接等(将在本书后面的部分讲述)。

除此以外,FilterInputStream也属于InputStream的一种类型,用它可为“破坏器”类提供一个基础类,以便将属性或者有用的接口同输入流连接到一起。这将在以后讨论。

表10.1 InputStream的类型

类功能构建器参数/如何使用

ByteArrayInputStream 允许内存中的一个缓冲区作为InputStream使用从中提取字节的缓冲区/作为一个数据源使用。通过将其同一个FilterInputStream 对象连接,可提供一个有用的接口

StringBufferInputStream将一个String转换成InputStream 一个String(字串)。基础的实施方案实际采用一个StringBuffer(字串缓冲)/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口FileInputStream 用于从文件读取信息代表文件名的一个String,或者一个File或FileDescriptor对象/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口

PipedInputString 产生为相关的PipedOutputStream写的数据。实现了“管道化”的概念PipedOutputStream/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口

SequenceInputStream 将两个或更多的InputStream对象转换成单个InputStream使用两个InputStream对象或者一个Enumeration,用于InputStream 对象的一个容器/作为一个数据源使用。通过将其同一个FilterInputStream对象连接,可提供一个有用的接口

FilterInputStream 对作为破坏器接口使用的类进行抽象;那个破坏器为其他InputStream类提供了有用的功能。参见表10.3 参见表10.3/参见表10.3

10.1.2 OutputStream的类型

这一类别包括的类决定了我们的输入往何处去:一个字节数组(但没有String;假定我们可用字节数组创建一个);一个文件;或者一个“管道”。

除此以外,FilterOutputStream为“破坏器”类提供了一个基础类,它将属性或者有用的接口同输出流连接起来。这将在以后讨论。

表10.2 OutputStream的类型

类功能构建器参数/如何使用

ByteArrayOutputStream 在内存中创建一个缓冲区。我们发送给流的所有数据都会置入这个缓冲区。可选缓冲区的初始大小/用于指出数据的目的地。若将其同FilterOutputStream对象连接到一起,可提供一个有用的接口

FileOutputStream 将信息发给一个文件用一个String代表文件名,或选用一个File或FileDescriptor对象/用于指出数据的目的地。若将其同FilterOutputStream对象连接到一起,可提供一个有用的接口

PipedOutputStream我们写给它的任何信息都会自动成为相关的PipedInputStream的输出。实现了“管道化”的概念PipedInputStream/为多线程处理指出自己数据的目的地/将其同FilterOutputStream对象连接到一起,便可提供一个有用的接口

FilterOutputStream 对作为破坏器接口使用的类进行抽象处理;那个破坏器为其他OutputStream类提供了有用的功能。参见表10.4 参见表10.4/参见表10.4

10.2 增添属性和有用的接口

利用层次化对象动态和透明地添加单个对象的能力的做法叫作“装饰器”(Decorator)方案——“方案”属于本书第16章的主题(注释①)。装饰器方案规定封装于初始化对象中的所有对象都拥有相同的接口,以便利用装饰器的“透明”性质——我们将相同的消息发给一个对象,无论它是否已被“装饰”。这正是在Java I/O库里存在“过滤器”(Filter)类的原因:抽象的“过滤器”类是所有装饰器的基础类(装饰器必须拥有与它装饰的那个对象相同的接口,但装饰器亦可对接口作出扩展,这种情况见诸于几个特殊的“过滤器”类中)。

子类处理要求大量子类对每种可能的组合提供支持时,便经常会用到装饰器——由于组合形式太多,造成子类处理变得不切实际。Java I/O库要求许多不同的特性组合方案,这正是装饰器方案显得特别有用的原因。但是,装饰器方案也有自己的一个缺点。在我们写一个程序的时候,装饰器为我们提供了大得多的灵活性(因为可以方便地混合与匹配属性),但它们也使自己的代码变得更加复杂。原因在于Java I/O库操作不便,我们必须创建许多类——“核心”I/O类型加上所有装饰器——才能得到自己希望的单个I/O对象。

FilterInputStream和FilterOutputStream(这两个名字不十分直观)提供了相应的装饰器接口,用于控制一个特定的输入流(InputStream)或者输出流(OutputStream)。它们分别是从InputStream和OutputStream衍生出来的。此外,它们都属于抽象类,在理论上为我们与一个流的不同通信手段都提供了一个通用的接口。事实上,FilterInputStream和FilterOutputStream只是简单地模仿了自己的基础类,它们是一个装饰器的基本要求。

10.2.1 通过FilterInputStream从InputStream里读入数据

FilterInputStream类要完成两件全然不同的事情。其中,DataInputStream允许我们读取不同的基本类型数据以及String对象(所有方法都以“read”开头,比如readByte(),readFloat()等等)。伴随对应的DataOutputStream,我们可通过数据“流”将基本类型的数据从一个地方搬到另一个地方。这些“地方”是由表10.1总结的那些类决定的。若读取块内的数据,并自己进行解析,就不需要用到DataInputStream。但在其他许多情况下,我们一般都想用它对自己读入的数据进行自动格式化。

剩下的类用于修改InputStream的内部行为方式:是否进行缓冲,是否跟踪自己读入的数据行,以及是否能够推回一个字符等等。后两种类看起来特别象提供对构建一个编译器的支持(换言之,添加它们为了支持Java编译器的构建),

所以在常规编程中一般都用不着它们。

也许几乎每次都要缓冲自己的输入,无论连接的是哪个IO设备。所以IO库最明智的做法就是将未缓冲输入作为一种特殊情况处理,同时将缓冲输入接纳为标准做法。

表10.3 FilterInputStream的类型

类功能构建器参数/如何使用

DataInputStream 与DataOutputStream联合使用,使自己能以机动方式读取一个流中的基本数据类型(int,char,long等等)InputStream/包含了一个完整的接口,以便读取基本数据类型

BufferedInputStream 避免每次想要更多数据时都进行物理性的读取,告诉它“请先在缓冲区里找”InputStream,没有可选的缓冲区大小/本身并不能提供一个接口,只是发出使用缓冲区的要求。要求同一个接口对象连接到一起LineNumberInputStream 跟踪输入流中的行号;可调用getLineNumber()以及setLineNumber(int) 只是添加对数据行编号的能力,所以可能需要同一个真正的接口对象连接

PushbackInputStream 有一个字节的后推缓冲区,以便后推读入的上一个字符InputStream/通常由编译器在扫描器中使用,因为Java编译器需要它。一般不在自己的代码中使用

10.2.2 通过FilterOutputStream向OutputStream里写入数据

与DataInputStream对应的是DataOutputStream,后者对各个基本数据类型以及String对象进行格式化,并将其置入一个数据“流”中,以便任何机器上的DataInputStream都能正常地读取它们。所有方法都以“wirte”开头,例如writeByte(),writeFloat()等等。

若想进行一些真正的格式化输出,比如输出到控制台,请使用PrintStream。利用它可以打印出所有基本数据类型以及String对象,并可采用一种易于查看的格式。这与DataOutputStream正好相反,后者的目标是将那些数据置入一个数据流中,以便DataInputStream能够方便地重新构造它们。System.out静态对象是一个PrintStream。

PrintStream内两个重要的方法是print()和println()。它们已进行了覆盖处理,可打印出所有数据类型。print()和println()之间的差异是后者在操作完毕后会自动添加一个新行。

BufferedOutputStream属于一种“修改器”,用于指示数据流使用缓冲技术,使自己不必每次都向流内物理性地写入数据。通常都应将它应用于文件处理和控制器IO。

表10.4 FilterOutputStream的类型

类功能构建器参数/如何使用

DataOutputStream 与DataInputStream配合使用,以便采用方便的形式将基本

数据类型(int,char,long等)写入一个数据流OutputStream/包含了完整接口,以便我们写入基本数据类型

PrintStream 用于产生格式化输出。DataOutputStream控制的是数据的“存储”,而PrintStream控制的是“显示”OutputStream,可选一个布尔参数,指示缓冲区是否与每个新行一同刷新/对于自己的OutputStream对象,应该用“final”将其封闭在内。可能经常都要用到它

BufferedOutputStream 用它避免每次发出数据的时候都要进行物理性的写入,要求它“请先在缓冲区里找”。可调用flush(),对缓冲区进行刷新OutputStream,可选缓冲区大小/本身并不能提供一个接口,只是发出使用缓冲区的要求。需要同一个接口对象连接到一起

10.3 本身的缺陷:RandomAccessFile

RandomAccessFile用于包含了已知长度记录的文件,以便我们能用seek()从一条记录移至另一条;然后读取或修改那些记录。各记录的长度并不一定相同;只要知道它们有多大以及置于文件何处即可。

首先,我们有点难以相信RandomAccessFile不属于InputStream或者OutputStream分层结构的一部分。除了恰巧实现了DataInput以及DataOutput(这两者亦由DataInputStream和DataOutputStream实现)接口之外,它们与那些分层结构并无什么关系。它甚至没有用到现有InputStream或OutputStream类的功能——采用的是一个完全不相干的类。该类属于全新的设计,含有自己的全部(大多数为固有)方法。之所以要这样做,是因为RandomAccessFile拥有与其他IO 类型完全不同的行为,因为我们可在一个文件里向前或向后移动。不管在哪种情况下,它都是独立运作的,作为Object的一个“直接继承人”使用。

从根本上说,RandomAccessFile类似DataInputStream和DataOutputStream的联合使用。其中,getFilePointer()用于了解当前在文件的什么地方,seek()用于移至文件内的一个新地点,而length()用于判断文件的最大长度。此外,构建器要求使用另一个自变量(与C的fopen()完全一样),指出自己只是随机读("r"),还是读写兼施("rw")。这里没有提供对“只写文件”的支持。也就是说,假如是从DataInputStream继承的,那么RandomAccessFile也有可能能很好地工作。

还有更难对付的。很容易想象我们有时要在其他类型的数据流中搜索,比如一个ByteArrayInputStream,但搜索方法只有RandomAccessFile才会提供。而后者只能针对文件才能操作,不能针对数据流操作。此时,BufferedInputStream确实允许我们标记一个位置(使用mark(),它的值容纳于单个内部变量中),并用reset()重设那个位置。但这些做法都存在限制,并不是特别有用。

10.4 File类

File类有一个欺骗性的名字——通常会认为它对付的是一个文件,但实情并非如此。它既代表一个特定文件的名字,也代表目录内一系列文件的名字。若代表一个文件集,便可用list()方法查询这个集,返回的是一个字串数组。之所以要返回一个数组,而非某个灵活的集合类,是因为元素的数量是固定的。而且若想得到一个不同的目录列表,只需创建一个不同的File对象即可。事实上,“FilePath”(文件路径)似乎是一个更好的名字。本节将向大家完整地例示如何使用这个类,其中包括相关的FilenameFilter(文件名过滤器)接口。

10.4.1 目录列表器

现在假设我们想观看一个目录列表。可用两种方式列出File对象。若在不含自变量(参数)的情况下调用list(),会获得File对象包含的一个完整列表。然而,若想对这个列表进行某些限制,就需要使用一个“目录过滤器”,该类的作用是指出应如何选择File对象来完成显示。

下面是用于这个例子的代码(或在执行该程序时遇到困难,请参考第3章3.1.2小节“赋值”):

449-450页程序

//: DirList.java

// Displays directory listing

package c10;

import java.io.*;

public class DirList {

public static void main(String[] args) {

try {

File path = new File(".");

String[] list;

if(args.length == 0)

list = path.list();

else

list = path.list(new DirFilter(args[0]));

for(int i = 0; i < list.length; i++)

System.out.println(list[i]);

} catch(Exception e) {

e.printStackTrace();

}

}

DirFilter类“实现”了interface FilenameFilter(关于接口的问题,已在第7章进行了详述)。下面让我们看看FilenameFilter接口有多么简单:public interface FilenameFilter {

boolean accept(文件目录, 字串名);

}

它指出这种类型的所有对象都提供了一个名为accept()的方法。之所以要创建这样的一个类,背后的全部原因就是把accept()方法提供给list()方法,使list()能够“回调”accept(),从而判断应将哪些文件名包括到列表中。因此,通常将这种技术称为“回调”,有时也称为“算子”(也就是说,DirFilter是一个算子,因为它唯一的作用就是容纳一个方法)。由于list()采用一个FilenameFilter对象作为自己的自变量使用,所以我们能传递实现了FilenameFilter的任何类的一个对象,用它决定(甚至在运行期)list()方法的行为方式。回调的目的是在代码的行为上提供更大的灵活性。

通过DirFilter,我们看出尽管一个“接口”只包含了一系列方法,但并不局限于只能写那些方法(但是,至少必须提供一个接口内所有方法的定义。在这种情况下,DirFilter构建器也会创建)。

accept()方法必须接纳一个File对象,用它指示用于寻找一个特定文件的目录;并接纳一个String,其中包含了要寻找之文件的名字。可决定使用或忽略这两个参数之一,但有时至少要使用文件名。记住list()方法准备为目录对象中的每个文件名调用accept(),核实哪个应包含在内——具体由accept()返回的“布尔”结果决定。

为确定我们操作的只是文件名,其中没有包含路径信息,必须采用String对象,并在它的外部创建一个File对象。然后调用getName(),它的作用是去除所有路径信息(采用与平台无关的方式)。随后,accept()用String类的indexOf()方法检查文件名内部是否存在搜索字串"afn"。若在字串内找到afn,那么返回值就是afn的起点索引;但假如没有找到,返回值就是-1。注意这只是一个简单的字串搜索例子,未使用常见的表达式“通配符”方案,比如"fo?.b?r*";这种方案更难实现。

list()方法返回的是一个数组。可查询这个数组的长度,然后在其中遍历,选定数组元素。与C和C++的类似行为相比,这种于方法内外方便游历数组的行为无疑是一个显著的进步。

1. 匿名内部类

下例用一个匿名内部类(已在第7章讲述)来重写显得非常理想。首先创建了一个filter()方法,它返回指向FilenameFilter的一个句柄:

451-452页程序

注意filter()的自变量必须是final。这一点是匿名内部类要求的,使其能使用来自本身作用域以外的一个对象。

之所以认为这样做更好,是由于FilenameFilter类现在同DirList2紧密地结合在一起。然而,我们可采取进一步的操作,将匿名内部类定义成list()的一个参数,使其显得更加精简。如下所示:

452页下程序

main()现在的自变量是final,因为匿名内部类直接使用args[0]。

这展示了如何利用匿名内部类快速创建精简的类,以便解决一些复杂的问题。由于Java中的所有东西都与类有关,所以它无疑是一种相当有用的编码技术。它的一个好处是将特定的问题隔离在一个地方统一解决。但在另一方面,这样生成的代码不是十分容易阅读,所以使用时必须慎重。

2. 顺序目录列表

经常都需要文件名以排好序的方式提供。由于Java 1.0和Java 1.1都没有提供对排序的支持(从Java 1.2开始提供),所以必须用第8章创建的SortVector 将这一能力直接加入自己的程序。就象下面这样:

453-454页程序

这里进行了另外少许改进。不再是将path(路径)和list(列表)创建为main()的本地变量,它们变成了类的成员,使它们的值能在对象“生存”期间方便地访问。事实上,main()现在只是对类进行测试的一种方式。大家可以看到,一旦列表创建完毕,类的构建器就会自动开始对列表进行排序。

这种排序不要求区分大小写,所以最终不会得到一组全部单词都以大写字母开头的列表,跟着是全部以小写字母开头的列表。然而,我们注意到在以相同字母开头的一组文件名中,大写字母是排在前面的——这对标准的排序来说仍是一种不合格的行为。Java 1.2已成功解决了这个问题。

10.4.2 检查与创建目录

File类并不仅仅是对现有目录路径、文件或者文件组的一个表示。亦可用一个File对象新建一个目录,甚至创建一个完整的目录路径——假如它尚不存在的话。亦可用它了解文件的属性(长度、上一次修改日期、读/写属性等),检查一个File对象到底代表一个文件还是一个目录,以及删除一个文件等等。下列程序完整展示了如何运用File类剩下的这些方法:

454-456页程序

在fileData()中,可看到应用了各种文件调查方法来显示与文件或目录路径有关的信息。

main()应用的第一个方法是renameTo(),利用它可以重命名(或移动)一个文件至一个全新的路径(该路径由参数决定),它属于另一个File对象。这也适用于任何长度的目录。

若试验上述程序,就可发现自己能制作任意复杂程度的一个目录路径,因为mkdirs()会帮我们完成所有工作。在Java 1.0中,-d标志报告目录虽然已被删除,但它依然存在;但在Java 1.1中,目录会被实际删除。

10.5 IO流的典型应用

尽管库内存在大量IO流类,可通过多种不同的方式组合到一起,但实际上只有几种方式才会经常用到。然而,必须小心在意才能得到正确的组合。下面这个相当长的例子展示了典型IO配置的创建与使用,可在写自己的代码时将其作为一个参考使用。注意每个配置都以一个注释形式的编号起头,并提供了适当的解释信息。

457-459页程序

10.5.1 输入流

当然,我们经常想做的一件事情是将格式化的输出打印到控制台,但那已在第5章创建的com.bruceeckel.tools中得到了简化。

第1到第4部分演示了输入流的创建与使用(尽管第4部分展示了将输出流作为一个测试工具的简单应用)。

1. 缓冲的输入文件

为打开一个文件以便输入,需要使用一个FileInputStream,同时将一个String 或File对象作为文件名使用。为提高速度,最好先对文件进行缓冲处理,从而获得用于一个BufferedInputStream的构建器的结果句柄。为了以格式化的形式读取输入数据,我们将那个结果句柄赋给用于一个DataInputStream的构建器。DataInputStream是我们的最终(final)对象,并是我们进行读取操作的接口。

在这个例子中,只用到了readLine()方法,但理所当然任何DataInputStream 方法都可以采用。一旦抵达文件末尾,readLine()就会返回一个null(空),以便中止并退出while循环。

“String s2”用于聚集完整的文件内容(包括必须添加的新行,因为readLine()去除了那些行)。随后,在本程序的后面部分中使用s2。最后,我们调用close(),用它关闭文件。从技术上说,会在运行finalize()时调用close()。而且我们希望一旦程序退出,就发生这种情况(无论是否进行垃圾收集)。然而,Java 1.0有一个非常突出的错误(Bug),造成这种情况不会发生。在Java 1.1中,必须明确调用System.runFinalizersOnExit(true),用它保证会为系统中的每个对象调用finalize()。然而,最安全的方法还是为文件明确调用close()。

2. 从内存输入

这一部分采用已经包含了完整文件内容的String s2,并用它创建一个StringBufferInputStream(字串缓冲输入流)——作为构建器的参数,要求使用一个String,而非一个StringBuffer)。随后,我们用read()依次读取每个字符,并将其发送至控制台。注意read()将下一个字节返回为int,所以必须将其造型为一个char,以便正确地打印。

3. 格式化内存输入

StringBufferInputStream的接口是有限的,所以通常需要将其封装到一个DataInputStream内,从而增强它的能力。然而,若选择用readByte()每次读出一个字符,那么所有值都是有效的,所以不可再用返回值来侦测何时结束输入。相反,可用available()方法判断有多少字符可用。下面这个例子展示了如何从文件中一次读出一个字符:

461页程序

注意取决于当前从什么媒体读入,avaiable()的工作方式也是有所区别的。它在字面上意味着“可以不受阻塞读取的字节数量”。对一个文件来说,它意味着整个文件。但对一个不同种类的数据流来说,它却可能有不同的含义。因此在使用时应考虑周全。

为了在这样的情况下侦测输入的结束,也可以通过捕获一个违例来实现。然而,若真的用违例来控制数据流,却显得有些大材小用。

4. 行的编号与文件输出

这个例子展示了如何LineNumberInputStream来跟踪输入行的编号。在这里,不可简单地将所有构建器都组合起来,因为必须保持LineNumberInputStream的一个句柄(注意这并非一种继承环境,所以不能简单地将in4造型到一个

LineNumberInputStream)。因此,li容纳了指向LineNumberInputStream的句柄,然后在它的基础上创建一个DataInputStream,以便读入数据。

这个例子也展示了如何将格式化数据写入一个文件。首先创建了一个FileOutputStream,用它同一个文件连接。考虑到效率方面的原因,它生成了一个BufferedOutputStream。这几乎肯定是我们一般的做法,但却必须明确地这样做。随后为了进行格式化,它转换成一个PrintStream。用这种方式创建的数据文件可作为一个原始的文本文件读取。

标志DataInputStream何时结束的一个方法是readLine()。一旦没有更多的字串可以读取,它就会返回null。每个行都会伴随自己的行号打印到文件里。该行号可通过li查询。

可看到用于out1的、一个明确指定的close()。若程序准备掉转头来,并再次读取相同的文件,这种做法就显得相当有用。然而,该程序直到结束也没有检查文件IODemo.txt。正如以前指出的那样,如果不为自己的所有输出文件调用close(),就可能发现缓冲区不会得到刷新,造成它们不完整。。

10.5.2 输出流

两类主要的输出流是按它们写入数据的方式划分的:一种按人的习惯写入,另一种为了以后由一个DataInputStream而写入。RandomAccessFile是独立的,尽管它的数据格式兼容于DataInputStream和DataOutputStream。

5. 保存与恢复数据

PrintStream能格式化数据,使其能按我们的习惯阅读。但为了输出数据,以便由另一个数据流恢复,则需用一个DataOutputStream写入数据,并用一个DataInputStream恢复(获取)数据。当然,这些数据流可以是任何东西,但这里采用的是一个文件,并进行了缓冲处理,以加快读写速度。

注意字串是用writeBytes()写入的,而非writeChars()。若使用后者,写入的就是16位Unicode字符。由于DataInputStream中没有补充的“readChars”方法,所以不得不用readChar()每次取出一个字符。所以对ASCII来说,更方便的做法是将字符作为字节写入,在后面跟随一个新行;然后再用readLine()将字符当作普通的ASCII行读回。

writeDouble()将double数字保存到数据流中,并用补充的readDouble()恢复它。但为了保证任何读方法能够正常工作,必须知道数据项在流中的准确位置,因为既有可能将保存的double数据作为一个简单的字节序列读入,也有可能作为char或其他格式读入。所以必须要么为文件中的数据采用固定的格式,要么将额外的信息保存到文件中,以便正确判断数据的存放位置。

6. 读写随机访问文件

正如早先指出的那样,RandomAccessFile与IO层次结构的剩余部分几乎是完全隔离的,尽管它也实现了DataInput和DataOutput接口。所以不可将其与InputStream及OutputStream子类的任何部分关联起来。尽管也许能将一个ByteArrayInputStream当作一个随机访问元素对待,但只能用RandomAccessFile 打开一个文件。必须假定RandomAccessFile已得到了正确的缓冲,因为我们不能自行选择。

可以自行选择的是第二个构建器参数:可决定以“只读”(r)方式或“读写”

(rw)方式打开一个RandomAccessFile文件。

使用RandomAccessFile的时候,类似于组合使用DataInputStream和DataOutputStream(因为它实现了等同的接口)。除此以外,还可看到程序中使用了seek(),以便在文件中到处移动,对某个值作出修改。

10.5.3 快捷文件处理

由于以前采用的一些典型形式都涉及到文件处理,所以大家也许会怀疑为什么要进行那么多的代码输入——这正是装饰器方案一个缺点。本部分将向大家展示如何创建和使用典型文件读取和写入配置的快捷版本。这些快捷版本均置入packagecom.bruceeckel.tools中(自第5章开始创建)。为了将每个类都添加到库内,只需将其置入适当的目录,并添加对应的package语句即可。

7. 快速文件输入

若想创建一个对象,用它从一个缓冲的DataInputStream中读取一个文件,可将这个过程封装到一个名为InFile的类内。如下所示:

463-464页程序

无论构建器的String版本还是File版本都包括在内,用于共同创建一个FileInputStream。

就象这个例子展示的那样,现在可以有效减少创建文件时由于重复强调造成的问题。

8. 快速输出格式化文件

亦可用同类型的方法创建一个PrintStream,令其写入一个缓冲文件。下面是对com.bruceeckel.tools的扩展:

464-465页程序

注意构建器不可能捕获一个由基础类构建器“掷”出的违例。

9. 快速输出数据文件

最后,利用类似的快捷方式可创建一个缓冲输出文件,用它保存数据(与由人观看的数据格式相反):

465页程序

非常奇怪的是(也非常不幸),Java库的设计者居然没想到将这些便利措施直接作为他们的一部分标准提供。

10.5.4 从标准输入中读取数据

以Unix首先倡导的“标准输入”、“标准输出”以及“标准错误输出”概念为基础,Java提供了相应的System.in,System.out以及System.err。贯这一整本书,大家都会接触到如何用System.out进行标准输出,它已预封装成一个

PrintStream对象。System.err同样是一个PrintStream,但System.in是一个原始的InputStream,未进行任何封装处理。这意味着尽管能直接使用System.out和System.err,但必须事先封装System.in,否则不能从中读取数据。

典型情况下,我们希望用readLine()每次读取一行输入信息,所以需要将System.in封装到一个DataInputStream中。这是Java 1.0进行行输入时采取的“老”办法。在本章稍后,大家还会看到Java 1.1的解决方案。下面是个简单的例子,作用是回应我们键入的每一行内容:

466页程序

之所以要使用try块,是由于readLine()可能“掷”出一个IOException。注意同其他大多数流一样,也应对System.in进行缓冲。

由于在每个程序中都要将System.in封装到一个DataInputStream内,所以显得有点不方便。但采用这种设计方案,可以获得最大的灵活性。

10.5.5 管道数据流

本章已简要介绍了PipedInputStream(管道输入流)和PipedOutputStream(管道输出流)。尽管描述不十分详细,但并不是说它们作用不大。然而,只有在掌握了多线程处理的概念后,才可真正体会它们的价值所在。原因很简单,因为管道化的数据流就是用于线程之间的通信。这方面的问题将在第14章用一个示例说明。

10.6 StreamTokenizer

尽管StreamTokenizer并不是从InputStream或OutputStream衍生的,但它只随同InputStream工作,所以十分恰当地包括在库的IO部分中。

StreamTokenizer类用于将任何InputStream分割为一系列“记号”(Token)。这些记号实际是一些断续的文本块,中间用我们选择的任何东西分隔。例如,我们的记号可以是单词,中间用空白(空格)以及标点符号分隔。

下面是一个简单的程序,用于计算各个单词在文本文件中重复出现的次数:

467-469页程序

最好将结果按排序格式输出,但由于Java 1.0和Java 1.1都没有提供任何排序方法,所以必须由自己动手。这个目标可用一个StrSortVector方便地达成(创建于第8章,属于那一章创建的软件包的一部分。记住本书所有子目录的起始目录都必须位于类路径中,否则程序将不能正确地编译)。

为打开文件,使用了一个FileInputStream。而且为了将文件转换成单词,从FileInputStream中创建了一个StreamTokenizer。在StreamTokenizer中,存在一个默认的分隔符列表,我们可用一系列方法加入更多的分隔符。在这里,我们用ordinaryChar()指出“该字符没有特别重要的意义”,所以解析器不会把它当作自己创建的任何单词的一部分。例如,st.ordinaryChar('.')表示小数点不会成为解析出来的单词的一部分。在与Java配套提供的联机文档中,可以找到更多的相关信息。

在countWords()中,每次从数据流中取出一个记号,而ttype信息的作用是判

断对每个记号采取什么操作——因为记号可能代表一个行尾、一个数字、一个字串或者一个字符。

找到一个记号后,会查询Hashtable counts,核实其中是否已经以“键”(Key)的形式包含了一个记号。若答案是肯定的,对应的Counter(计数器)对象就会增值,指出已找到该单词的另一个实例。若答案为否,则新建一个Counter——因为Counter构建器会将它的值初始化为1,正是我们计算单词数量时的要求。

SortedWordCount并不属于Hashtable(散列表)的一种类型,所以它不会继承。它执行的一种特定类型的操作,所以尽管keys()和values()方法都必须重新揭示出来,但仍不表示应使用那个继承,因为大量Hashtable方法在这里都是不适当的。除此以外,对于另一些方法来说(比如getCounter()——用于获得一个特定字串的计数器;又如sortedKeys()——用于产生一个枚举),它们最终都改变了SortedWordCount接口的形式。

在main()内,我们用SortedWordCount打开和计算文件中的单词数量——总共只用了两行代码。随后,我们为一个排好序的键(单词)列表提取出一个枚举。并用它获得每个键以及相关的Count(计数)。注意必须调用cleanup(),否则文件不能正常关闭。

采用了StreamTokenizer的第二个例子将在第17章提供。

10.6.1 StringTokenizer

尽管并不必要IO库的一部分,但StringTokenizer提供了与StreamTokenizer 极相似的功能,所以在这里一并讲述。

StringTokenizer的作用是每次返回字串内的一个记号。这些记号是一些由制表站、空格以及新行分隔的连续字符。因此,字串“Where is my cat?”的记号分别是“Where”、“is”、“my”和“cat?”。与StreamTokenizer类似,我们可以指示StringTokenizer按照我们的愿望分割输入。但对于StringTokenizer,却需要向构建器传递另一个参数,即我们想使用的分隔字串。通常,如果想进行更复杂的操作,应使用StreamTokenizer。

可用nextToken()向StringTokenizer对象请求字串内的下一个记号。该方法要么返回一个记号,要么返回一个空字串(表示没有记号剩下)。

作为一个例子,下述程序将执行一个有限的句法分析,查询键短语序列,了解句子暗示的是快乐亦或悲伤的含义。

471-472页程序

对于准备分析的每个字串,我们进入一个while循环,并将记号从那个字串中取出。请注意第一个if语句,假如记号既不是“I”,也不是“Are”,就会执行continue(返回循环起点,再一次开始)。这意味着除非发现一个“I”或者“Are”,才会真正得到记号。大家可能想用==代替equals()方法,但那样做会出现不正常的表现,因为==比较的是句柄值,而equals()比较的是内容。

analyze()方法剩余部分的逻辑是搜索“I am sad”(我很忧伤、“I am nothappy”(我不快乐)或者“Are you sad?”(你悲伤吗?)这样的句法格式。若没有break 语句,这方面的代码甚至可能更加散乱。大家应注意对一个典型的解析器来说,通常都有这些记号的一个表格,并能在读取新记号的时候用一小段代码在表格内移动。

无论如何,只应将StringTokenizer看作StreamTokenizer一种简单而且特殊的简化形式。然而,如果有一个字串需要进行记号处理,而且StringTokenizer的功能实在有限,那么应该做的全部事情就是用StringBufferInputStream将其转换到一个数据流里,再用它创建一个功能更强大的StreamTokenizer。

10.7 Java 1.1的IO流

到这个时候,大家或许会陷入一种困境之中,怀疑是否存在IO流的另一种设计方案,并可能要求更大的代码量。还有人能提出一种更古怪的设计吗?事实上,Java 1.1对IO流库进行了一些重大的改进。看到Reader和Writer类时,大多数人的第一个印象(就象我一样)就是它们用来替换原来的InputStream和OutputStream类。但实情并非如此。尽管不建议使用原始数据流库的某些功能(如使用它们,会从编译器收到一条警告消息),但原来的数据流依然得到了保留,以便维持向后兼容,而且:

(1) 在老式层次结构里加入了新类,所以Sun公司明显不会放弃老式数据流。

(2) 在许多情况下,我们需要与新结构中的类联合使用老结构中的类。为达到这个目的,需要使用一些“桥”类:InputStreamReader将一个InputStream转换成Reader,OutputStreamWriter将一个OutputStream转换成Writer。

所以与原来的IO流库相比,经常都要对新IO流进行层次更多的封装。同样地,这也属于装饰器方案的一个缺点——需要为额外的灵活性付出代价。

之所以在Java 1.1里添加了Reader和Writer层次,最重要的原因便是国际化的需求。老式IO流层次结构只支持8位字节流,不能很好地控制16位Unicode 字符。由于Unicode主要面向的是国际化支持(Java内含的char是16位的Unicode),所以添加了Reader和Writer层次,以提供对所有IO操作中的Unicode 的支持。除此之外,新库也对速度进行了优化,可比旧库更快地运行。

与本书其他地方一样,我会试着提供对类的一个概述,但假定你会利用联机文档搞定所有的细节,比如方法的详尽列表等。

10.7.1 数据的发起与接收

Java 1.0的几乎所有IO流类都有对应的Java 1.1类,用于提供内建的Unicode 管理。似乎最容易的事情就是“全部使用新类,再也不要用旧的”,但实际情况并没有这么简单。有些时候,由于受到库设计的一些限制,我们不得不使用Java 1.0的IO流类。特别要指出的是,在旧流库的基础上新加了java.util.zip库,它们依赖旧的流组件。所以最明智的做法是“尝试性”地使用Reader和Writer类。若代码不能通过编译,便知道必须换回老式库。

下面这张表格分旧库与新库分别总结了信息发起与接收之间的对应关系。

发起&接收:Java 1.0类对应的Java 1.1类

474页表中内容略

我们发现即使不完全一致,但旧库组件中的接口与新接口通常也是类似的。

10.7.2 修改数据流的行为

在Java 1.0中,数据流通过FilterInputStream和FilterOutputStream的“装饰

器”(Decorator)子类适应特定的需求。Java 1.1的IO流沿用了这一思想,但没有继续采用所有装饰器都从相同“filter”(过滤器)基础类中衍生这一做法。若通过观察类的层次结构来理解它,这可能令人出现少许的困惑。

在下面这张表格中,对应关系比上一张表要粗糙一些。之所以会出现这个差别,是由类的组织造成的:尽管BufferedOutputStream是FilterOutputStream的一个子类,但是BufferedWriter并不是FilterWriter的子类(对后者来说,尽管它是一个抽象类,但没有自己的子类或者近似子类的东西,也没有一个“占位符”可用,所以不必费心地寻找)。然而,两个类的接口是非常相似的,而且不管在什么情况下,显然应该尽可能地使用新版本,而不应考虑旧版本(也就是说,除非在一些类中必须生成一个Stream,不可生成Reader或者Writer)。

过滤器:Java 1.0类对应的Java 1.1类

FilterInputStream FilterReader

FilterOutputStream FilterWriter(没有子类的抽象类)

BufferedInputStream BufferedReader(也有readLine())

BufferedOutputStream BufferedWriter

DataInputStream 使用DataInputStream(除非要使用readLine(),那时需要使用一个BufferedReader)

PrintStream PrintWriter

LineNumberInputStream LineNumberReader

StreamTokenizer StreamTokenizer(用构建器取代Reader)

PushBackInputStream PushBackReader

有一条规律是显然的:若想使用readLine(),就不要再用一个DataInputStream 来实现(否则会在编译期得到一条出错消息),而应使用一个BufferedReader。但除这种情况以外,DataInputStream仍是Java 1.1 IO库的“首选”成员。

为了将向PrintWriter的过渡变得更加自然,它提供了能采用任何OutputStream对象的构建器。PrintWriter提供的格式化支持没有PrintStream那么多;但接口几乎是相同的。

10.7.3 未改变的类

显然,Java库的设计人员觉得以前的一些类毫无问题,所以没有对它们作任何修改,可象以前那样继续使用它们:

没有对应Java 1.1类的Java 1.0类

DataOutputStream

File

RandomAccessFile

SequenceInputStream

特别未加改动的是DataOutputStream,所以为了用一种可转移的格式保存和获取数据,必须沿用InputStream和OutputStream层次结构。

10.7.4 一个例子

为体验新类的效果,下面让我们看看如何修改IOStreamDemo.java示例的相应区域,以便使用Reader和Writer类:

476-478页程序

大家一般看见的是转换过程非常直观,代码看起来也颇相似。但这些都不是重要的区别。最重要的是,由于随机访问文件已经改变,所以第6节未再重复。

第1节收缩了一点儿,因为假如要做的全部事情就是读取行输入,那么只需要将一个FileReader封装到BufferedReader之内即可。第1b节展示了封装System.in,以便读取控制台输入的新方法。这里的代码量增多了一些,因为System.in是一个DataInputStream,而且BufferedReader需要一个Reader参数,所以要用InputStreamReader来进行转换。

在2节,可以看到如果有一个字串,而且想从中读取数据,只需用一个StringReader替换StringBufferInputStream,剩下的代码是完全相同的。

第3节揭示了新IO流库设计中的一个错误。如果有一个字串,而且想从中读取数据,那么不能再以任何形式使用StringBufferInputStream。若编译一个涉及StringBufferInputStream的代码,会得到一条“反对”消息,告诉我们不要用它。此时最好换用一个StringReader。但是,假如要象第3节这样进行格式化的内存输入,就必须使用DataInputStream——没有什么“DataReader”可以代替它——而DataInputStream很不幸地要求用到一个InputStream参数。所以我们没有选择的余地,只好使用编译器不赞成的StringBufferInputStream类。编译器同样会发出反对信息,但我们对此束手无策(注释②)。

StringReader替换StringBufferInputStream,剩下的代码是完全相同的。

②:到你现在正式使用的时候,这个错误可能已经修正。

第4节明显是从老式数据流到新数据流的一个直接转换,没有需要特别指出的。在第5节中,我们被强迫使用所有的老式数据流,因为DataOutputStream和DataInputStream要求用到它们,而且没有可供替换的东西。然而,编译期间不会产生任何“反对”信息。若不赞成一种数据流,通常是由于它的构建器产生了一条反对消息,禁止我们使用整个类。但在DataInputStream的情况下,只有readLine()是不赞成使用的,因为我们最好为readLine()使用一个BufferedReader(但为其他所有格式化输入都使用一个DataInputStream)。

若比较第5节和IOStreamDemo.java中的那一小节,会注意到在这个版本中,数据是在文本之前写入的。那是由于Java 1.1本身存在一个错误,如下述代码所示:

479-480页程序

看起来,我们在对一个writeBytes()的调用之后写入的任何东西都不是能够恢复的。这是一个十分有限的错误,希望在你读到本书的时候已获得改正。为检测是否改正,请运行上述程序。若没有得到一个违例,而且值都能正确打印出来,

就表明已经改正。

10.7.5 重导向标准IO

Java 1.1在System类中添加了特殊的方法,允许我们重新定向标准输入、输出以及错误IO流。此时要用到下述简单的静态方法调用:

setIn(InputStream)

setOut(PrintStream)

setErr(PrintStream)

如果突然要在屏幕上生成大量输出,而且滚动的速度快于人们的阅读速度,输出的重定向就显得特别有用。在一个命令行程序中,如果想重复测试一个特定的用户输入序列,输入的重定向也显得特别有价值。下面这个简单的例子展示了这些方法的使用:

481页程序

这个程序的作用是将标准输入同一个文件连接起来,并将标准输出和错误重定向至另一个文件。

这是不可避免会遇到“反对”消息的另一个例子。用-deprecation标志编译时得到的消息如下:

Note:The constructor java.io.PrintStream(java.io.OutputStream) has been deprecated.

注意:不推荐使用构建器java.io.PrintStream(java.io.OutputStream)。

然而,无论System.setOut()还是System.setErr()都要求用一个PrintStream作为参数使用,所以必须调用PrintStream构建器。所以大家可能会觉得奇怪,既然Java 1.1通过反对构建器而反对了整个PrintStream,为什么库的设计人员在添加这个反对的同时,依然为System添加了新方法,且指明要求用PrintStream,而不是用PrintWriter呢?毕竟,后者是一个崭新和首选的替换措施呀?这真令人费解。

10.8 压缩

Java 1.1也添加一个类,用以支持对压缩格式的数据流的读写。它们封装到现成的IO类中,以提供压缩功能。

此时Java 1.1的一个问题显得非常突出:它们不是从新的Reader和Writer 类衍生出来的,而是属于InputStream和OutputStream层次结构的一部分。所以有时不得不混合使用两种类型的数据流(注意可用InputStreamReader和OutputStreamWriter在不同的类型间方便地进行转换)。

Java 1.1压缩类功能

CheckedInputStream GetCheckSum()为任何InputStream产生校验和(不仅是解压)

CheckedOutputStream GetCheckSum()为任何OutputStream产生校验和(不仅

是解压)

DeflaterOutputStream 用于压缩类的基础类

ZipOutputStream 一个DeflaterOutputStream,将数据压缩成Zip文件格式

GZIPOutputStream 一个DeflaterOutputStream,将数据压缩成GZIP文件格式InflaterInputStream 用于解压类的基础类

ZipInputStream 一个DeflaterInputStream,解压用Zip文件格式保存的数据GZIPInputStream 一个DeflaterInputStream,解压用GZIP文件格式保存的数据

尽管存在许多种压缩算法,但是Zip和GZIP可能最常用的。所以能够很方便地用多种现成的工具来读写这些格式的压缩数据。

10.8.1 用GZIP进行简单压缩

GZIP接口非常简单,所以如果只有单个数据流需要压缩(而不是一系列不同的数据),那么它就可能是最适当选择。下面是对单个文件进行压缩的例子:483-484页程序

压缩类的用法非常直观——只需将输出流封装到一个GZIPOutputStream或者ZipOutputStream内,并将输入流封装到GZIPInputStream或者ZipInputStream 内即可。剩余的全部操作就是标准的IO读写。然而,这是一个很典型的例子,我们不得不混合使用新旧IO流:数据的输入使用Reader类,而GZIPOutputStream 的构建器只能接收一个OutputStream对象,不能接收Writer对象。

10.8.2 用Zip进行多文件保存

提供了Zip支持的Java 1.1库显得更加全面。利用它可以方便地保存多个文件。甚至有一个独立的类来简化对Zip文件的读操作。这个库采采用的是标准Zip格式,所以能与当前因特网上使用的大量压缩、解压工具很好地协作。下面这个例子采取了与前例相同的形式,但能根据我们需要控制任意数量的命令行参数。除此之外,它展示了如何用Checksum类来计算和校验文件的“校验和”(Checksum)。可选用两种类型的Checksum:Adler32(速度要快一些)和CRC32(慢一些,但更准确)。

484-486页程序

对于要加入压缩档的每一个文件,都必须调用putNextEntry(),并将其传递给一个ZipEntry对象。ZipEntry对象包含了一个功能全面的接口,利用它可以获取和设置Zip文件内那个特定的Entry(入口)上能够接受的所有数据:名字、压缩后和压缩前的长度、日期、CRC校验和、额外字段的数据、注释、压缩方法以及它是否一个目录入口等等。然而,虽然Zip格式提供了设置密码的方法,但Java的Zip库没有提供这方面的支持。而且尽管CheckedInputStream和CheckedOutputStream同时提供了对Adler32和CRC32校验和的支持,但是ZipEntry只支持CRC的接口。这虽然属于基层Zip格式的限制,但却限制了我们使用速度更快的Adler32。

为解压文件,ZipInputStream提供了一个getNextEntry()方法,能在有的前提下返回下一个ZipEntry。作为一个更简洁的方法,可以用ZipFile对象读取文件。该对象有一个entries()方法,可以为ZipEntry返回一个Enumeration(枚举)。

为读取校验和,必须多少拥有对关联的Checksum对象的访问权限。在这里保留了指向CheckedOutputStream和CheckedInputStream对象的一个句柄。但是,也可以只占有指向Checksum对象的一个句柄。

Zip流中一个令人困惑的方法是setComment()。正如前面展示的那样,我们可在写一个文件时设置注释内容,但却没有办法取出ZipInputStream内的注释。看起来,似乎只能通过ZipEntry逐个入口地提供对注释的完全支持。

当然,使用GZIP或Zip库时并不仅仅限于文件——可以压缩任何东西,包括要通过网络连接发送的数据。

10.8.3 Java归档(jar)实用程序

Zip格式亦在Java 1.1的JAR(Java ARchive)文件格式中得到了采用。这种文件格式的作用是将一系列文件合并到单个压缩文件里,就象Zip那样。然而,同Java中其他任何东西一样,JAR文件是跨平台的,所以不必关心涉及具体平台的问题。除了可以包括声音和图像文件以外,也可以在其中包括类文件。

涉及因特网应用时,JAR文件显得特别有用。在JAR文件之前,Web浏览器必须重复多次请求Web服务器,以便下载完构成一个“程序片”(Applet)的所有文件。除此以外,每个文件都是未经压缩的。但在将所有这些文件合并到一个JAR文件里以后,只需向远程服务器发出一次请求即可。同时,由于采用了压缩技术,所以可在更短的时间里获得全部数据。另外,JAR文件里的每个入口(条目)都可以加上数字化签名(详情参考Java用户文档)。

一个JAR文件由一系列采用Zip压缩格式的文件构成,同时还有一张“详情单”,对所有这些文件进行了描述(可创建自己的详情单文件;否则,jar程序会为我们代劳)。在联机用户文档中,可以找到与JAR详情单更多的资料(详情单的英语是“Manifest”)。

jar实用程序已与Sun的JDK配套提供,可以按我们的选择自动压缩文件。请在命令行调用它:

jar [选项] 说明[详情单] 输入文件

其中,“选项”用一系列字母表示(不必输入连字号或其他任何指示符)。如下所示:

487页表

c 创建新的或空的压缩档

t 列出目录表

x 解压所有文件

x file 解压指定文件

f 指出“我准备向你提供文件名”。若省略此参数,jar会假定它的输入来自标准输入;或者在它创建文件时,输出会进入标准输出内

m 指出第一个参数将是用户自建的详情表文件的名字

v 产生详细输出,对jar做的工作进行巨细无遗的描述

O 只保存文件;不压缩文件(用于创建一个JAR文件,以便我们将其置入自己的类路径中)

M 不自动生成详情表文件

在准备进入JAR文件的文件中,若包括了一个子目录,那个子目录会自动添加,其中包括它自己的所有子目录,以此类推。路径信息也会得到保留。

下面是调用jar的一些典型方法:

jar cf myJarFile.jar *.class

用于创建一个名为myJarFile.jar的JAR文件,其中包含了当前目录中的所有类文件,同时还有自动产生的详情表文件。

jar cmf myJarFile.jar myManifestFile.mf *.class

与前例类似,但添加了一个名为myManifestFile.mf的用户自建详情表文件。

jar tf myJarFile.jar

生成myJarFile.jar内所有文件的一个目录表。

jar tvf myJarFile.jar

添加“verbose”(详尽)标志,提供与myJarFile.jar中的文件有关的、更详细的资料。

jar cvf myApp.jar audio classes image

假定audio,classes和image是子目录,这样便将所有子目录合并到文件myApp.jar中。其中也包括了“verbose”标志,可在jar程序工作时反馈更详尽的信息。

如果用O选项创建了一个JAR文件,那个文件就可置入自己的类路径(CLASSPATH)中:

CLASSPATH="lib1.jar;lib2.jar;"

Java能在lib1.jar和lib2.jar中搜索目标类文件。

jar工具的功能没有zip工具那么丰富。例如,不能够添加或更新一个现成JAR 文件中的文件,只能从头开始新建一个JAR文件。此外,不能将文件移入一个JAR文件,并在移动后将它们删除。然而,在一种平台上创建的JAR文件可在其他任何平台上由jar工具毫无阻碍地读出(这个问题有时会困扰zip工具)。

正如大家在第13章会看到的那样,我们也用JAR为Java Beans打包。

10.9 对象序列化

Java 1.1增添了一种有趣的特性,名为“对象序列化”(Object Serialization)。它面向那些实现了Serializable接口的对象,可将它们转换成一系列字节,并可在以后完全恢复回原来的样子。这一过程亦可通过网络进行。这意味着序列化机制能自动补偿操作系统间的差异。换句话说,可以先在Windows机器上创建一

管理信息系统第10章在线测试

《管理信息系统》第10章在线测试 《管理信息系统》第10章在线测试剩余时间:59:00 答题须知:1、本卷满分20分。 2、答完题后,请一定要单击下面的“交卷”按钮交卷,否则无法记录本试卷的成绩。 3、在交卷之前,不要刷新本网页,否则你的答题结果将会被清空。 第一题、单项选择题(每题1分,5道题共5分) 1、决策支持系统(DSS)涉及计算机、管理决策、数学、人工智能等多学科的理论、方法和技术,对使用者而言,以下最好的说法是()。 A、计算机知识最重要 B、数学知识最重要 C、管理决策知识最重要 D、很难说哪种知识最重要 2、DSS是基于两种基本形式的结构分解和组合而演变起来的,这两种基本形式是()。 A、数据库与模型库 B、两库结构与基于知识的结构 C、人机对话子系统和三库结构 D、模型库和方法库 3、DSS需要良好的人机对话子系统,最要是为了()。 A、使计算机更接近人 B、方便决策人员的使用 C、使人更接近计算机 D、便于维护人员维护 4、与管理信息系统等其他信息系统相比,以下DSS的定义中,()是DSS最显著的特色。 A、DSS是一种以计算机为工具的信息系统 B、DSS应用决策科学及有关学科的理论与方法 C、DSS以人机对话方式辅助决策者 D、DSS是解决半结构化和非结构化问题的信息系统 5、以下与决策支持系统产生和发展最无关的是()。 A、信息技术的发展 B、管理决策理论的发展 C、企业环境的变化 D、白领工人的增加 第二题、多项选择题(每题2分,5道题共10分) 1、决策支持系统(DSS)可由以下基本部件组成:()。 A、用户 B、数据库子系统 C、方法库子系统

管理信息系统第五章习题与答案

第五章管理信息系统的战略规划和开发方法 一、选择题 1.以下各点中()不属于“业务流程”的基本要素。 A 、效率 B、输入资源 C、活动 D、价值 2.以下各点中,()不是UC矩阵的作用之一。 A、进行数据的完整性和匹配性检验 B、划分子系统 C、生成数据流程图 D、在网络中进行数据资源的分布 3.以下各点中,()不是诺兰阶段模型中提出的信息系统发展的阶段之一。 A、初装 B、蔓延 C、成长 D、成熟 4.U/C矩阵是用来进行( )的方法。 A、系统开发 B、系统分析 C、子系统划分 D、系统规划 5.结构化系统开发方法在开发策略上强调( ) A、自上而下 B、自下而上 C、系统调查 D、系统设计 6.原型法开发系统的主要优点是()。 A.系统重用性好 B.项目易管理和控制 C.系统开发费用低 D.用户要求可较好满足 7.关于企业关键成功要素的描述,正确的是()。 A.所谓关键要素是指关系到信息系统成功的重要因素 B.在一个企业中关键要素是固定不变的 C.关键要素是企业最先要解决、投资最先保证、质量要求最高的环节 D.同一行业的企业有类似的关键因素 8.MIS的战略规划主要是规划管理信息系统()。 A.设计与实施工作B.长期的、重大的发展方向目标 C.与其它系统的关系D.工作环境与条件。 9.下面哪句话最准确地概括了结构化方法的核心思想()

A、由分解到抽象 B、自顶向下,由细到粗,逐步抽象 C、自下而上,由抽象到具体 D、自顶向下,由粗到细,逐步求精 10.总体规划是系统生命周期中的第一个阶段,其主要任务是明确() A、系统的业务流程的细节 B、系统的数据流程 C、系统是什么 D、系统的开发工具等 11. 下列描述正确的是() A、总体规划是系统开发中的首要任务 B、总体规划位于系统分析之后 C、总体规划是系统开发中相对容易的阶段 D、总体规划阶段应当包含数据流程分析 二.填空题 1.开发信息系统的策略有__自下而上__和__自上而下___两种. 2.“自下而上”的开发策略的主要缺点是___不能从整体上考虑问题__. 3.“自上而下”的开发策略的主要优点是___整体性和逻辑性强__. 4.“自上而下”的策略适用于_大_型系统的设计,而“自下而上”的策略适用于_小_型系统的设计. 5.BSP法的优点在于利用它能保证信息系统独立于__组织结构__. 6.结构化系统开发方法可分为系统分析,__系统设计__和__系统实施__三个阶段. 7.诺兰阶段模型把信息系统的成长过程划分为六个阶段 8.信息系统发展的阶段理论被称为诺兰阶段模型。 9.MIS的战略规划可以作为将来考核系统开发工作的标准 10.BSP法的优点在于能保证信息系统结构独立于企业的组织机构。 11.业务流程指的是企业管理中必要的、逻辑上相关的、为了完成某种管理功能的一组活动。 12.原型法贯彻的是自下而上的开发策略。

网上在线论坛系统实验报告

河南工程学院 实习报告 课程名称https://www.wendangku.net/doc/223690546.html,程序设计实训 设计题目网上在线论坛 系(部)计算机学院 班级 学号 姓名 实习时间2013.12.30-2014.1.3 指导教师李艳玮 2014年 1 月3日

实习(训)报告评语 等级: 评阅人:职称: 年月日

目录 摘要 (4) 一绪论 (5) 1课题开发背景 (5) 2课题开发意义 (5) 二系统分析 (5) 1可行性分析 (5) 2需求分析 (6) 3角色分析 (6) 三网站总体设计 (7) 1系统目标 (7) 2系统功能结构 (7) 3功能描述 (8) 4业务流程图 (8) 5构建开发环境 (9) 6数据库设计 (9) 7文件夹组织结构 (12) 四网站详细设计 (13) 1公共模块设计 (13) 2用户登录页面设计 (14) 3网站首页设计 (15) 4用户协议页面设计 (17) 5注册信息页面设计 (18) 五总结 (20) 1系统的特点与不足 (20) 2系统以后的扩展与拓宽 (20) 3自己的体会与感想 (20) 参考文献 (21)

摘要 应本学期实训要求,设计BBS系统。BBS起源于20世纪80年代初,最初,论坛只是用于发布公告信息,讨论问题的在线交流平台。后来,随着网络的普及,论坛的功能越来越丰富,受到广大网民的欢迎。因此,商业网站对论坛重视起来,纷纷在自己的网站上开辟论坛。作为与网民交流的园地。同时在线技术支持和在线服务也在论坛中开展起来。 BBS论坛系统是为了方便大家的沟通和获取信息而开发的系统。本文阐述了一个网上在线论坛网站的基本体系结构,它包括浏览搜索帖子、用户登陆注册、发表回复帖子、个人资料管理和帖子管理;后台功能主要包括用户管理、论坛版块管理和帖子管理等功能模块,并构建了一个网上在线论坛网站的基本体系结构。 本系统采用VS2008集成开发环境进行编程开发,配合使用微软数据库系统SQL SERVER 2008数据库来存储网站中用到的数据信息。 关键词:在线论坛网站设计VS2008 SQL SERVER 2008 数据库

管理信息系统第四版课后案例分析题

第二章奇瑞公司的SAP/ERP 实施与信息化建设 一、奇瑞公司的ERP 实施成功的因素有哪些? 企业资源规划是企业经营和管理技术进步的代表。它融合了管理信息系统的处理功能,在信息技术的基础上,通过系统的计划和控制功能,结合企业的流程优化,有效地配置各项资源,以加快对市场的响应速度,降低成本,并且把企业信息集成的范围扩大到企业的各个部门,管理整个运转体系,提高其运转效率,为企业创造更多价值. 二、在分析该公司各信息系统应用业务领域及其作用的基础上,试讨论管理信息系统具有的特点。 1、它是一个为管理决策服务的信息系统 2、是一个对组织乃至整个供需链进行全面管理的综合系统 3、是一个人机结合的系统 4、是一个需要与先进的管理方法和手段相结合的信息系统 5、它是多学科交叉形成的边缘学科。 管理信息系统的目的在于辅助决策,而决策只能由人来做,因而管理信息系统必然是一个人机结合的系统。在管理信息系统中,各级管理人员既是系统的使用者,又是系统的组成部分,因而,在管理信息系统开发过程中,要根据这一特点,正确界定人和计算机在系统中的地位和作用,充分发挥人和计算机各自的长处,使系统整体性能达到最优。 三、分析和讨论该案例反映了 ERP 哪些经营理念?为什么? 1、采用精益生产方式。 其目的是通过精益生产方式的实施使管理体系的运行更加顺畅。 2、实现全球大市场销售战略与集成化市场营销。 奇瑞信息化的目标是先进管理思想指导下,在国际化、全球大市场视野下,以客户为中心,以市场为向导,建立一个集成的功能强大的信息交互平台。 3、新的技术开发和工程设计管理模式。

ERP 的一个重要目标就是通过对系统各部门持续不断的改进,最终提供令顾客满意的产品和服务。而奇瑞公司在成功实施ERP的同时,购置和开发一系列网站,实现PLM、ERP、SCM、CRM、门户网站等初步集成,基本实现对客户和经销商的电子化服务。 4、ERP的内容在发展。 有些独立软件如供应链管理系统,客户关系管理系统等都是面向决策的,在电子商务环境中,为了利用ERP提高交易效率和改进决策制定过程,就必须改变业务运作模式,实现ERP与SCM、CRM的功能整合。而奇瑞公司通过进一步完善和建设ERP、CRM、LMS、SCM、EPS、DSS、基础建设等信息系统并有效集成,建设奇瑞汽车电子商务综合信息平台,最终规范和理顺了公司的全部管理和业务流程。 第三章某石化厂计算机网络系统 一、实例中涉及了哪些网络技术和网络互联设备? 1.涉及了局域网,广域网,总线型拓扑结构,星型结构,光纤等网络技术 2.涉及了桥路由器,交换器,集线器和中继器等这些网络互联设备 二、实例中涉及的网络互联设备应用于OSI参考模型的哪些层? 1.桥路由器应用于OSI参考模型的网络层 2.交换器应用于OSI参考模型的数据链路层 3.集线器应用于OSI参考模型的物理层 4.中继器应用于OSI参考模型的物理层 第四章 1、能不能直接用FORM标记元素编写的交互网页(HTML文档)实现网上动态交互?为什么?还需要做什么工作? 不能,仅靠HTML是不够的还必须利用ASP环境来进行处理,即服务器端还必须有相应的程序来处理。 2、用ASP编写的“提交”程序和查询后的“返回”程序之间是依靠什么语句来连接的?

bbs网上论坛系统需求分析

1、登录: 非空验证:js不使用alert用innerHTML 用户名密码错误验证:后台向前台输出js代码 忘记密码:忘记密码 可以用用户名或邮箱登录 2、注册: 邮箱验证:正则表达式 验证重名:Ajax 验证用户名中字符:js 验证两次密码:js 验证密码长度:8-16位 验证码:百度如何操作 阅读条款:radio 3、用户: 四级权限:游客、注册用户、注册会员、管理员 注册用户对自己贴子的删贴、发贴。发表回帖。修改自己密码。 注册会员拥有以上权限,而且可以发表一个板块。随着会员等级的增长可以发表更多地板块,存在总数小于等于3个。 管理员可以对所有的板块、帖子、回帖进行删除。可以查询所有用户并删除。对多次发表不当言论者禁言。 用户详细信息:用户登录后可以在用户详细信息界面完善信息,查看发表过的板块、帖子、以及回帖并进行删除。 4、论坛 (1)、板块:会员可以发表板块,版主可以修改板块信息。 版主可以管理本板块下的帖子。 (2)、贴子:发帖人可以删除自己的帖子。 置顶,加精,设为喜欢(建表),举报(建表) 验证码:百度如何操作 (3)、回帖:楼中楼 验证码:百度如何操作 只看楼主 (4)、模糊查询 5、数据库表 目前涉及如下表段,如有需求后期还会增加: 用户表(id,用户名,e-mail,password,用户类型,标记位) 管理员表(id,类型名) 个人信息表(id,用户名,e-mail,性别,出生日期,住址,实名) 板块表(id,板块名,板块信息,板主id,板块内帖子数,标记位) 帖子表(id,帖子标题,帖子内回帖数,发帖时间,发帖人id,所属板块号,帖子内容,标记位,被举报标志位) 回帖表(id,回帖人id,回帖时间,标记位,所属帖子id) 设为喜欢(帖子id,收藏人id) //被举报(帖子id,发帖人) 验证码表

管理信息系统第五章习题

第五章管理信息系统的战略规划和开发方法 第五章习题 单项选择题 5.1.1 诺兰阶段模型把信息系统的成长过程划分为( D )阶段。 a. 三个 b. 四个 c. 五个 d. 六个 5.1.2 信息系统发展的( D )理论被称为诺兰阶段模型。 a. 成熟 b. 形成 c. 优化 d. 阶段 5.1.3 MIS的战略规划可以作为将来考核( D )工作的标准。 a. 系统分析 b. 系统设计 c. 系统实施 d. 系统开发 5.1.4 MIS战略规划的组织除了包括成立一个领导小组、进行人员培训外,还包括( B )。 a. 制定规划 b. 规定进度 c. 研究资料 d. 明确问题 5.1.5 BSP法的优点在于能保证( A )独立于企业的组织机构。 a. 信息系统 b. 数据类 c. 管理功能 d. 系统规划 5.1.6 ( B )指的是企业管理中必要的、逻辑上相关的、为了完成某种管理功能的一组活动。 a. 管理流程 b. 业务过程 c. 系统规划 d. 开发方法 5.1.7 U/C矩阵是用来进行( C )的方法。 a. 系统开发 b. 系统分析 c. 子系统划分 d.系统规划 5.1.8 定义信息系统总体结构的目的是刻画未来信息系统的框架和相应的( D )。 a. 功能组 b. 开发方案 c. 开发顺序 d. 数据类 5.1.9 结构化系统开发方法在开发策略上强调( A ) a. 自上而下 b. 自下而上 c. 系统调查 d. 系统设计 5.1.10 原型法贯彻的是( B )的开发策略。 a. 自上而下 b. 自下而上 c. 系统调查 d. 系统设计 填充题 5.2.1 诺兰阶段模型把信息系统的成长过程划分为初装、、控制、、数据管理和成熟等六个阶段。 5.2.2 蔓延阶段的特点有:、不一致性和等。 5.2.3 诺兰阶段模型的控制阶段是实现以计算机管理为主到以管理为主转换的关键。 5.2.4 开发管理信息系统的策略有和两种。 5.2.5 “自下而上”的开发策略的主要缺点是 5.2.6 “自上而下”的开发策略的主要优点是 5.2.7 “自下而上”的策略适用于型系统的设计,而“自下而上”的策略适用于型系统的设计。 5.2.8 MIS战略规划是一个组织的的重要组成部分,是关于MIS长远发展的规划。 5.2.9 规划领导小组应由单位(企业、部门)的负责。 5.2.10 制定MIS开发规划。需要成立一个,进行人员培训,同时明确规划进度。 5.2.11 BSP法的优点在于利用它能保证信息系统独立于。

航天测控系统

航天测控系统 1.定义 2.发展概况 3.系统组成 4.航天测控网 5.总体设计 6.总体设计中必须解决的问题 7.电子测控系统 8.航天电子测控系统的新发展 9.计算系统 10.测控的其他应用 11.展望 1.定义 对运行中的航天器(运载火箭、人造地球卫星、宇宙飞船和其他空间飞行器)进行跟踪、测量和控制的大型电子系统。 2.发展概况 中国航天测控系统也是在航天事业的发展中逐步臻于完善的。在大陆上已经建立了多个测控站和一个测控通信中心。为了扩展观测范围,还建造了海上测量船,以便驶往远洋对航天器进行跟踪观测。在整个测控系统中使用了多台计算机,并有贯通各个测控站、测量船和测控中心的通信网络。 3.系统组成 ①跟踪测量系统:跟踪航天器,测定其弹道或轨道。 ②遥测系统:测量和传送航天器内部的工程参数和用敏感器测得的空间物理参数。 ③遥控系统:通过无线电对航天器的姿态、轨道和其他状态进行控制。

④计算系统:用于弹道、轨道和姿态的确定和实时控制中的计算。 ⑤时间统一系统:为整个测控系统提供标准时刻和时标。 ⑥显示记录系统:显示航天器遥测、弹道、轨道和其他参数及其变化情况,必要时予以打印记录。 ⑦通信、数据传输系统:作为各种电子设备和通信网络的中间设备,沟通各个系统之间的信息,以实现指挥调度。 4. 航天测控网 各种地面系统分别安装在适当地理位置的若干测控站(包括必要的测量船和测控飞机)和一个测控中心内,通过通信网络相互联接而构成整体的航天测控系统。 5.总体设计 航天测控系统总体设计属于电子系统工程问题。对整个系统来说,首先考虑的是航天任务的要求,可以针对某一个任务,也可以兼顾多个任务,从较长远的发展要求来设计。航天测控系统的中心问题是从地面和航天器整体出发,实现信息获取,即将航天器的飞行和工作数据发回地面,并用计算机进行计算、决策和实时反馈来控制航天器飞行的轨道和姿态。 6.总体设计中必须解决的问题 在总体设计中必须解决的问题有:①全系统所要具备的功能和实现这些功能的手段;②测控站布局的合理性;③控制的适时性和灵活性;④各种设备的性能、速度和精度;⑤长期工作的可靠性; ⑥最低的投资和最短的建成时间。 7.电子测控系统 跟踪测量、遥测和遥控系统是整个测控系统的基本部分。电子测控系统 优点是可以对航天器全天候跟踪,而且有较好的灵活性和足够的精度。从系统工程的角度来看,对航天器跟踪测量所得的数据,经过计算,可给出弹道、轨道或位置的信息;而遥测所提供的数据,经过处理、分析可给出航天器的状态信息;它们都是系统中反馈回路的重要信息源。遥控则是控制系统中的执行机构。 电子测量和控制系统的地面部分,必须与装在航天器上的电子设备相配合才能完成测控任务。

管理信息系统》第10章在线测试

10恭喜,交卷操作成功完成!你本次进行的《管理信息系统》第10章在线测试的得分为20分(满分20分),本次成绩已入库。若对成绩不满意,可重新再测,取最高分。 测试结果如下: ? 1.1 [单选] [对] 决策支持系统(DSS)涉及计算机、管理决策、数学、人工智能等多学科的理论、方法和技术,对使用者而言,以下最好的说法是()。 ? 1.2 [单选] [错] DSS是基于两种基本形式的结构分解和组合而演变起来的,这两种基本形式是()。 ? 1.3 [单选] [对] DSS需要良好的人机对话子系统,最要是为了()。 ? 1.4 [单选] [错] 与管理信息系统等其他信息系统相比,以下DSS的定义中,()是DSS最显著的特色。 ? 1.5 [单选] [对] 以下与决策支持系统产生和发展最无关的是()。 ? 2.1 [多选] [对] 决策支持系统(DSS)可由以下基本部件组成:()。 ? 2.2 [多选] [错] 在决策支持系统的数据库子系统的部件包括()。 ? 2.3 [多选] [对] 方法库中存储的方法以程序方式存储,一般有()以及计划方法和金融方法等。 ? 2.4 [多选] [对] 模型库中的模型基本单元的存储方式目前主要有()。 ? 2.5 [多选] [错] 把决策支持系统按管理层次分类时,一般有()等几类。 ? 3.1 [判断] [对] 决策支持系统的目标就是要在人的分析与判断能力的基础上借助计算机与科学方法支持决策者对半结构化和非结构化问题的 决策。() ? 3.2 [判断] [错] 决策支持系统的特征之一是:DSS对准管理人员经常面临的结构化程度高的问题。() ? 3.3 [判断] [对] DSS(决策支持系统)的决策支持过程是一个自动化的过程。() ? 3.4 [判断] [对] 人机对话子系统是DSS的用户与模型库子系统的接口。 () ? 3.5 [判断] [对] 模型是以某种形式反映客观事物本质属性,揭示其运动规律的描述。() 答案:一、CBACD 二、BCDE ABCDE ABCD ABCD BCD 三、1和5正确

航天里面比较好的一些单位

航天里面比较好的一些单位 [转]面向航天系统的单位据说比较好的(以下转载自西祠胡同)一院:一部、12所、14所 二院:二部、23所、25所 三院:三部、33所、31所 五院:501、502、503 排名如下,供大家参考: 第一:一部,501 第二:三部,502 第三:12所,33所,14所,25所 第四:二部,23所,31所,503 现在过去能排队分房子的有501,502,33所 工资最高的应该是1部、3部、33所,好点的室硕士8万问题不大 发展前景最好的应该是501、1部 车最多的是3部,33所 综合地理位置以及实力来看12所最好 一院一部,二院二部,上海八院,还有航天测控我都面试过,都基本拿到了OFFER,其他的院所也有所了解,据我打听待遇都差不了太多,二院二部主要是在市区,而且不提供住宿,这样要自己租房,待遇一算就低了。至于奖金和发展前途,总体发展前途一院一部和五院几个所好一些,属于科技集团,卫星火箭发展火,宣传也好。二院三院属于科工集团,搞导弹相对低调一些,这几年没有科技火,投入也少,它们总体部招的人也少,二院搞防空导弹,属于防御武器,三院搞岸舰导弹,主要属于进攻武器,国家这几年投入三院多点,所以奖金可能比二院多点。另外,本人签二院二部了,希望以上能给大家一点参考,不过其实这些真的很难说,要综合自己情况考虑。 航天\科工\所属单位大整理 *****航天科技集团与航天科工集团分家之前的设置****** 航天一院:运载火箭技术研究院 航天二院:地空导弹研究院(长峰集团) 航天三院:飞航导弹研究院(海鹰集团) 航天四院:航天化学动力研究院(固体)西安 航天五院:空间技术研究院 航天六院:中国河西化工机械公司(内蒙古) 航天七院:航天建筑设计研究院 航天八院:上海航天技术研究院(上海航天局) 航天九院:航天基础电子技术研究院 航天十院:航天时代仪器公司(北京)

第十章 输入输出系统习题

第十章输入输出系统习题 一、单项选择题: 1、“总线忙”信号是由__ __建立的。 A.获得总线控制权的设备B.发出“总线请求”的设备 C.总线控制器D.CPU 2、在不同速度的设备之间传送数据__ __。 A.必须采用同步控制方式B.必须采用异步控制方式 C.可以选用同步方式,也可选用异步方式D.必须采用应答方式 3、挂接在总线上的多个部件___ _。 A.只能分时向总线发送数据,并只能分时从总线接收数据 B.只能分时向总线发送数据,但可同时从总线接收数据 C.可同时向总线发送数据,并同时从总线接收数据 D.可同时向总线发送数据,但只能分时从总线接收数据 4、总线从设备是____。 A.掌握总线控制权的设备 B.申请作为从设备的设备 C.被主设备访问的设备D.总线裁决部件 5、假设某系统总线在一个总线周期中传输4个字节信息,一个总线周期占用2个时钟周期,总线时钟频率为10MHz,则总线带宽是__ __。 A.10 MB/s B.20 MB/s C.40 MB/s D.80 MB/s 6、波特率表示传输线路上____。 A.信号的传输速率B.有效数据的传输速率 C.校验信号的传输速率D.干扰信号的传输速率 7、中断系统中的断点是指____。 A.子程序入口地址B.中断服务子程序入口地址 C.中断服务程序入口地址表D.中断返回地址 8、显示器的主要参数之一是分辨率,其含义是____。 A.显示屏幕的水平和垂直扫描频率 B.显示屏幕上光栅的列数和行数 C.可显示不同颜色的总线 D.同一个画面允许显示不同颜色的最大数目 9、下列选项中,能引起外部中断的事件是____。 A.键盘输入B.除数为0 C.浮点运算下溢D.访存缺页 10.CPU响应中断时,最先完成的两个步骤是_ __和保护现场信息。 A.开中断 B.恢复现场 C.关中断 D.不可屏蔽中断 11、在独立编址方式下,存储单元和I/O设备是靠来区分的。 A.不同的地址代码B.不同的地址总线 C.不同的指令和不同的控制信号D.上述都不同 12、计算机系统的输入/输出接口通常是__ __。 A.CPU与存储器之间的交界面B.存储器与打印机之间的交界面 C.主机与外围设备之间的交界面D.CPU与系统总线之间的交界面 13.根据连线的数量,总线可分为串行总线和_____ ___总线

管理信息系统第十章课后题答案

管理信息系统第十章课后题答案 第十章信息系统的管理 10.1信息系统管理的目的是什么?按大致的系统生命阶段划分,相应的管理内容有哪些? 答:项目管理是把系统开发作为一项工程来进行科学管理,用系统工程的方法来进行统筹和协调,目的是使管理人员事先对可能发生的情况作出预测,在问题发生之前及时进行控制和调整,从而使项目管理工作由被动的事后解决变为主动的事前控制,使项目开发工作少出差错、少走弯路,保证经济有效地、保质按时地开发好信息系统。项目管理工作的主要内容包括:1、合理管理和培训人员。2、拟定和实现项目工作计划。3、在开发的每个阶段都应制订相应文件,明确工作目标和职责范围。 10.2专门开发和商品软件购置两类信息系统建设方式的异同点有哪些? 答:不同的人在不同时间、不同情况下,在管理工作的细节做法上可能会有差异,而且也很难用文字表达清楚,因此说管理具有不确定性或结构化程度不高。相应地,管理信息系统的设计上必然带有不确定的内容,系统开发也就具有不确定性。不同的开发方式各有优缺点和适用性,开发方式的选择对信息系统的成败有重要的影响。购置质量好的商品软件可以加快信息系统的开发进度。但由于规范模式的商品软件对组织的变革,尤其是对流程改革有较大的推动力度,这使企业获得成功带来难度,且具有一定的风险。 10.3为什么说系统文档是信息系统的生命线? 答:文档是记录人们思维活动及其结果的图文资料,信息系统的文档是描述系统从无到有整个发展与演变过程及各个状态的图文资料。系统的开发要以文档描述为依据,系统实体的运行与维护更需要文档来支持,因此可以说,系统文档是信息系统必不可少的组成部分,是信息系统的生命线。 10.4请分别就信息系统的安全与保密的意义谈谈你的认识。 管理信息系统课后题答案(1-12章) 1

管理信息系统第十章习题

第十章信息系统的管理 第十章习题 10.1单项选择题 10.1.1某企业在决定信息系统的开发方式时,有些模块需要购置现成的商品软件,有些模块需要自己开发,以下模块中可以考虑自己开发的是(D)。 a.应收款管理 b.客户订单管理 c.客户档案管理 d.客户开发进程管理 10.1.2推动企业变革是企业信息化的重要目的之一。一般认为应用信息系统商品软件有利于推动企业变革,其理由是(B)。 a.商品软件无法按企业原来的管理模式做修改 b.商品软件按先进的管理模式设计而使企业靠拢 c.商品软件经过严格的测试而质量可靠 d.商品软件的各企业用户能相互交流而取长补短 10.1.3企业信息系统的开发有几种方式可供选择,以下关于这些方式的正确叙述是(C)。 a.自主开发方式在需求明确、用户适应性方面较优,但风险较大 b.委托开发方式在用户适应性方面较优,需求满足较好,但不利于推动变革 c.购置商品软件方式在项目控制方面较好,有利于推动变革,但用户适应性一般 d.委托开发和购置商品软件方式有利于本企业信息人才的培养 10.1.4目前outsourcing成为一种先进的现代管理思想和方法,在企业信息系统建设方面也被采用。以下工作中(C)可被认为是outsourcing。 a.向计算机公司购买服务器及配套的网络设备 b.请信息系统专家做兼职顾问 c.将自己的数据备份到信息服务公司的备份设备 d.到先进企业考察和学习信息系统建设的做法 10.1.5信息系统开发项目中子项目之间的依赖关系是决定项目计划的主要因素之一。以下各对子系统中,前者应计划在先的是(A)。 a.订单管理系统和销售计划管理系统 b.会计报表管理系统和账务处理系统 c.车间作业计划系统和生产计划系统 d.原材料库存管理系统和物料目录管理系统 10.1.6企业信息系统开发项目大都无法按时完成,其主要原因是(B)。 a.合作方未按要求完成进度 b.有较多的细节要求在开发过程才能得到明确,增加了系统方案的修改与开发工作量 c.我国还缺乏得力的信息管理与信息系统专业人才 d.需要非常大的投资,往往超出预算而难以满足经费需要 10.1.7如果企业信息系统开发项目过程中已经发现时间上的延误,那么可以采取一些措施将进度拉回来,但以下措施中(A)是不可取的。 a.再分解工作内容,增加开发人员来承担 b.经常性地与用户交换意见,及时地明确项目计划中遗留的不确定问题 c.适当调配或增加开发人员,解决延误工作 d.在不影响总体目标的前提下,删减个别子项目或减低局部的功能指标 10.1.8信息系统建设项目大都要有向管理人员进行信息系统知识培训的安排,在以下各种安排中正确的是(A)。 a.各层次管理人员和系统建设各阶段 b.各层次管理人员和系统投运前

管理信息系统第8章练习有答案

第八章管理信息系统的系统实施 第八章习题 8.1单项选择题 8.1.1在项目管理中,主要需协调()之间的矛盾,并要采取措施加强他们之间的联系和合作。 A.系统设计人员和系统分析员 B.领导和计算机技术人员 C.系统分析人员和编程人员 D.系统设计人员和编程人员 8.1.2为便于系统重构,模块划分应()。 A.大些B。适当 C.尽量大D。尽量小 8.1.3程序员设计程序和编写程序时主要依据下列资料进行:() A.系统流程图 B.程序流程图 C.系统流程图、程序编写说明书及输入/输出说明 D.处理流程图 8.1.4 系统调试中的分调是调试()。 A.主控程序 B.单个程序,使它能运行起来 C.功能模块内的各个程序,并把它们联系起来 D.调度程序 8.1.5计算机设备的折旧费属于()。 A.一次性投资额B。管理费用 C.经营费用D。可变费用 8.1.6 visual basic(). A.是关系数据库管理系统B。没有生成功能 C.有一定生成功能D。不具有面向对象功能 8.1.7 DO WHILE—ENDDO语句用于()。 A.选择结构B。循环结构 C.顺序结构D。网络结构 8.1.8 系统开发中要强调编好文档的主要目的是()。 A.便于开发人员与维护人员交流信息B。提高效益 C.便于绘制流程图D。增加收入 8.1.9外部调和租金、打印用纸、人工费、设备折旧等属于()。 A.投资费用B。经营费用 C.附加费用D。管理费用 8.1.10建立管理信息系统时使用的投资效果系数应()。 A.高于一般工业部门的投资效果系数 B.低于一般工业部门的投资效果系数 C.等于一般工业部门的投资效果系数 D.稍低于一般工业部门的投资效果系数 8.1.11系统实施阶段的工作内容包括() A.文件和数据库设计B。系统运行的日常维护 C.编写程序设计说明书D。制定设计规范 8.1.12系统调试中总调的内容包括()。 A.程序的语法调试B。主控制调度程序调试 C.功能的调试D。单个程序的调试 8.1.13程序的总调指的是()。

中国航天与系统工程

国防科技工业 2003.4 13 专题报道 中国航天创建以来,管理体制历经调整变化,研制任务不断更新换代,而系统工程方法却是中国航天几十年管理实践不变的主旋律。 江泽民同志1999年在表彰为“两弹一星”做出突出贡献的科技专家大会上指出,我国成功地研制出“两弹一星”的经验之一是,“广泛运用了系统工程、并行工程和矩阵式管理等现代管理理论与方法”,如何总结和升华中国航天几十年来按照和合乎系统工程方法的管理实践,如何学习和借鉴他人在系统工程方面的理念和方法,使中国航天在未来的发展中实现缩短研制周期,降低研制成本,产品性能优良,质量稳定的目标,是一个应当思考和研究的重要问题。 一、航天系统工程 钱学森在1978年文汇报上发表的文章《组织管理的技术——系统工程》是第一次在媒体上宣传系统工程这门科学技术。事实上,中国航天的系统工程方法实践早在60年代初就在他的倡导下开始了。那时候,党和国家决定按照“自力更生为主,争取外援为辅”的方针研制导弹。这项复杂的高技术系统工程,涉及多种专业技术,需要巨大的资源投入,具有很高的风险。在当时国家经济、技术基础薄弱的条件下,怎样结合中国的实际情况,在较短的时间内,以较少的人力、物力和投资,有效地利用科学技术最新成就, 完成导弹的研制任务,成为摆在科技和管理 中国航天与系统工程 ■ 郭宝柱

2003.4 国防科技工业 14 专题报道 而下从系统、分系统到部件的层层定义和分解活动,“V”图的右侧,则代表部件和分系统自下而上进行集成和试验,最后得到经过验证的系统。可以看到,系统分解和综合集成,正是系统工程的方法的核心。 国外对于系统工程定义的研究一直都没有停止过。1974年发布的美军标准499A,现在已经被电子工业联合会以及电器和电子工程师协会的新标准所取代。研 究这些定义所覆盖的基本观点,结合我们自己的系统工程实践,可以认为系统工程的概念是:系统工程是复杂系统研制的工程方法,是分析、综合、试验和评价反复进行的过程。系统工程从要求出发,把系统分解为多种工程专业的研制活动,最后集成为一个总体性能优化,满足全寿命周期使用要求的系统;系统工程管理保证系统研制活动有序进行,保持研制过程中成本、进度、性 它既是技术设计一个整体性能优化以及各是总体设计工作的总体先从确定系统在更又从整体优化的角度协调分系统与总体,分系统与分系统之间的接口关系,组织系统试验,最终完成系统的整体集成。 系统是由相互关联的若干组成部分构成的具有一定功能的整体。在关注其分系统、部件等组成元素的同时,更应当关注系统的另一个重要的组成部分,即指导如何构造系统的特征信息图谱。这就是总体设计的成果,是最后实现“涌现”的基础。分系统和部件的设计可以是很优秀的,也可以因为条件的限制只是一种折衷的方案。但是总体设计并不是这些分系统和部件的简单相加。按照系统论的观点,现有各部分的简单对接,其结果整体性能通常只会等于或弱于各部分性能之和。总体的系统工程工作,面对高水平的使用或技术要求,各种限制条件甚至苛刻的使用环境,参差不齐的技术基础, 复杂的界面关系,利用原有的经 验,发挥聪明才智,最终产生满足要求、整体性能优化的系统,实现的是整体功能优于各分系统功能之和,即“1+1〉2”。 型号设计师和指挥调度体系:中国航天系统工程的组织方式 在中国航天,系统工程的组织管理体系是设计师系统和指挥调度系统。型号设计师系统是型号的技术体系,总设计师是研制任务的技术总负责人,是设计技术方面的组织者、指挥者,重大技术问题的决策者。指挥调度系统是型号行政管理系统,行政总指挥是型号计划进度和预算计划与控制的总负责人,是资源保障方面的组织者、指挥者。 中国航天在创业阶段,依靠自力更生,迅速突破航天技术,填补科技空白是航天人的历史责任。在国家“一穷二白”的条件下,由行政指挥系统集中协调一切可以利用的资源,保障总师系统提出的技术性能指标的有效实现,是实现技术突破的保证。型号设计师和指挥调度体系是具有中国特色的组织管理方式,是当时学习苏联总设计师负责制与中国实际相结合的产物,在一定历史阶段是唯一正确的选择。 今天,以最短的时间,以最少的人力、物力和投资,完成型号研制任务已经越来越明确地成为新形势下的管理目标。最好是一个决策人,在研制的全过程中保持着技术、进度、经费三要素的平衡,不断做出优化的决策选择,这就是项目经理引起讨论的原因。 中国航天的型号总体和主要分系统通常都是在一个行政单位内部配套,从型号院延伸到厂、所的型号指挥系统,与院行政管

计算机组成原理第八章输入输出系统

第八章输入输出系统 一、填空题; 1.直接内存访问(DMA)方式中,DMA控制器从CPU完全接管对A.______的控制,数据交换不经过CPU,而直接在内存和B.______之间进行。 2.通道是一个特殊功能的A.______ ,它有自己的B.______ 专门负责数据输入输出的传输控制。 3.并行I/O接口A.______ 和串行I/O接口B.______ 是目前两个最具有权威性的标准接口技术。 4.在计算机系统中,CPU对外围设备的管理,除了程序查询方式、程序中断方式外,还有A.______方式、B.______方式和C.______方式。 5.程序中断方式控制输入输出的主要特点是,可以使A 和B 并行工作。 6.DMA控制器按其A 结构,分为B 型和C 型两种。 7.通道是一个特殊功能的A ,它有自己的B 专门负责数据输入输出的传输控制,CPU只负责C 功能。 8.通道有三种类型:A 通道、B 通道、C 通道。 二、选择题: 1.下面有关“中断”的叙述,______是不正确的。 A.一旦有中断请求出现,CPU立即停止当前指令的执行,转而去受理中断请求 B.CPU响应中断时暂停运行当前程序,自动转移到中断服务程序 C.中断方式一般适用于随机出现的服务 D.为了保证中断服务程序执行完毕以后,能正确返回到被中断的断点继续执行程 序,必须进行现场保存操作 2.中断向量地址是______。 A. 子程序入口地址 B. 中断服务例行程序入口地址 C. 中断服务例行程序入口地址的地址 D. 主程序返回地址 3.在数据传送过程中,数据由串行变并行或由并行变串行,其转换是通过______。 A. 移位寄存器 B. 数据寄存器 C. 锁存器 D. 指令寄存器 4.采用DMA方式传送数据时,每传送一个数据要占用______的时间。 A. 一个指令周期 B. 一个机器周期 C. 一个时钟周期 D. 一个存储周期 5.发生中断请求的条件是______。 A. 一条指令执行结束 B. 一次I/O操作开始 C. 机器内部发生故障 D. 一次DMA操作开始 6.为了便于实现多级中断,保存现场最有效的方法是采用______。 A. 通用寄存器 B. 堆栈 C. 存储器 D. 外存 7.采用串行接口进行七位ASCII码的传送,带有一位奇校验位、一位起始位和一位停止位,当波特率为4800波特时,字符传送速率为___。 A.480 B. 436 C. 685 D. 240 8.在单级中断系统中,CPU一旦响应中断,则立即关闭___标志,以防止本次中断服务结束前同级的其他中断源产生另一次中断进行干扰。 A.中断允许 B. 中断请求 C. 中断屏蔽

管理信息系统习题集_第10章_中文

《管理信息系统》第13版(Laudon/Laudon) 第10章电子商务:电子化市场与电子化产品 单项选择题 1)电子商务指的是利用任何互联网技术进行商务交易 参考答案: FALSE 难度系数: 2 2)消费电子商务目前每年仍以约25%的速率增长 参考答案: FALSE 难度系数: 3 3)互联网减少了信息不对称 参考答案: TRUE 难度系数: 2 4)85%的在线零售商现在有了移动商务网站? 参考答案: FALSE 难度系数: 2 5)现代历史上,包括印刷出版物在内的所有大众媒体采用的都是广播的传播模式。在这种模式中内容是由处于中心位置的专家们创造的。 参考答案: TRUE 难度系数: 2 6)去中介化为分销商提供了主要利润。 参考答案: FALSE 难度系数: 2 7)一般而言对于数字化产品,多生产一单位的边际成本为零。 参考答案: TRUE 难度系数: 2 8)电子通讯的硬件和软件是一个网站预算中典型的花费最少的部分 参考答案: TRUE 难度系数: 2 9)内容提供者商务模式的一个例子是https://www.wendangku.net/doc/223690546.html,,这是一个纸质书籍的零售商。 参考答案: FALSE 难度系数: 1

10)亚马逊的推荐系统是以网络提示为特色的社交电子商务模式的一个例子。参考答案: FALSE 难度系数: 3 11)播客允许订阅用户听现场演出、流媒体无线电广播以及其它音频形式。参考答案: FALSE 难度系数: 1 12)知识产权指的是所有形式的人类表达,包括有形和无形。 参考答案: FALSE 难度系数: 2 13)在美国,96%的互联网家庭使用宽带连接 参考答案: TRUE 难度系数: 2 14)行为定向可以发生在两个层面:个人网站和通过ISPs 参考答案: FALSE 难度系数: 2 15)EDI标准利用网络通信已经在行业层面得以充分实施。 参考答案: FALSE 难度系数: 2 16)网络集市可以支持按合同从指定的供货商长期采购,也能支持短期现货采购。 参考答案: TRUE 难度系数: 3 17)交换市场已经成为网络集市最流行的类型之一,因为网络集市鼓励竞争性竞价会驱使市场价格降低。 参考答案: FALSE 难度系数: 3 18)汽车制造商是垂直市场的一个例子 参考答案: TRUE 难度系数: 2 19)总的来说,自从2000年以来构建和运营一个网站的硬件、软件和通讯成本已经下降超过了50%。 参考答案: TRUE 难度系数: 2

管理信息系统_第十章练习题

第十章习题 10.1 单项选择题 10.1.1 某企业在决定信息系统的开发方式时,有些模块需要购置现成的商品软件,有些模块需要自己开发,以下模块中可以考虑自己开发的是(D)。 a. 应收款管理 b. 客户订单管理 c. 客户档案管理 d. 客户开发进程管理 10.1.2 推动企业变革是企业信息化的重要目的之一。一般认为应用信息系统商品软件有利于推动企业变革,其理由是(B )。 a. 商品软件无法按企业原来的管理模式做修改 b. 商品软件按先进的管理模式设计而使企业靠拢 c. 商品软件经过严格的测试而质量可靠 d. 商品软件的各企业用户能相互交流而取长补短 10.1.3 企业信息系统的开发有几种方式可供选择,以下关于这些方式的正确叙述是(C)。 a. 自主开发方式在需求明确、用户适应性方面较优,但风险较大 b. 委托开发方式在用户适应性方面较优,需求满足较好,但不利于推动变革 c. 购置商品软件方式在项目控制方面较好,有利于推动变革,但用户适应性一般 d. 委托开发和购置商品软件方式有利于本企业信息人才的培养 10.1.4 目前outsourcing成为一种先进的现代管理思想和方法,在企业信息系统建设方面也被采用。以下工作中(C)可被认为是outsourcing。 a. 向计算机公司购买服务器及配套的网络设备 b. 请信息系统专家做兼职顾问 c. 将自己的数据备份到信息服务公司的备份设备 d. 到先进企业考察和学习信息系统建设的做法 10.1.5 信息系统开发项目中子项目之间的依赖关系是决定项目计划的主要因素之一。以下各对子系统中,前者应计划在先的是(A)。 a. 订单管理系统和销售计划管理系统 b.会计报表管理系统和账务处理系统 c. 车间作业计划系统和生产计划系统 d. 原材料库存管理系统和物料目录管理系统 10.1.6 企业信息系统开发项目大都无法按时完成,其主要原因是(B)。 a. 合作方未按要求完成进度 b. 有较多的细节要求在开发过程才能得到明确,增加了系统方案的修改与开发工作量 c.我国还缺乏得力的信息管理与信息系统专业人才 d. 需要非常大的投资,往往超出预算而难以满足经费需要 10.1.7 如果企业信息系统开发项目过程中已经发现时间上的延误,那么可以采取一些措施将进度拉回来,但以下措施中(A)是不可取的。 a. 再分解工作内容,增加开发人员来承担 b. 经常性地与用户交换意见,及时地明确项目计划中遗留的不确定问题 c. 适当调配或增加开发人员,解决延误工作 d. 在不影响总体目标的前提下,删减个别子项目或减低局部的功能指标 10.1.8 信息系统建设项目大都要有向管理人员进行信息系统知识培训的安排,在以下各种安排中正确的是(A)。

管理信息系统第十一章习题

第十一章决策支持系统 第十一章习题 11.1 单项选择题 11.1.1 DSS涉及计算机、管理决策、数学、人工智能等多学科的理论、方法和技术,对使用者而言,以下最好的说法是( C )。 a. 计算机知识最重要 b. 数学知识最重要 c. 管理决策知识最重要 d. 很难说哪种知识最重要 11.1.2 关于使用DSS的问题有以下几种说法,其中最好的说法是( B )。 a. 无论是谁,只要有说明书,慢慢地试着用,会用好的 b. 经验丰富的经理会用的好些 c. 懂计算机的人会用的好些 d.没有计算机专业人员的引导很难用好 11.1.3 以下与DSS产生和发展最无关的是( D )。 a. 信息技术的发展 b. 管理决策理论的发展 c. 企业环境的变化 d. 白领工人的增加 11.1.4 与MIS等其他信息系统相比,以下DSS的定义中,( C )是DSS最显著的特色。 a. DSS是一种以计算机为工具的信息系统 b. DSS应用决策科学及有关学科的理论与方法 c. DSS以人机交互方式辅助决策者 d. DSS是解决半结构化和非结构化问题的信息系统 11.1.5 传统的DSS有许多功能,如A. 企业内外部信息查询;B. 决策模型构建;C. 求解算法供选;D. 决策问题分析。现在如果要你作为用户就其重要程度排队,排在最前面的是( D )。 a. A b. B c. c d. D 11.1.6 DSS是基于两种基本形式的结构分解和组合而演变起来的,这两种基本形式是( B )。 a. 数据库与模型库 b. 两库结构与基于知识的结构 c.人机对话子系统和三库结构 d. 模型库和方法库 11.1.7 MIS和DSS都有模型,但它们的模型在( A )方面是有区别的。 a. 模型的可组建性 b. 模型的大小 c.模型的多少 d. 模型的储存方式 11.1.8 DSS中的模型库和方法库是两个重要的构件,它们所存储的决策资源不同,作用也不同。模型库储存的模型和方法库储存的方法之间的区别( A )。 a. 在于对决策支持作用的“幕前”和“幕后” b. 实际上是很难识别的 c. 实际上并不大 d. 在于对决策支持作用的大小 11.1.9 以下关于各种信息系统的说法中正确的是( C )。 a. 某企业建立了多个OAS b. 某企业建立了多个CRM c. 某企业建立了多个DSS d. 某企业建立了多个ERP 11.1.10 与专家系统相比,人工神经元网络具有( B )的特点。 a. 解决问题的逻辑清晰 b. 某些应用会超过专家的水平 c. 能对结果进行合理的解释 d. 较人性化 11.1.11 传统的DSS与智能DSS在构成、应用对象、性能等方面有许多区别,但其中最主要的区别是( D )。

相关文档
相关文档 最新文档