收藏 分享(赏)

java考试资料.docx

上传人:HR专家 文档编号:6617314 上传时间:2019-04-18 格式:DOCX 页数:38 大小:387.84KB
下载 相关 举报
java考试资料.docx_第1页
第1页 / 共38页
java考试资料.docx_第2页
第2页 / 共38页
java考试资料.docx_第3页
第3页 / 共38页
java考试资料.docx_第4页
第4页 / 共38页
java考试资料.docx_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、匿名内部类是没有名字的内部类,不能实现其他类,但一个内部类可以作为一个接口,由另一个内部类实现Anonymous Inner Class (匿名内部类) 是否可以 extends(继承)其它类,是否可以implements(实现)inte*ce(接口)? 匿名的内部类是没有名字的内部类。不能 extends(继承) 其它类,但一个内部类可以作为一个接口,由另一个内部类实现。介绍 JAVA 中的 Collection FrameWork 浏览次数:672 次悬赏分:20 | 解决时间:2010-6-29 16:33 | 提问者:wangnasha1 介绍 JAVA 中的 Collection F

2、rameWork625最佳答案 Collection List LinkedList ArrayList Vector Stack Set Map Hashtable HashMap WeakHashMap Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即Collection 的元素(Elements) Map 提供 key 到 value 的映射。介绍 JAVA 中的 Collection FrameWork 浏览次数:672 次悬赏分:20 | 解决时间:2010-6-29 16:33 | 提问者:wangnasha1 介绍 JAVA 中的

3、Collection FrameWork625最佳答案 Collection List LinkedList ArrayList Vector Stack Set Map Hashtable HashMap WeakHashMap Collection 是最基本的集合接口,一个 Collection 代表一组 Object,即Collection 的元素(Elements) Map 提供 key 到 value 的映射。抽象类里面可以有非抽象方法但接口里只能有抽象方法 声明方法的存在而不去实现它的类被叫做抽像类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明

4、方法,但不能在该类中实现该类的情况。不能创建 abstract 类的实例。然而可以创建一个变量,其类型是一个抽像类,并让它指向具体子类的一个实例。不能有抽像构造函数或抽像静态方法。Abstract 类的子类为它们父类中的所有抽像方法提供实现,否则它们也是抽像类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。接口(interface)是抽像类的变体。在接口中,所有方法都是抽像的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽像的,没有一个有程序体。接口只可以定义 static final 成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为

5、。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对像上调用接口的方法。由于有抽像类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。Java IO 全攻略分类: Java IO2009-02-05 14:11 780 人阅读 评论(0) 收藏 举报本篇主要讲述 IO 相关的内容,主要包括:与 IO 相关的简单的历史背景知识;Java IO 的简单分类;与 IO 设计相关的两个模式;同时列举几个简单的例子;分析其中几个实现的源代

6、码;最后给大家一些简单扩展的例子。治学先治史,下面我们先从简单的历史开始吧!一、 历史背景“对语言设计人员来说,创建好的输入输出系统是一项特别困难的任务。”Think in Java无论是系统、还是语言的设计中 IO 的设计都是异常复杂的。面临的最大的挑战一般是如何覆盖所有可能的因素,我们不仅仅要考虑文件、控制台、网络、内存等不同的种类,而且要处理大量的不同的读取方式,如:顺序读取、随机读取,二进制读取、字符读取,按行读取、按字符读取Linux 是第一个将设备抽象为文件的操作系统,在 Linux 中所有的外部设备都可以用读取文件的方法读取,这样编程人员就可以以操作文件的方法操作任何设备。C+在

7、 IO 方面也做了一些改进 引进了流的概念,我们可以通过 cin、cout 读写一些对象。Java 语言在 IO 设计方面取得较大的成功,它是完全面向对象的,主要采用装饰器模式避免大量的类,包括了最大的可能性,提供了较好的扩展机制“Java 库的设计者通过创建大量类来攻克这个难题。事实上,Java 的 IO 系统采用了如此多的类,以致刚开始会产生不知从何处入手的感觉(具有讽刺意味的是,Java 的 IO 设计初衷实际要求避免过多的类)。” 上面一段来自Think in Java,确实很多初学者刚刚学习 java 的 IO 时会比较茫然,不过等我们知道装饰器模式(Decorator)的用意、场景

