欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    第十章IO流的其他知识点.ppt

    • 资源ID:70748237       资源大小:2MB        全文页数:50页
    • 资源格式: PPT        下载积分:16金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要16金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    第十章IO流的其他知识点.ppt

    IO流的其他知识点第十章第十章Scanner类简介数据操作流合并流合并流ZIP压缩输入/输出流简介ZipFile类ZipInputStream类回退流基本概念与Serializable接口实例操作实例操作-单人信息管理程序单人信息管理程序Scanner类简介1Scanner类简介类简介在JDK1.5之后Java提供了专门的输入数据类,此类不只可以完成输入数据操作,也可以方便地对输入数据进行验证。此类存放在java.util包中,其常用方法如表12-14所示。Scanner类的常用方法类的常用方法U提示:提示:Scanner类可以接收任意的类可以接收任意的输入流。输入流。在Scanner类中提供了一个可以接收InputStream类型的构造方法,这就表示只要是字节输入流的子类都可以通过Scanner类进行方便的读取。2使用使用Scanner类输入数据(类输入数据(1)1实例操作一:实现基本的数据输入实例操作一:实现基本的数据输入最简单的数据输入直接使用Scanner类的next()方法即可。范例:输入数据范例:输入数据但是,如果在以上程序中输入了带有空格的内容,则只能取出空格之前的数据,代码如下所示:从运行结果中可以发现,空格后的数据没有了,造成这样的结果是因为Scanner将空格当作了一个分隔符,所以为了保证程序的正确,可以将分隔符号修改为n(回车)。范例:修改输入数据的分隔符范例:修改输入数据的分隔符以上代码完成了字符串内容的输入,如果要输入以上代码完成了字符串内容的输入,如果要输入int或或float类型的数据,在类型的数据,在Scanner类中也有支类中也有支持,但是在输入之前最好先使用持,但是在输入之前最好先使用hasNextXxx()方法进行验证,代码如下所示。方法进行验证,代码如下所示。范例:输入范例:输入int、float2实例操作二:实现日期格式的数据输入实例操作二:实现日期格式的数据输入在Scanner类中没有提供专门的日期格式输入操作,所以,如果想得到一个日期类型的数据,则必须自己编写正则验证,并手工转换。以下代码演示了具体的操作。范例:得到日期范例:得到日期3实例操作三:从文件中得到数据实例操作三:从文件中得到数据如果要从文件中取得数据,则直接将File类的实例传入到Scanner的构造方法中即可。例如,现在要显示d:test.txt中的内容,则可以采用以下的代码,此文件的内容如图所示。范例:读取test.txt文件从Scanner类的操作中可以发现,Scanner类有默认的分隔符,这样如果在文件中存在换行,则表示一次输入结束,所以本程序采用循环的方式读取,并在每次读完一行之后加入换行符,因为读取时内容需要反复修改,所以使用StringBuffer类以提升操作性能。数据操作流在IO包中,提供了两个与平台无关的数据操作流,分别为数据输出流(DataOutputStream)和数据输入流(DataInputStream),通常数据输出流会按照一定的格式将数据输出,再通过数据输入流按照一定的格式将数据读入,这样可以方便地对数据进行处理。例如,有表所示的一组表示订单的数据。订单数据订单数据如果要将以上数据保存到文件中,就可以使用数据输出流将内容保存到文件,然后再使用数据输入流从文件中读取进来。1DataOutputStream类类DataOutputStream是OutputStream的子类,此类的定义如下:publicclassDataOutputStreamextendsFilterOutputStreamimplementsDataOutput此类继承自FilterOutputStream类(FilterOutputStream是OutputStream的子类),同时实现了DataOutput接口,在DataOutput接口定义了一系列的写入各种数据的方法。U提示:DataOutput接口的作用。DataOutput是数据的输出接口,其中定义了各种数据的输出操作方法,例如,在DataOutputStream类中的各种writeXxx()方法就是此接口定义的,但是在数据输出时一般都会直接使用DataOutputStream,只有在对象序列化时才有可能直接操作到此接口.DataOutputStream类的常用方法类的常用方法以上程序的结果中每条数据之间使用n分隔,每条数据中的每个内容之间使用t分隔,如图所示。写入后就可以利用DataInputStream将内容读取进来。2DataInputStream类类DataInputStream是InputStream的子类,专门负责读取使用DataOutputStream输出的数据,此类的定义如下:publicclassDataInputStreamextendsFilterInputStreamimplementsDataInput此类继承自FilterInputStream类(FilterInputStream是InputStream的子类),同时实现DataInput接口,在DataInput接口中定义了一系列读入各种数据的方法。U提示:提示:DataInput接口的作用。接口的作用。DataInput接口是读取数据的操作接口,与DataOutput接口提供的各种writerXxx()方法对应,在此接口中定义了一系列的readXxx()方法,这些方法在DataInputStream类中都有实现。一般在操作时不会直接使用到此接口,而主要使用DataInputStream类完成读取功能,只有在对象序列化时才有可能直接利用此接口读取数据.DataInputStream类的常用方法范例:从范例:从order.txt中读取数据中读取数据合并流合并流合并流的主要功能是将两个文件的内容合并成一个文件,如图所示。如果要实现合并流,则必须使用SequenceInputStream类,此类的常用方法如表所示。SequenceInputStream类的常用方法类的常用方法范例:合并两个文件范例:合并两个文件以上程序在实例化SequenceInputStream类时指定了两个输入流,所以SequenceInputStream类在进行读取时实际上是从两个输入流中一起读取内容的。ZIP压缩输入/输出流简介压缩流压缩流在日常的使用中经常会使用到WinRAR或WinZIP等压缩文件,通过这些软件可以把一个很大的文件进行压缩以方便传输,如图12-20所示。在Java中为了减少传输时的数据量也提供了专门的压缩流,可以将文件或文件夹压缩成ZIP、JAR、GZIP等文件形式。1ZIP压缩输入压缩输入/输出流简介输出流简介ZIP是一种较为常见的压缩形式,在Java中要实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipFile、ZipOutputStream、ZipInputStream和ZipEntry几个类完成操作。U提示:提示:JAR及及GZIP文件格式的压缩输入、输出流。文件格式的压缩输入、输出流。在在JavaIO中,不仅可以实现中,不仅可以实现ZIP压缩格式的输入、输出,也可以实现压缩格式的输入、输出,也可以实现JAR及及GZIP文件格式文件格式的压缩。的压缩。JAR压缩的支持类保存在java.util.jar包中,常用类有如下几个。JAR压缩输出流:JarOutputStream。JAR压缩输入流:JarInputStream。JAR文件:JARFile。JAR实体:JAREntry。GZIP是用于UNIX系统的文件压缩,在Linux中经常会使用到*.gz的文件,就是GZIP格式,GZIP压缩的支持类保存在java.util.zip包中,常用类有如下两个。GZIP压缩输出流:GZIPOutputStream。GZIP压缩输入流:GZIPInputStream。在每一个压缩文件中都会存在多个子文件,那么每一个子文件在Java中就使用ZipEntry表示.ZipEntry类的常用方法如表类的常用方法如表注意:压缩的输入/输出类定义在java.util.zip包中。压缩的输入/输出流也属于InputStream或OutputStream的子类,但是却没有定义在java.io包中,而是以一种工具类的形式提供的,在操作时还需要使用java.io包的支持。2ZipOutputStream类(类(1)如果要完成一个文件或文件夹的压缩,则要使用ZipOutputStream类。ZipOutputStream是OutputStream的子类,常用操作方法如表所示。现在假设在D盘中存在一个mldn.txt文件,文件内容如图12-22所示,要将其压缩成mldn.zip文件,具体代码如下。范例:压缩mldn.zip文件程序运行后,会在D盘上创建一个mldn.zip的压缩文件,文件打开如图12-23所示。上面是对一个文件进行压缩,但是在日常的开发中,往往需要对一个文件夹进行压缩,例如,现在在D盘中存在一个mldn的文件夹,如图12-24所示。ZipOutputStream类(类(2)从使用各种压缩软件的经验来看,如果现在要进行压缩,则在压缩后的文件中应该存在一个mldn文件夹。在文件夹中应该存放着各个压缩文件。所以,在实现时就应该列出文件夹中的全部内容,并把每一个内容设置成ZipEntry对象,保存到压缩文件中,执行流程如图12-25所示。范例:压缩一个文件夹以上代码将mldn文件夹的内容压缩成mldndir.zip文件。程序首先判断给定的路径是否是文件夹,如果是文件夹,则将此文件夹中的内容使用listFiles()方法全部列出,此方法返回File的对象数组,然后将此File对象数组中的每个文件进行压缩,每次压缩时都要设置一个新的ZipEntry对象。程序执行完毕后,在D盘中会生成一个mldndir.zip的文件,文件打开如图所示。ZipFile类在Java中,每一个压缩文件都可以使用ZipFile表示,还可以使用ZipFile根据压缩后的文件名称找到每一个压缩文件中的ZipEntry并将其进行解压缩操作,ZipFile类的常用方法如表所示。范例:实例化ZipFile类对象以上程序只是实例化ZipFile对象,并通过getName()方法取得了压缩文件的名称。下面介绍如何利用此类进行文件的解压缩操作,以前面的mldn.zip文件为例进行解压缩(注意,此压缩文件中只存在一个ZipEntry,即mldn.txt,如图所示)。范例:解压缩文件范例:解压缩文件ZipInputStream类ZipInputStream是InputStream的子类,通过此类可以方便地读取ZIP格式的压缩文件,此类的常用方法如表所示。使用ZipInputStream可以像ZipFile一样取得ZIP压缩文件中的每一个ZipEntry。范例:取得范例:取得mldn.zip中的一个中的一个ZipEntry范例:解压缩范例:解压缩mldndir.zip文件文件以上程序首先使用ZipInputStream读取ZIP格式的压缩文件,然后通过getNextEntry()方法依次读取出其中每一个ZipEntry对象的名称,并通过ZipFile类取得每一个ZipEntry的输入流对象,在进行文件输出前,判断其输出文件夹及文件是否存在,如果不存在则创建。解压缩之后的效果如图所示。回退流在JavaIO中所有的数据都是采用顺序的读取方式,即对于一个输入流来说,都是采用从头到尾的顺序读取的。如果在输入流中某个不需要的内容被读取进来,则只能通过程序将这些不需要的内容处理掉。为了解决这样的读取问题,在Java中提供了一种回退输入流(PushbackInputStream、PushbackReader),可以把读取进来的某些数据重新退回到输入流的缓冲区中。回退流操作机制如图所示。从图可以发现,在回退流之中,对于不需要的数据可以使用unread()方法将内容重新送回到输入流的缓冲区中。下面以PushbackInputStream为例进行讲解,PushbackInputStream类的常用方法如表所示。上表中的3个unread()方法与InputStream(PushbackInputStream是InputStream的子类)类中的3个read()方法相对应,所以回退完全是针对于输入流进行操作的,如表所示。下面以一个简单的程序为例进行回退流的讲解,现在内存中有一个字符串,只要输入的内容是.则执行回退操作,即不读取.。范例:操作回退流本程序中为了让学员看清楚哪些内容是被回退的,所以将被回退的部分打印输出。基本概念与Serializable接口对象序列化对象序列化1、基本概念与、基本概念与Serializable接口接口对象序列化就是把一个对象变为二进制的数据流的一种方法,如图12-30所示。通过对象序列化可以方便地实现对象的传输或存储。如果一个类的对象想被序列化,则对象所在的类必须实现java.io.Serializable接口。此接口的定义如下:可以发现在此接口中并没有定义任何的方法,所以此接口是一个标识接口。表示一个类具备了被序列化的能力。范例:定义可序列化的类范例:定义可序列化的类U提示:对象序列化和对象反序列化操作时的版本兼容性问题。提示:对象序列化和对象反序列化操作时的版本兼容性问题。在对象进行序列化或反序列化操作时,要考虑JDK版本的问题。如果序列化的JDK版本和反序列化的JDK版本不统一则就有可能造成异常,所以在序列化操作中引入了一个serialVersionUID的常量,可以通过此常量来验证版本的一致性。在进行反序列化时,JVM会把传来的字节流中的serialVersionUID与本地相应实体(类)的serialVersionUID进行比较,如果相同就认为是一致的,可以进行反序列化,否则就会出现序列化版本不一致的异常。当实现java.io.Serializable接口的实体(类)没有显式地定义一个名为serialVersionUID、类型为long的变量时,Java序列化机制在编译时会自动生成一个此版本的serialVersionUID。当然,如果不希望通过编译来自动生成,也可以直接显式地定义一个名为serialVersionUID、类型为long的变量,只要不修改这个变量值的序列化实体,都可以相互进行串行化和反串行化。本程序中直接在Person中加入以下的常量即可:2、对象输出流对象输出流ObjectOutputStream一个对象如果要进行输出,则必须使用ObjectOutputStream类,此类的定义如下:ObjectOutputStream类属于OutputStream的子类,此类的常用方法如表所示。ObjectOutputStream常用方法此类的使用形式与PrintStream非常相似,在实例化时也需要传入一个OutputStream的子类对象,然后根据传入的OutputStream子类的对象不同,输出的位置也不同。范例:将Person类的对象保存在文件中3、对象输入流、对象输入流ObjectInputStream使用ObjectInputStream可以直接把被序列化好的对象反序列化。ObjectInputStream的定义如下:ObjectInputStream类也是InputStream的子类,与PrintStream类的使用类似。此类同样需要接收InputStream类的实例才可以实例化。主要操作方法如表所示。范例:从文件中将Person对象反序列化(读取)从程序的运行结果中可以清楚地发现,实现了Serializable接口类,对象中的所有属性都被序列化,如果用户想根据自己的需要选择被序列化的属性,则可以使用另外一种序列化接口-Externalizable接口。4、Externalizable接口接口被Serializable接口声明的类的对象的内容都将被序列化,如果现在用户希望自己指定序列化的内容,则可以让一个类实现Externalizable接口,此接口定义如下:Externalizable接口是Serializable接口的子接口,在此接口中定义了两个方法,这两个方法的作用如下。writeExternal(ObjectOutputout):在此方法中指定要保存的属性信息,对象序列化时调用。readExternal(ObjectInputin):在此方法中读取被保存的信息,对象反序列化时调用。这两个方法的参数类型是ObjectOutput和ObjectInput,两个接口的定义如下。范例:修改范例:修改Person类并实现类并实现Externalizable接口接口以上程序中的Person类实现了Externalizable接口,这样用户就可以在类中有选择地保存需要的属性或者其他的具体数据。在本程序中,为了与之前的程序统一,将全部属性保存下来。范例:序列化和反序列化范例:序列化和反序列化Person对象对象从以上代码中可以发现,使用Externalizable接口实现序列化明显要比使用Serializable接口实现序列化麻烦得多,除此之外,两者的实现还有不同,如表12-27所示。Externalizable接口与接口与Serializable接口实现序列化的区别接口实现序列化的区别实例操作实例操作-单人信息管理程序(单人信息管理程序(1)将前面的菜单程序进行扩充,要求增加时可以增加一个人的完整信息,人的信息包括姓名和年龄。保存后也可以修改、删除、查询此信息。可以使用对象序列化保存。此时程序可以使用前面讲解过的InputData、Person、Operate、Menu几个类。需要增加文件操作类,专门负责保存和读取文件的内容,并修改Operate类,为其增加具体的操作,此程序的操作如图所示。范例:增加文件操作类实例操作实例操作-单人信息管理程序(单人信息管理程序(2)以上程序中的类的功能就是向程序中写入对象和读取对象,在操作时只需要传入一个路径即可。范例:修改Person类,增加setter和getter需要在增加、修改、删除、显示的地方编写具体的代码,但是在修改时应该先查询出来,显示已有的内容。范例:修改操作类范例:修改操作类本章要点1本章主要讲解了如图12-34中所列的操作类,在图中列出了各类间的继承关系。2在Java中使用File类表示文件本身,可以直接使用此类完成文件的各种操作,如创建、删除等。3RandomAccessFile类可以从指定的位置开始读取信息,但是要求文件中各个数据的保存长度必须固定。4输入/输出流主要分为字节流(OutputStream、InputStream)和字符流(Writer、Reader)两种,但是在传输中以字节流操作较多,字符流在操作时使用到缓冲区,而字节流没有使用到缓冲区。5字节或字符流都是以抽象类的形式定义的,根据其使用的子类不同,输入或输出的位置也不同。6在IO包中可以使用OutputStreamWriter和InputStreamReader完成字符流与字节流之间的转换操作。7使用ByteArrayInputStream和ByteArrayOutputStream类可以对内存进行输入/输出操作。8在线程之间进行输入/输出通信,主要使用PipedOutputStream和PipedInputStream类。9在IO中输出时最好使用打印流(PrintStream、PrintWriter),这样可以方便地输出各种类型的数据。10System类提供了3个支持IO操作的常量即out、err、in。System.out:对应显示器的标准输出。System.err:对应错误打印,一般此信息不希望被用户看到。System.in:对应标准的键盘输入。在程序操作中,根据setOut()方法可以修改System.out的输出位置,可以使用setErr()方法修改System.err的输出位置,也可以使用setIn()方法修改System.in的输入位置。11BufferedReader可以直接从缓冲区中读取数据。12使用Scanner类可以方便地进行输入流操作。13数据操作流提供了与平台无关的数据操作,主要使用DataOutputStream和DataInputStream类。14使用合并流(SequenceInputStream)可以将两个文件的内容进行合并。15如果数据量过大,则可以使用压缩流压缩数据,在Java中支持ZIP、JAR和GZIP3种压缩格式。16使用回退流可以将不需要的数据回退到数据缓冲区中以待重新读取。17造成字符乱码的根本原因就在于程序编码与本地编码的不统一。18对象序列化可以将内存中的对象转化为二进制数据,但对象所在的类必须实现Serializable接口,一个类中的属性如果使用transient关键字声明,则此属性的内容将不会被序列化。19对象的输入/输出主要使用ObjectInputStream和ObjectOutputStream两个类完成。

    注意事项

    本文(第十章IO流的其他知识点.ppt)为本站会员(hyn****60)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

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

    收起
    展开