第8章Java IO系统.ppt

上传人:s****8 文档编号:66867068 上传时间:2022-12-21 格式:PPT 页数:30 大小:116KB
返回 下载 相关 举报
第8章Java IO系统.ppt_第1页
第1页 / 共30页
第8章Java IO系统.ppt_第2页
第2页 / 共30页
点击查看更多>>
资源描述

《第8章Java IO系统.ppt》由会员分享,可在线阅读,更多相关《第8章Java IO系统.ppt(30页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、第8章 Java I/O 系统l8.1文件类l8.2JavaI/O结构l8.3使用流l8.4对象序列化l8.5小结8.1文件类 l8.1.1文件类Filel8.1.2文件过滤8.1.1文件类File-1l不管是程序员还是程序和文件系统打交道总是不可避免的,我们经常要用cd这个命令来更改当前目录,在Windows中用dir查看文件信息,在Unix系统中用ls查看文件信息。在Java语言中,用类File表示文件,File类可以处理各种文件操作。l和文件相关的一个重要概念是目录,Java的类File既可以表示文件,也可以表示目录。类File有3个常用构建器:File(StringfileName)F

2、ile(Stringdirectory,StringfileName)File(Filedirectory,StringfileName)8.1.1文件类File-2l第一个构建器通过文件名,可以是文件的完全路径名,也可以是相对路径名(相对于当前线程的工作目录),创建一个File对象。l第二个构建器同时指定了文件的目录和文件名,第三个构建器和第二个的区别在于使用一个File对象而不是String对象来表示文件目录。l下面我们通过例子来进行说明:8.1.1文件类File-3例8.1.1TheFile.javaimportjava.io.*;classTheFilepublicstaticvoid

3、main(Stringargs)FilediskC=newFile(C:/);FiletestFile=newFile(diskC,test);System.out.println(diskC.getAbsolutePath()+是否存在:+diskC.exists();System.out.println(testFile.getAbsolutePath()+是否存在:+testFile.exists();8.1.1文件类File-4l程序运行结果:C:是否存在:trueC:test是否存在:falsel既然调用File类构建器并不能创建一个文件,那么我们如何创建一个文件呢?一种方法是调用F

4、ile对象的方法createNewFile(),另一种更常用的方法是调用我们随后要介绍的类FileOutputStream的构建器,它还可以提供File类不具备的文件输出功能。lFile类的方法mkdir()和mkdirs()可以用来创建目录,这两个方法的区别在于mkdirs()可以创建目录路径中多层目录,即同时创建这个目录的父目录以及父目录的父目录,而mkdir()要求创建目录的父目录已存在。8.1.1文件类File-5lFile类大概有40个方法,下面我们列举其中一些较为常用的:booleancreateNewFile()如果File所表示的文件不存在则创建一个新的空文件,创建成功返回tr

5、ue,失败则返回false。booleandelete()删除File所表示的文件或目录,删除目录要求该目录为空,返回值表示删除动作是否成功。booleanmkdirs()创建一个目录。booleanrenameTo(Filedestination)对一个文件改名或移动。booleanisDirectory()检测File对象表示的是否为目录。publicbooleanisFile()检测File对象表示的是否为文件。booleancanRead()检测一个文件是否可读。8.1.1文件类File-6booleancanWrite()检测一个文件是否可写。booleanexists()检测一个文

6、件是否存在。Stringlist()获取File所表示的目录下的文件和目录列表。longlastModified()返回文件最好修改时间。时间为基于1970-01-0100:00:00的毫秒数。StringgetPath()返回相对路径名(包括文件名)。StringgetAbsolutePath()返回完全路径名。StringgetParent()如果File对象指定了父目录,则返回父目录名,否则返回一个null值。StringgetName()返回File对象所表示对象的文件名或目录名。8.1.1文件类File-7l下面在看一个File的应用实例,在Windows中我们可以使用DOS命令tr

7、ee显示一个目录结构,即显示一个目录下包含的文件和子目录,以及子目录下再包含的文件和子目录。(程序源代码请参见教材例(程序源代码请参见教材例8.1.3)l程序运行结果示例:程序运行结果示例:lC:java JTree c:windowslc:windowsl|+$hf_mig$l|+KB818529l|+RTMQFEl|-shdocvw.dlll|-urlmon.dlll|-spmsg.dlll|-spuninst.exel|+updatel|-eula.txtl.8.1.1文件类File-8l在这个例子中,我们调用递归方法list,来显示指定目录下的子目录和文件。程序首先使用File对象的l

8、ist()方法获得一个目录的所有成员列表,然后对每个目录成员构造一个File对象,调用其方法isDirectory()判断这个成员是否为目录,如果是,则进入该子目录,进一步获取子目录的成员列表。8.1.2文件过滤-1l在很多情况下我们可能要根据文件名对文件进行过滤,这个时候就需要调用文件过滤方法。publicStringlist(FilenameFilterfilter)其中FilenameFilter是一个接口,其中声明了一个抽象方法:booleanaccept(Filedir,Stringname);通过实现这个接口就可以进行文件名过滤。在文件系统中,文件扩展名代表着文件类型,下面我们就实

9、现一个例子,按文件扩展名进行文件名过滤。8.1.2文件过滤-2l(程序源代码请参见教材例8.1.4)l该程序运行结果显示当前目录下的java源文件:C:javaFileExtensionFilterAccess.javaEventListener.javaFileExtensionFilter.java.FilenameFilter是一个很简单的接口,在程序中为了增强代码的紧凑性,我们可以直接利用匿名内部内来实现这个接口8.2 Java I/O结构 程序中的数据流,是对现实世界中水流的一个形似的抽象。流用来顺序地读写数据信息,它是一个单向的数据通道,输入流从某个外部的数据源向程序输入数据,输出

10、流从程序向外部数据目标输出数据。位于java.io包中的类包含两组独立的类层次结构:一个用于读写字节,称为字节流;另一个用于读写字符,称为字符流。字节流与字符流的区别在于它们处理数据的方式。8.2.1字节流-1l输入流(InputStream)和输出流(OutputStream)构成字节流的祖先,这两个类直接继承了Object类。InputStream和OutputStream都是抽象类,InputStream为其他所有字节输入流的超类,而OutputStream为其他所有字节输出流的超类。下面为字节输入流的类层次结构。图8.2.1 字节输入流的类层次结构8.2.1字节流-2图8.2.2字节输

11、出流的类层次结构8.2.1字节流-3lInputStream有9个直接的子类,OutputSteam有5个直接的子类lInputStream的方法:publicabstractintread()throwsIOExceptionpublicintread(byteb)throwsIOExceptionpublicintread(byteb,intoff,intlen)throwsIOExceptionpublicintavailable()throwsIOExceptionpublicvoidmark(intreadlimit)publicvoidreset()throwsIOExceptio

12、npublicbooleanmarkSupported()publiclongskip(longn)throwsIOExceptionpublicvoidclose()throwsIOException8.2.1字节流-4lOutputStrem中定义了5个方法:publicabstractvoidwrite(intb)throwsIOExceptionpublicvoidwrite(byteb)throwsIOExceptionpublicvoidwrite(byteb,intoff,intlen)throwsIOExceptionpublicvoidflush()throwsIOExcep

13、tionpublicvoidclose()throwsIOException8.2.2字符流-1l在实际应用中,存在一类文本数据,它们可能采用各种不同的字符编码方式(字符集),可能是单字节字符,也可能是多字节字符,这就需要借助于字符流来处理文本类信息。读取器(Reader)和写出器(Writer)是所有字符流的超类,它们是直接继承Object类的抽象类。图8.2.3字符输入流的类层次结构8.2.2字符流-2图8.2.4字符输出流的类层次结构8.2.2字符流-3lReader和Writer定义了与InputStream和OutputStream类似的方法。lReader类中定义了和InputSt

14、ream类似的read方法用来读取字符:publicintread()throwsIOExceptionpublicintread(charcbuf)throwsIOExceptionpublicabstractintread(charcbuf,intoff,intlen)throwsIOExceptionl在Writer类中定义了和OutputStream类似的write方法用来写出字符:publicvoidwrite(Stringstr)throwsIOExceptionpublicvoidwrite(charcbuf)throwsIOExceptionpublicabstractvoid

15、write(charcbuf,intoff,intlen)throwsIOException8.3使用流使用流l8.3.1标准流l8.3.2文件流l8.3.3过滤器流l8.3.4随机访问文件l8.3.5读取器和写出器8.3.1标准流 lJava语言包中有一个类System,这个类没有共有的构建器,因此我们并不能创建这个类的对象实例,不过我们想了解的是它提供的3个有用的静态类字段:publicfinalstaticInputStreamin;publicfinalstaticPrintStreamout;publicfinalstaticPrintStreamerr;lSystem类的这三个静态

16、字段就是系统的标准流:System.in表示系统标准输入流,通常环境下标准输入流指向键盘输入;System.out表示系统标准输出流,通常环境下标准输出流指向屏幕输出;System.err表示系统标准错误输出流,通常环境下标准错误输出流也指向屏幕输出。8.3.2文件流-1 l文件读写是最常见的I/O操作,通过文件流来连接磁盘文件,读写文件内容是一件很轻松的工作。文件输入流(FileInputStream)和文件输出流(FileOutputStream)是抽象类InputStream和OutputStream的具体子类,实现了文件的读写。文件的读写工作包括3个步骤:l打开文件输入流或输出流l文件

17、读或写操作l关闭文件输入流或输出流8.3.2文件流-2 lFileInputStream有3个构建器:publicFileInputStream(StringfileName)throwsFileNotFoundExceptionpublicFileInputStream(Filefile)throwsFileNotFoundExceptionpublicFileInputStream(FileDescriptorfdObj)lFileOutputStream最常用的两个构建器如下:publicFileOutputStream(Stringname)throwsFileNotFoundExce

18、ptionpublicFileOutputStream(Stringname,booleanappend)throwsFileNotFoundExceptionl无论是FileInputStream还是FileOutputStream,当程序不再使用时,就应该及时调用close()方法,进行关闭,这将允许操作系统释放与流相关的系统资源。publicvoidclose()throwsIOException8.3.3过滤器流-1 lJava的流按使用方式可以分为两类,一类是建立了程序和其他数据源或数据目标的数据通道,程序通过这类流可以和流的另一端的数据源或目标进行数据交互,这类数据流称为节点流(n

19、odestream)。例 如 文 件 输 入 流 FileInputStream和 文 件 输 出 流FileOutputStream,在它们的另一端是磁盘文件。l另一类流,本身并不和具体的数据源和数据目标连接,它们连接在其他输入或输出流上,提供各种数据处理,诸如转换、缓存、加密、压缩等功能,这类流称为过滤器流(filterstream)。过滤器输入流从已存在的输入流(比如FileInputStrem)读取数据,对数据进行适当的处理和改变然后再送入程序。过滤器输出流向已存在的输出流(比如FilterOutputSteam)写入数据,在数据抵达底层流之前进行转换处理等工作。8.3.3过滤器流-2

20、l过滤器输入流FilterInputStream和过滤器输出流FilterOutputStream分别为InputStream和OutputStream的子类。lFilterInputStream的构建器如下:protectedFilterInputStream(InputStreamin)lFilterOutputStream的构建器如下:publicFilterOutputStream(OutputStreamout)8.3.4随机访问文件 lRandomAccessFile和FileInputStream和FileOutputStream不同,它既可以读取一个文件,也可以写入一个文件。l

21、RandomAccessFile类具有如下的构建器:publicRandomAccessFile(Stringname,Stringmode)throwsFileNotFoundExceptionpublicRandomAccessFile(Filefile,Stringmode)throwsFileNotFoundException其中第一个参数使用文件名或File对象指定一个文件。第二个参数mode指定文件的打开方式,mode为“r”时,指定文件按只读方式打开;mode为“rw”时,文件按只读写方式打开。8.3.5读取器和写出器 lReader和 Writer作 为 字 符 流 的 祖 先

22、,它 们 都 是 抽 象 类。InputStreamReader和 OutputStreamWriter是 我 们 常 用 的 Reader和Writer的具体实现的子类。InputStreamReader可以从特定编码的数据源中读取文本信息,它的两个常用构建器如下:publicInputStreamReader(InputStreamin)public InputStreamReader(InputStream in,String charsetName)throwsUnsupportedEncodingExceptionl其中第一个参数要求指定一个输入流。第二个构建器中,允许我们指定数据源

23、的字符集,如果当前系统不能支持指定的字符集,将抛出异常UnsupportedEncodingException,它是IOException的一个子类。8.4对象序列化 l对象的序列化就是把一个对象的状态转化成一个字节流。我们可以把这样的字节流存储为一个文件,作为这个对象的一个拷贝,在一些分布式应用中,我们还可以把对象的字节流发送到网络上的其他计算机。与序列化过程相对的是反序列化,就是把流结构的对象恢复为其原有形式。l并非所有的对象都需要或者可以序列化的。一个对象如果能够序列化就将其称为可序列化的。如果一个Java对象可以序列化,就必须实现Serializable接口。Serializable接

24、口定义如下:packagejava.io;publicinterfaceSerializablel实现Serializable接口,不需要编写任何代码,只是用来表明这个类的对象实例是可以序列化的。8.5小结 l在java.io包中包括了三组具有不同用处的类和接口:处理文件系统的类和接口建立数据流的类用于序列化的类和接口l在Java中,可以利用对象File来统一表示文件或目录。调用File类的构建器,创建File对象实例时,并不会创建一个文件,File对象既可表示一个存在的文件,也可以表示一个不存在的文件。l流是一个单向的数据通道,程序可以通过输入流从外部数据源读取数据,通过输出流向外部数据源写出数据。通过流读取和写出数据时,并不关心数据源和数据目标具体是什么。l对象的序列化就是把一个对象的状态转化成一个字节流,这样字节流可以存储为该对象的一个拷贝。反序列化就是从一个对象的流拷贝里恢复一个对象。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