8、及其在 Java 的 IO 包中的使用,你可能会真正领会整个IO 的 FrameWork。二、IO 的分类Java IO 一般包含两个部分:1.java.io 包中堵塞型 IO;2.java.nio 包中的非堵塞型 IO,通常称为 New IO。学过操作系统的朋友都知道系统运行的瓶颈一般在于 IO 操作,一般打开某个 IO 通道需要大量的时间,同时端口中不一定就有足够的数据,这样 read 方法就一直等待读取此端口的内容,从而浪费大量的系统资源。有人也许会提出使用 java 的多线程技术啊!但是在当前进程中创建线程也是要花费一定的时间和系统资源的,因此不一定可取。Java New IO 的非堵

9、塞技术主要采用了 Observer 模式,就是有一个具体的观察者和监测 IO 端口,如果有数据进入就会立即通知相应的应用程序。这样我们就避免建立多个线程,同时也避免了read 等待的时间。不过本篇主要讲述 java 的堵塞型 IO,就是我们通常应用的那个包。打开你的 java.io 包你可以看到 Java 的 IO 包含大量的类和接口(JDK1.6 中包含 83 个类或者接口),如此众多的类和接口似乎无从下手。下面就将 IO 简单地分类。Java 的 IO 主要包含三个部分:1.流式部分IO 的主体部分;2.非流式部分主要包含一些辅助流式部分的类,如:File 类、RandomAccessFi

10、le 类和FileDescriptor 等类;3.文件读取部分的与安全相关的类,如:SerializablePermission 类。以及与本地操作系统相关的文件系统的类,如:FileSystem 类和 Win32FileSystem 类和 WinNTFileSystem 类。流式部分可以概括为:两个对应一个桥梁。两个对应指:1.字节流(Byte Stream)和字符流( Char Stream)的对应;2.输入和输出的对应。一个桥梁指:从字节流到字符流的桥梁。对应于输入和输出为 InputStreamReader 和OutputStreamWriter。在流的具体类中又可以具体分为:1.介质

11、流(Media Stream 或者称为原始流Raw Stream)主要指一些基本的流,他们主要是从具体的介质上,如:文件、内存缓冲区(Byte 数组、Char 数组、StringBuffer 对象)等,读取数据;2.过滤流(Filter Stream)主要指所有 FilterInputStream/FilterOutputStream 和FilterReader/FilterWriter 的子类,主要是对其包装的类进行某些特定的处理,如:缓存等。三、IO 中的流流具有最基本的特点:“One dimension , one direction .” 即流是一维的,同时流是单向的。关于维和我们通常

12、说的一维长度,二维平面,三维空间,四维时空是同一个概念,流就是一维的。单向就是只可以一个方向(按顺序从头至尾依次)读取,不可以读到某个位置,再返回前面某个位置。流的概念和实际水流的概念基本一致,水只可以从高向低一个方向流动。我们某时在目地喝了一口水,下次在同一个地点喝水已经不是当时的那片水了。流的这种特性在 JMS( Java Message Service)的 API 设计中得到了体现。JMS是 J2EE 平台下面向消息中间件的一个标准。(关于中间件技术有机会和大家探讨)JMS 中有五种具体类型的消息,这些消息一般分为两类:1.流式的消息包含ByteMessage 和 StreamMessa

13、ge;2.非流式的消息包含TextMessage、ObjectMessage 和 MapMessage。我们在明白 IO 中流的特点后,基本可以明白 JMS API 设计者的意图。可能有些场合我们需要在文件中随机插入数据、在流中来来回回地执行某些操作,这时候我们绝对不可以使用流相关的对象。很幸运 JDK 的设计者为我们设计了一个单独的类 RandomAccessFile,它可以完成打开、关闭文件、以基本数据类型的方式读取数据、读取下一个行、以 UTF 等格式读取数据、写入各种类型的数据、比较特殊的是他可以通过文件指针的 seek 方法让文件指针移到某个位置,可以通过 getFilePointe

14、r()方法得到当前指针的位置、可以通过 length()方法得到当前文件的容量、通过 getFD()得到 FileDescriptor 对象,通过 getChannel()方法得到FileChannel 对象,从而和 New IO 整合。下面比较简单的分析 IO 中的各个对象吧!3.1 IO 中的输入字节流下面是 IO 中输入字节流的继承图。o InputStreamo ByteArrayInputStreamo FileInputStreamo FilterInputStreamo BufferedInputStreamo DataInputStreamo LineNumberInputSt

