[计算机硬件及网络]第8章输入输出.doc
《[计算机硬件及网络]第8章输入输出.doc》由会员分享,可在线阅读,更多相关《[计算机硬件及网络]第8章输入输出.doc(35页珍藏版)》请在三一文库上搜索。
1、第八章 输入输出Java所有的I/O机制都是基于数据流的,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。 Java.io是大多数面向数据流的输入/输出类的主要软件包。这个软件包包含了两个抽象类,InputStream和OutputStream。所有其它面象数据流的输入/输出类都要扩展这两个基类。 java.io软件包提供了一些类和接口,它们在由InputStream和OuputStream类提供的读写操作的顶端定义了一些有用的抽象。例如,ObjectInputStream类提供了把
2、输入/输出流中的数据当成对象来读取的方法,而ObjectOutputStream类提供了把Java对象写入数据流中的方法。数据从一个输入源获得。程序的结果被送到输出目的地。Java中,这些源和目的地被广泛的定义。例如一个网络连接器,内存缓冲区或磁盘文件可以被Java输入/输出类熟练的操作。尽管从物理上很难说明,这些外设都由相同的抽象体流(stream)来处理。流(stream)是一个生产或消费信息的逻辑实体。流通过Java输入/输出系统与物理设备相连。尽管与之相连的实际的物理设备各不相同,所有的流都以同样的方式运转。8.1 Java输入/输出类和接口java.io定义的输入/输出类列于下:1B
3、ufferedInputStream 2. FileWriter 3. PipedInputStream4BufferedOutputStream 5. FilterInputStream 6. PipedOutputStream7BufferedReader 8. FilterOutputStream 9. PipedReader等。ObjectInputStream.GetField 和ObjectOutputStream.PutField 是Java 2新添的内部类。java.io包还包含两个不受java 2欢迎的类,这两个类没有在上表中列出:LineNumber InputStream
4、和StringBufferInputStream。新代码不应该使用两个类。下面是由java.io定义的接口:DataInput FilenameFilter ObjectOutputDataOutput ObjectInput ObjectStreamConstantsExternalizable ObjectInputValidation SerializableFileFilterFileFilter接口是Java 2新增的。java.io包中有很多类和接口。包括字节和字符流,对象序列化(对象的存储和释放)。本章讲述几个最常用的I/O成员,从最独特的File开始。8.2 File(文件类)
5、尽管java.io定义的大多数类是实行流式操作的,File类不是。它直接处理文件和文件系统。也就是说,File类没有指定信息怎样从文件读取或向文件存储;它描述了文件本身的属性。File对象用来获取或处理与磁盘文件相关的信息,例如权限,时间,日期和目录路径。此外,File还浏览子目录层次结构。很多程序中文件是数据的根源和目标。尽管它们在小应用程序中因为安全原因而受到严格限制,文件仍是存储固定和共享信息的主要资源。Java中的目录当成File 对待,它具有附加的属性 一个可以被 list( )方法检测的文件名列表。下面的构造函数可以用来生成File 对象:File(String directory
6、Path)File(String directoryPath, String filename)File(File dirObj, String filename)这里,directoryPath是文件的路径名,filename 是文件名,dirObj 一个指定目录的File 对象。下面的例子创建了三个文件:f1,f2,和f3。第一个File对象是由仅有一个目录路径参数的构造函数生成的。第二个对象有两个参数路径和文件名。第三个File对象的参数包括指向f1文件的路径及文件名。f3和f2指向相同的文件。File f1 = new File(/);File f2 = new File(/,auto
7、exec.bat);File f3 = new File(f1,autoexec.bat);注意:Java 能正确处理UNIX和Windows/DOS约定路径分隔符。如果在Windows版本的Java下用斜线(/),路径处理依然正确。如果用Windows/DOS使用反斜线()的约定,需要在字符串内使用它的转义序列()。Java约定是用UNIX和URL风格的斜线来作路径分隔符。File 定义了很多获取File对象标准属性的方法。例如getName( )返回文件名,getParent( )返回父目录名,exists( )在文件存在的情况下返回true,反之返回false。然而File类是不对称的。
8、说它不对称,意思是虽然存在允许验证一个简单文件对象属性的很多方法,但是没有相应的函数来改变这些属性。下面的例子说明了几个File方法:例8.1 : / Demonstrate File.import java.io.File;class FileDemo static void p(String s) System.out.println(s);public static void main(String args) File f1 = new File(/java/COPYRIGHT);p(File Name: + f1.getName();p(Path: + f1.getPath();p(
9、Abs Path: + f1.getAbsolutePath();p(Parent: + f1.getParent();p(f1.exists() ? exists : does not exist);p(f1.canWrite() ? is writeable : is not writeable);p(f1.canRead() ? is readable : is not readable);p(is + (f1.isDirectory() ? : not + a directory);p(f1.isFile() ? is normal file : might be a named pi
10、pe);p(f1.isAbsolute() ? is absolute : is not absolute);p(File last modified: + f1.lastModified();p(File size: + f1.length() + Bytes);运行该程序,将看到下面的结果:File Name: COPYRIGHTPath: /java/COPYRIGHTAbs Path: /java/COPYRIGHTParent: /javaexistsis writeableis readableis not a directoryis normal fileis absoluteF
11、ile last modified: 812465204000File size: 695 Bytes大多数File方法是自说明的,但isFile( )和isAbsolute( )不是。isFile( )在被文件调用时返回true,在被目录调用时返回false。并且,isFile( )被一些专用文件调用时返回false,例如设备驱动程序和命名管道,所以该方法可用来判定文件是否作为文件执行。isAbsolute( )方法在文件拥有绝对路径时返回true,若是相对路径则返回false。File 还包括两个有用的实用工具方法。第一个是renameTo( ),显示如下:boolean renameTo
12、(File newName)这里,由newName指定的文件名变成了所调用的File 对象的新的名称。如果更名成功则返回ture,文件不能被重命名(例如,试图重命名文件以使它从一个目录转到另一个目录,或者使用了一个已经存在的文件名),则返回false。第二个实用工具方法是delete( ),该方法删除由被调用的File对象的路径指定的磁盘文件。它的形式如下:boolean delete( )同样可以在目录为空时用delete( )删除目录。如果删除了文件,delete( )返回true,如果文件不能被删除则返回false。Java 2 为File 类增添了一些新的方法,在某些场合这些新增方法很
13、有用。一些最有趣的方法显示如下:方法 描述void deleteOnExit( ) 在java虚拟机终止时删除与调用对象相关的文件boolean isHidden( ) 如果调用的文件是隐藏的,返回true;否则返回 false。boolean setLastModified(long millisec) 设置由millisec指定的调用文件的时间标志,Millisec是从1970年1月1号开始的标准时间(UTC)的毫秒数boolean setReadOnly( ) 设置调用文件为只读并且,因为File 类现在支持Comparable 接口,compareTo( )方法也被支持。8.2.1 目
14、录目录是一个包含其他文件和路径列表的File 类。当创建一个File 对象且它是目录时,isDirectory( ) 方法返回ture。这种情况下,可以调用该对象的list( )方法来提取该目录内部其他文件和目录的列表。该方法有两种形式。第一种形式如下:String list( )文件列表在一个String 对象数组中返回。下面显示的程序说明怎样用list( )来检查一个目录的内容:例8.2: import java.io.File;class DirList public static void main(String args) String dirname = /java;File f1
15、 = new File(dirname);if (f1.isDirectory() System.out.println(Directory of + dirname);String s = f1.list();for (int i=0; i s.length; i+) File f = new File(dirname + / + si);if (f.isDirectory() System.out.println(si + is a directory); else System.out.println(si + is a file); else System.out.println(di
16、rname + is not a directory);下面是程序的样本输出(当然,目录下的内容不同,输出也不同):Directory of /javabin is a directorylib is a directorydemo is a directoryCOPYRIGHT is a fileREADME is a fileindex.html is a fileinclude is a directorysrc.zip is a file.hotjava is a directorysrc is a directory8.2.2 使用FilenameFilter人们总是希望能够限制由l
17、ist( )方法返回的文件数目,使它仅返回那些与一定的文件名方式或者过滤(filter)相匹配的文件。为达到这样的目的,必须使用list( )的第二种形式:String list(FilenameFilter FFObj)该形式中,FFObj是一个实现FilenameFilter接口的类的对象。FilenameFilter仅定义了一个方法,accept( )。该方法被列表中的每个文件调用一次。它的通常形式如下:boolean accept(File directory, String filename)当被directory 指定的目录中的文件(也就是说,那些与filename 参数匹配的文件
18、)包含在列表中时,accept( )方法返回true ,当这些文件没有包括在列表中时,accept( )返回false。下面显示的OnlyExt 类实现FilenameFilter接口,它被用来修饰前面的程序,限制由 list( )返回的文件名的可见度,把对象被创建时以指定扩展名结束的文件归档。例8.3 : import java.io.*;public class OnlyExt implements FilenameFilter String ext;public OnlyExt(String ext) this.ext = . + ext;public boolean accept(Fi
19、le dir, String name) return name.endsWith(ext); 修改过的目录列表程序显示如下。现在它只显示以.html 为扩展名的文件。例8.4 : / Directory of .HTML files.import java.io.*;class DirListOnly public static void main(String args) String dirname = /java;File f1 = new File(dirname);FilenameFilter only = new OnlyExt(html);String s = f1.list(
20、only);for (int i=0; i s.length; i+) System.out.println(si); 8.2.3 listFiles()方法Java 2增加了list( )方法的一个变化形式,名为listFiles( ),该方法很有用。listFiles( )形式如下:File listFiles( )File listFiles(FilenameFilter FFObj)File listFiles(FileFilter FObj)上述三种形式以File对象矩阵的形式返回文件列表,而不是用字符串形式返回。第一种形式返回所有的文件,第二种形式返回满足指定FilenameFil
21、ter接口的文件。除了返回一个File 对象数组,这两个listFiles( )方法就像list( )方法一样工作。第三种listFiles( )形式返回满足指定FileFilter的路径名的文件。FileFilter只定义了一个accept( )方法,该方法被列表中的每个文件调用一次。它的通常形式如下:boolean accept(File path)如果文件被包括在列表中(即与path参数匹配的文件),accept( )方法返回true,如果不被包括,则返回false。8.2.4 创建目录另外两个有用的File类的方法是mkdir( )和mkdirs( )。mkdir( )方法创建了一个目
22、录,创建成功返回true,创建失败返回false。创建失败是指File对象指定的目录已经存在,或者是因为整个路径不存在而不能创建目录。创建路径不存在的目录,用mkdirs( )的方法。它创建目录以及该目录所有的父目录。8.3 流 类Java 的流式输入/输出建立在四个抽象类的基础上:InputStream, OutputStream, Reader和Writer。它们用来创建具体流式子类。尽管程序通过具体子类执行输入/输出操作,顶层的类定义了所有流类的基础通用功能。InputStream 和OutputStream 设计成字节流类。Reader 和Writer 为字符流设计。字节流类和字符流类
23、形成分离的层次结构。一般说来,处理字符或字符串时应使用字符流类,处理字节或二进制对象时应用字节流类。下面分别讲述字节流和字符流类。8.4 字 节 流字节流类为处理字节式输入/输出提供了丰富的环境。一个字节流可以和其他任何类型的对象并用,包括二进制数据。这样的多功能性使得字节流对很多类型的程序都很重要。因为字节流类以InputStream 和OutputStream为顶层,我们就从讨论这两个类开始。8.4.1 InputStream(输入流)InputStream 是一个定义了Java流式字节输入模式的抽象类。该类的所有方法在出错条件下引发一个IOException 异常。以下是方法描述:int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机硬件及网络 计算机硬件 网络 输入输出
链接地址:https://www.31doc.com/p-1991366.html