15、reamo PushbackInputStreamo ObjectInputStreamo PipedInputStreamo SequenceInputStreamo StringBufferInputStream在上面的关系图中可以看出:1.InputStream 是所有的输入字节流的父类,它是一个抽象类。2. ByteArrayInputStream、StringBufferInputStream、FileInputStream 是三种基本的介质流,它们分别将 Byte 数组、StringBuffer、和本地文件中读取数据。PipedInputStream 是从与其它线程共用的管道中读取

16、数据,与 Piped 相关的知识会用专门的一小节讲解。3. ObjectInputStream 和所有 FilterInputStream 的子类都是装饰流(装饰器模式的主角)。下表列出了这些流的功能及如何使用它们(具体使用在讲解完装饰器模式后会举几个例子)。基本输入字节流:如何构造类 功能怎样使用从内存中的 Byte 数组创建该对象(2 种方法)ByteArrayInputStream 将内存中的 Byte 数组适配为一个 InputStream。一般作为数据源,会使用其它装饰流提供额外的功能,一般都建议加个缓冲功能。从一个 String 对象创建该对象。底层的实现使用StringBuffe

17、r。该类被Deprecated。主要原因是StringBuffer 不应该属于字节流,所以推荐使用StringReader。StringBufferInputStream 将内存中的字符串适配为一个 InputStream。一般作为数据源,同样会使用其它装饰器提供额外的功能。通过一个代表文件路径的String、 File 对象或者FileDescriptor 对象创建。FileInputStream 最基本的文件输入流。主要用于从文件中读取信息。一般作为数据源,同样会使用其它装饰器提供额外的功能。利用对应的PipedOutputStream 创建。PipedInputStream 读取从对应P

18、ipedOutputStream 写入的数据。在流中实现了管道的概念。在多线程程序中作为数据源,同样会使用其它装饰器提供额外的功能。使用两个 InputStream 或者内部对象为 InputStream 的Enumeration 对象创建该对象。SequenceInputStream 将 2 个或者多个InputStream 对象转变为一个 InputStream.一般作为数据源,同样会使用其它装饰器提供额外的功能。主要子类见下表FilterInputStream 给其它被装饰对象提供额外功能的抽象类 装饰、输入字节流:如何构造类 功能怎样使用利用一个 InputStream 构造。Data

19、InputStream 一般和 DataOutputStream配对使用,完成基本数据类型的读写。 提供了大量的读取基本数据类新的读取方法。利用一个 InputStream、或者带上一个自定义的缓存区的大小构造。BufferedInputStream 使用该对象阻止每次读取一个字节都会频繁操作IO。将字节读取一个缓存区,从缓存区读取。 使用 InputStream 的方法读取,只是背后多一个缓存的功能。设计模式中透明装饰器的应用。利用一个 InputStream 构造。LineNumberInputStream 跟踪输入流中的行号。可以调用 getLineNumber( )和 setLineN

20、umber(int)方法得到和设置行号。紧紧增加一个行号。可以象使用其它 InputStream 一样使用。利用一个 InputStream 构造。PushbackInputStream 可以在读取最后一个 byte后将其放回到缓存中。一般仅仅会在设计 compiler的 scanner 时会用到这个类。在我们的 java 语言的编译器中使用它。很多程序员可能一辈子都不需要。3.2 IO 中的输出字节流下面是 IO 中输出字节流的继承图。o o OutputStreamo o ByteArrayOutputStream FileOutputStream FilterOutputStreamo

21、o BufferedOutputStream DataOutputStream PrintStream ObjectOutputStream PipedOutputStream在上面的关系图中可以看出:1.OutputStream 是所有的输出字节流的父类,它是一个抽象类。2. ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向 Byte 数组、和本地文件中写入数据。PipedOutputStream 是向与其它线程共用的管道中写入数据, 3. ObjectOutputStream 和所有 FilterOutputStream 的子类都

22、是装饰流。下表列出了输出字节流的功能及如何使用它们。如何构造类 功能怎样使用无参或者使用一个可选的初始化 buffer 的大小的参数构造。ByteArrayOutputStream 在内存中创建一个buffer。所有写入此流中的数据都被放入到此 buffer中。一般将其和 FilterOutputStream套接得到额外的功能。建议首先和 BufferedOutputStream 套接实现缓冲功能。通过toByteArray 方法可以得到流中的数据。(不通明装饰器的用法)使用代表文件路径的String、 File 对象或者FileDescriptor 对象创建。还可以加一个代表写入的方式是否为

23、 append 的标记。FileOutputStream 将信息写入文件中。一般将其和 FilterOutputStream套接得到额外的功能。利用 PipedInputStream 构造PipedOutputStream 任何写入此对象的信息都被放入对应PipedInputStream 对象的缓存中,从而完成线程的通信,实现了“管道”的概念。具体在后面详细讲解。在多线程程序中数据的目的地的。一般将其和FilterOutputStream 套接得到额外的功能。见下表FilterOutputStream 实现装饰器功能的抽象类。为其它 OutputStream 对象增加额外的功能。见下表装饰输出

24、字节流:如何构造类 功能怎样使用使用 OutputStream 构造DataOutputStream 通常和 DataInputStream 配合使用,使用它可以写入基本数据类新。包含大量的写入基本数据类型的方法。使用 OutputStream 和一个可选的表示缓存是否在每次换行时是否 flush 的标记构造。还提供很多和文件相关的构造方法。PrintStream 产生具有格式的输出信息。(一般地在 java 程序中DataOutputStream 用于数据的存储,即 J2EE 中持久层完成的功能,PrintStream完成显示的功能,类似于J2EE 中表现层的功能)一般是一个终极(“fina

25、l”)的包装器,很多时候我们都使用它!从一个 OutputStream 或者和一个代表缓存区大小的可选参数构造。BufferedOutputStream 使用它可以避免频繁地向IO 写入数据,数据一般都写入一个缓存区,在调用flush 方法后会清空缓存、一次完成数据的写入。提供和其它 OutputStream 一致的接口,只是内部提供一个缓存的功能。3.3 字节流的输入与输出的对应在 3.1 节讲过输入与输出的对应,下图表示字节流部分的输入与输出的对应关系。 上图中蓝色的为主要的对应部分,红色的部分就是不对应部分。我习惯上称之为“不入流”部分。紫色的虚线部分代表这些流一般要搭配使用。从上面的图

26、中可以看出 Java IO 中的字节流是极其对称的。“存在及合理”我们看看这些字节流中不太对称的几个类吧!1. LineNumberInputStream 主要完成从流中读取数据时,会得到相应的行号,至于什么时候分行、在哪里分行是由改类主动确定的,并不是在原始中有这样一个行号。在输出部分没有对应的部分,我们完全可以自己建立一个LineNumberOutputStream,在最初写入时会有一个基准的行号,以后每次遇到换行时会在下一行添加一个行号,看起来也是可以的。好像更不入流了。2. PushbackInputStream 的功能是查看最后一个字节,不满意就放入缓冲区。主要用在编译器的语法、词法

27、分析部分。输出部分的 BufferedOutputStream 几乎实现相近的功能。3. StringBufferInputStream 已经被 Deprecated,本身就不应该出现在 InputStream部分,主要因为 String 应该属于字符流的范围。已经被废弃了,当然输出部分也没有必要需要它了!还允许它存在只是为了保持版本的向下兼容而已。4. SequenceInputStream 可以认为是一个工具类,将两个或者多个输入流当成一个输入流依次读取。完全可以从 IO 包中去除,还完全不影响 IO 包的结构,却让其更“纯洁”纯洁的 Decorator 模式。5. PrintStream

28、 也可以认为是一个辅助工具。主要可以向其他输出流,或者FileInputStream 写入数据,本身内部实现还是带缓冲的。本质上是对其它流的综合运用的一个工具而已。一样可以踢出 IO 包!System.out 和 System.out 就是PrintStream 的实例!蓝色的部分是 IO 字节流的主要组成部分,存在极强的对称关系。关于搭配使用的三对类补充一下:ObjectInputStream/ObjectOutputStream 和DataInputStream/DataOutputStream 主要是要求写对象 /数据和读对象/数据的次序要保持一致,否则轻则不能得到正确的数据,重则抛出异

29、常(一般会如此) ;PipedInputStream/PipedOutputStream 在创建时一般就一起创建,调用它们的读写方法时会检查对方是否存在,或者关闭!道理极其简单对方都不在了,怎么交互啊!3.4 字节流与字符流从上面我们可以看出 IO 中的字节流是极其复杂的,存在大量的类,到目前为止还没有真正使用它们,使用它们应该也是极其复杂的吧!JDK1.1 后 Sun 对 IO 库进行了重大的改进。看到 Reader 和 Writer 类时,大多数人的第一个感觉(不要太相信感觉哦!感觉也许会欺骗你的!)就是它们是用来替换原来的 InputStream 和OutputStream 类。有新的类

30、,干吗还使用旧的呢!?但实情并非如此。尽管 Sun 不建议使用原始的流库中的某些功能,但原来的流依然得到了保留,不仅为了保持向后兼容,主要原因是新库不是旧库的替代,而是对旧库的增强。从以下两点可以明显地看出:(1) 在老式的类层次结构里加入了新的类,这表明 Sun 公司没有放弃老式流库的意图。(2) 在许多情况下,新库中类的使用需要联合老结构中的类。为达到这个目的,需要使用一些“桥”类,如:InputStreamReader 将一个 InputStream 转换成Reader;OutputStreamWriter 将一个 OutputStream 转换成 Writer。那么 Sun 为什么在

31、Java 1.1 里添加了 Reader 和 Writer 层次,最重要的原因便是国际化(Internationalization i18n)的需求。老式 IO 流层次结构只支持 8 位字节流,不能很好地控制 16 位的 Unicode 字符。Java 本身支持 Unicode,Sun 又一致吹嘘其支持 Unicode,因此有必要实现一个支持 Unicode 的流的层次结构,所以出现了 Reader 和 Writer 层次,以提供对所有 IO 操作中的 Unicode 的支持。除此之外,新库也对速度进行了优化,可比旧库更快地运行。8 位的字节流和 16 位的字符流的对应关系,可以从ByteIn

32、putStream/ByteOutputStream 与 CharArrayInputStream/CharArrayOutputStream的对应关系中看出端倪。(还没看出来啊!赶紧去看看 Java 的基本数据类型)。因此在 Java 的 IO 体系中存在字节流和字符流的对应关系。下面就看看字符流吧!3.5 IO 中的输入字符流下面是 IO 中输入字符流的继承图。o o Readero o BufferedReadero o LineNumberReader CharArrayReader FilterReader PushbackReader InputStreamReader FileR

33、eader PipedReader StringReader在上面的关系图中可以看出:1.Reader 是所有的输入字符流的父类,它是一个抽象类。2.CharReader、StringReader 是两种基本的介质流,它们分别将 Char 数组、String 中读取数据。PipedReader 是从与其它线程共用的管道中读取数据。3. BufferedReader 很明显就是一个装饰器,它和其子类负责装饰其它 Reader 对象。4.FilterReader 是所有自定义具体装饰流的父类,其子类 PushbackReader 对 Reader对象进行装饰,会增加一个行号。5.InputStre

34、amReader 是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader 可以说是一个达到此功能、常用的工具类,在其源代码中明显使用了将 FileInputStream 转变为 Reader 的方法。我们可以从这个类中得到一定的技巧。Reader 中各个类的用途和使用方法基本和 InputStream 中的类使用一致。后面会有 Reader 与 InputStream 的对应关系。3.6 IO 中的输出字符流下面是 IO 中输出字符流的继承图。o o Writero o BufferedWriter CharArrayWriter FilterWriter OutputS

35、treamWritero o FileWriter PipedWriter PrintWriter StringWriter在上面的关系图中可以看出:1.Writer 是所有的输出字符流的父类,它是一个抽象类。2. CharArrayWriter 、StringWriter 是两种基本的介质流,它们分别向 Char数组、String 中写入数据。 PipedWriter 是向与其它线程共用的管道中写入数据, 3. BufferedWriter 是一个装饰器为 Writer 提供缓冲功能。4.PrintWriter 和 PrintStream极其类似,功能和使用也非常相似。5.OutputStr

36、eamWriter 是 OutputStream 到Writer 转换的桥梁,它的子类 FileWriter 其实就是一个实现此功能的具体类(具体可以研究一下 Source Code)。功能和使用和 OutputStream 极其类似,后面会有它们的对应图。3.7 字符流的输入与输出的对应下图为字符流的输入与输出的对应关系图:对应关系和字节流的输入输出基本一致,不必多说了吧!在下面的源代码阅读部分会仔细研究一些!3.8 字节流和字符流的对应Java 的 IO 中存在输入、输出的对应和字节流和字符流的对应,下面就看看字节流和字符流的对应吧!3.8.1 输入的对应下图是 IO 中字节输入流与字符输

37、入流的对应图:蓝色的表示对应的部分,红色的表示不对应的部分。至于为什么不对应还是你自己多看看源代码、多考虑考虑吧!还要强调一点就是即使对应,它们的继承关系也是不太对应的。3.8.2 输出的对应下图是 IO 中字节输出流与字符输出流的对应图:不多说了!等讲述了 Adapter 和 Decorator 模式会基本明白 IO 架构的!通过几个实例一般就可以使用了!java 中有几种方法可以实现一个线程?用什么关键字修饰同步方法? stop()和 suspend()方法为何不推荐使用 浏览次数:670 次悬赏分:0 | 解决时间:2011-3-10 08:03 | 提问者:119070025 最佳答案

38、 有两种实现方法,分别是继承 Thread 类与实现 Runnable 接口用 synchronized关键字修饰同步方法反对使用 stop(),是因为它不安全。它会解除由线程获取的所有锁定,而且如果对象处于一种不连贯状态,那么其他线程能在那种状态下检查和修改它们。结果很难检查出真正的问题所在。suspend()方法容易发生死锁。调用 suspend()的时候,目标线程会停下来,但却仍然持有在这之前获得的锁定。此时,其他任何线程都不能访问锁定的资源,除非被“挂起“的线程恢复运行。对任何线程来说,如果它们想恢复目标线程,同时又试图使用任何一个锁定的资源,就会造成死锁。所以不应该使用 suspen

39、d(),而应在自己的Thread 类中置入一个标志,指出线程应该活动还是挂起。若标志指出线程应该挂起,便用 wait()命其进入等待状态。若标志指出线程应当恢复,则用一个notify()重新启动线程。sleep()方法是使线程停止一段时间的方法。在 sleep 时间间隔期满后,线程不一定立即恢复执行。这是因为在那个时刻,其它线程可能正在运行而且没有被调度为放弃执行,除非:(a)“醒来 ”的线程具有更高的优先级 (b)正在运行的线程因为其它原因而阻塞。 wait()是线程交互时,如果线程对一个同步对象 x 发出一个 wait()调用,该线程会暂停执行,被调对象进入等待状态,直到被唤醒或等待时间到

40、。楼上的有点小错误,我来改一下class Result int getResult(int n) int i,result=1; /应该初始化 result,否则下面会报错的.if(n10) for(i=1;i=n;i+) result *=n; else System.out.println(n 大了); return result; Java I/O 流层次结构 2009-07-14 14:11一、I/O 流层次图 7.1.1 是对 java.io 包中的字节流关系的描述。对于字符流。我们将在 7.4节中介绍。我们通过图 7.1.1 可以看到 io 处理的类层次。所有的输入流都是Input

41、Stream 继承而来的。在类 InputStream 中定义的方法包括从流中读取数据,在流中标记某个位置获取流中可得到的数据量,以及重置流中的读取位置等。同样,所有的输出流都是从抽象类 OutputStream 继承而来的。在类 OutputStream 中定义的方法包括向流中写人数据以及刷空流等 。其他的输入/出流作为 IntputStream和 OutputStream 的子类,主要实现对特定流的输入和输出处理。图 7.1.1 I/O 处理的类层次注:图中,细线框中的内容为类,粗线框中的内容为接口。线段表示继承,射线表示接口的实现。FileInputStram 和 FileOutputS

42、tram 用于读/写本地文件系统中的文件。PipedInputStream 和 PipedOutputStream 用来实现管逍的输入出。ByteArrayInputkStream 和 ByteArrayOutputStream 用于读/写内存数据。StringBufferInputStream 使程序可以从一个 StringBuffer 类的可变字符串中读取数据。SequenceInputStream 用来把多输入流连接到一个输出流。FilterInputStream 和 FilterOutputStream 分别重写了类 InputStream 和 OutputStream 中的所有方法,

43、为过滤流提供了统一的接口,使得在读写数据的同时可以对数据进行处理。DateInputStream 和 DataOutPutstream 可以用与机器无关的格式读/写 Java的基本数据类型。BufferedInputStream 和 BufferedOutputStream 在读/写的同时对数据进行缓存,从而减少对数据源的访问,提高运行效率。ObjectInputStream 和 ObjectOutputStream 用来直接进行对象的读写。LineNumberInputStream 可以在读取数据的同时记录读取的行数。PushbackInputStream 包括一个单字节的缓冲区,使得在读取

44、数据时可以预取下一个字符。PrintStream 中提供了方便的输出方法。除了上面所说的流以外 ,包 java.io 中还提供了其他的一些类和接口。类 File 和 FileDescriptor 用于描述本地文件系统中的文件成目录。类 RandomAccessFile 用于描述一个随机访问文件。类 StreamTokenizer 把流中的内容分解为记号(Token),通常用于文本文件的解析。一个共实现接口 DataInput 和 DataOutput 中定义的方法后 ,就可以用与机器无关的格式读/写 Java 的基本类型数据 。类 DateInputStream、DataOutputStrea

45、m 和 RandomAccessFile 分别实现了这两个接口。接口ObjectInput 和 ObjectOutput 中提供了一组方法 ,支持对对象的直接读/写。类ObjectInputStream 和 ObjectOutputStream 分别实现了这两个接口。接口FilenameFilter 主要用于实现文件名查找模式的匹配。二、InputStream 和 OutputStream抽象类 InputStream 和 OutputStream 是所有流的基类 ,它们分别提供了输入和输出处理的基本接口,并且都分地实现了其中的某些方法。由于 InputStream和 OutputStream

46、 都是抽象类 ,所以不能直接生成它们的对象。我们来看一下 InputStream 和 OutputStream 中所封装的主要内容,以对输对出处理的框架有一个了解。1.InputStream除了构造方法外,InputStream 中所提供的方法主要有:(1)从流中读取数据int read();从输入流中读取了一个字节 ,返回范围在 0 到 255 之间的一个整数,该方法的属性为 abstract,必须为子类所实现。int read(byte b);从输入流中读取长度为 b.length 的数据 ,写入字节数组 b,并返回读取的字节数。int read (byte b, int off, int

47、 len);从输入流中读取长度为 len 的数据 ,写入字节数组 b 中从索引 off 开始的位置,并返回读取的字节数。对于以上方法 ,如果达到流的末尾位置 ,刚返回-1 表明流的结束。int available();返回从输入流中可以读取的字节数。long skip(long n);输入流的当前读取位置向前移动 n 字节 ,并返回实际跳过的字节数。(2)关闭流并且释放与该流相关的系统资源close();关闭流可以通过调用方法 close()显式进行 ,也可以由运行时系统在则流对象进行垃圾收集时隐式进行。(3)使用输入流中的标记void mark(int readlimit);在输入流的当前读

48、取位置作标记 。从该位置开始读取 readlimit 所指定的数据后,标记失效。void reset();重置输入流的读取位置为方法 mark()所标记的位置。Boolean markSuppont();确定输入流是否支持方法 mark()和 reset()。从以上方法中可以看到 ,InputStream 中主要提供了对数据该取的基本支持,其中的方法通常都需要在于类中被重写,以提高效率或是适合于特定流的需要。2.OutputStream除了构造方法外,OutputStream 中封装的方法主要实现对输出数据的支持。(1)输出数据void write(int b);将指定的字节 b 写入输出流。

49、该方法的属性为 abstract ,必须为子类所实现。注意:参数中的 b 为 int 类型,如果 b 的值大于 255,则只输出它的低位字节所表示的值。void write(byte b);把字节数组 b 中的 b.length 个字节写入输出流。void write(byte b, int off, int len);把字节数组 b 中从索引 off 开始的 len 个字节写入输出流。(2)flush()刷空输出流,并输出所有被缓存的字节。(3)关闭流与类 InputStream 类似,可以用方法 close()显式地关闭输出流,也可以由运行时系统在对流对象进行垃圾收集时隐式关闭输出流。通常 OutputStream 中的方法需在于类中被重写,以提高效率或是适合于特定流的需要。Java 内部类总结(2008-08-05 14:32:42)转载标签: 内部类杂谈分类: java内部类是指在一个外部类的内部再定义一个类。内部类作为

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报