欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    Java基础系列-IO.ppt

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

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

    Java基础系列-IO.ppt

    Java 基础系列IO,一、文件和目录,File类概述File类构造器File类的常用方法,1、File类概述,File类的对象是文件系统中的一个目录或文件的抽象表示。File类对象描述文件路径、名字、长度、可否读写等属性,可用来命名文件、查询文件属性、对目录进行操作,但不读写文件。读写文件内容分别是由FileInputStream和FileOutputStream类实现的。通过File类对象可以对操作系统的文件进行管理,体现了跨平台不同文件的统一管理,2、File类构造器,File有三个重载的构造方法:1)、File(String path)2)、File(String path,String name)3)、File(File dir,String name),2、File类构造器File(String path),Path可以是文件的完整路径名,也可只有路径而无文件名;路经可以是绝对路径,也可以是相对路径;路径或文件名可以是已存在的也可是新的,新的则被创建,旧的则被刷新。例1:File file1=newFile(“f:javaaaa”);在已存在的f:java目录下新创建一个aaa目录,使用的是绝对路径,且只能创建一层新目录。例2:File file2=new File(“bbb”);在当前工作目录下,创建bbb新目录的文件对象,使用的是相对路径例3:File file3=new File(“f:javafile1.txt”);使用绝对路径,在已存在的f:java目录下创建一个文本文件对象。,2、File类构造器File(String path,String name),Path:已存在的文件路径,Name:可以是路径或文件名,可以是新的或原有的。例4:File file4=new File(“f:java”,”aaa”);与例1效果相同例5:File file5=new File(“f:java”,“file1.txt”);与例3效果相同,2、File类构造器File(File dir,String name),dir:为文件对象,由该对象指定路径,称抽象路径 name:文件名或目录名例6:File file1=new File(“f:javaaaa”);File file6=new File(file1,”myfile.txt”);,3、File类的常用方法,示例,二、Java IO库,概述Java I/O库设计原则输入流、输出流字节流、字符流流处理器(原始流处理器、装饰流处理器)IO类的继承结构流的适配,1、Java IO概述,通常程序需要从外部获取/输出信息这个“外部”范围很广,包括诸如键盘、显示器、文件、磁盘、网络、另外一个程序等“信息”也可以是任何类型的,例如一个对象、串字符、图像、声音等Java把不同类型的输入/输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。所谓流,就是数据的有序排列。而流可以是从某个源(称为流源,Source of Stream)出来,到某个目的地(称为流汇,Sink of Stream)。Java中负责I/O的类(称为流类)统一存放在java.io包中。该包又叫做I/O库,1、Java IO概述读写数据的方法,不论数据从哪来,到哪去,也不论数据本身是何类型,读写数据的方法大体上都是一样的:,1、Java IO概述流的分类,输入/输出流可以从以下几个方面进行分类从流的方向划分输入流输出流从流的分工划分节点流(原始流)处理流(链接流)从流的内容划分面向字符的流面向字节的流,2、Java I/O库的设计原则,两个对称性:输入输出对称:InputStream和OutputStream提供了面向字节的I/O功能;Reader和Writer提供了面向字符的I/O功能。bytechar对称:InputStream与Reader的子类分别负责byte和char流的输入;OutputStream和Writer的子类分别负责byte和char流的输出。两个设计模式:装饰模式:有些流处理器可以对另一些流处理器起到装饰作用,形成新的具有改善了功能的流处理器。接口不改变,但增加功能。适配器模式:有些流处理器是对其他类型的流源的适配。接口改变,但不增加功能。,两种流原始流:原始流处理器接收一个Byte数组对象、String对象或文件对象,并声称一个InputSteam类型的流对象例如:ByteArrayInputStream,FileInputStream,PipedInputStream,StringBufferInputStream。链接流(装饰流):可以接收另一个(同种类)流对象作为流源,并对其进行功能扩展。同样类型的流用做链接流类的流源。例如:FilterInputStream下的BufferedInputStream,DataInputStream,LineNumberInputStream,PushbackInputStream。ObjectInputStream和SequenceInputStream,2、Java I/O库的设计原则,3、字节流与字符流,按处理数据的单位划分,Java支持两种基本的流类型:字节流类:以字节(byte)为流动单位 基类 InputStream/OutputSream字符流类:以16位字符(Unicode)为流动单位 基类 Reader/Writer,说明:以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,只是在操作时的导向不同。如 CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。,3、字节流与字符流,4、流处理器流的处理过程,用来处理流的流类又称为流处理器,一个流处理器就像一个流的管道一样,从一个流源吸入某种类型的数据,并输出某种类型的数据。例如,一个java程序可以使用FileInputStream类直接从一个文件中读取数据,如下图所示:像FileInputStream这样的流类叫做流处理器。,4、流处理器流的处理过程,类似地,也可以用FileOutputStream类直接向一个文件中写出数据,如下图所示:在实际应用当中,这种简单的机制并没有太大的用处。因为程序需要写出的往往是非常结构化的信息,比如数值、文字、源代码等。这样一来,数据的转换工作将十分复杂,4、流处理器流的处理过程,Java的I/O库提供了一个称作链接(Chaining)的机制,可以将一个流处理器与另一个流处理器首尾相接,以其中之一的输出为输入,形成一个流管道的链接例如:DataInputStream流处理器可以把FileInputStream流对象的输出当作输入,将byte类型的数据转换成java的基本数据类型和String类型的数据,如下图所示:,4、流处理器流的处理过程,类似地,向一个文件写入byte类型的数据不是一个简单的过程:一个程序需要向一个文件里面写入的数据往往是结构化的,而不是byte类型的,因此在利用FileOutputStream写的时候必须首先经过转换。DataOutputStream流处理器提供了直接接收基本数据类型和String类型的方法,而这个流处理器的输出数据则是byte类型。这样一来,可以将DataOutputStream和FileOutputStream链接起来,达到直接将结构化的数据写入到文件中的目的。,4、流处理器分类,流处理器所处理的流必定都有流源。流源分成两大类:数组、String、File等,叫原始流源用于链接流类的流源,叫链接流源Java 语言的I/O库是对各种常见的流源、流汇、以及处理过程的抽象化Java 语言的I/O库是由一些基本的原始流处理器和围绕它们的装饰流处理器所组成的,5、IO类的继承结构,字节输入流字节输出流字符输入流字符输出流,字节输入流基类InputStream,类声明:public abstract class InputStream extends Object implements Closeable三个基本的read方法:abstract int read()/这里的read方法是为了更复杂的类可以利用它们,以便提供一个更有用的接口int read(byte b)/从输入流中读取字节数据保存到数组b中int read(byte b,int offset,int length)其它方法:void close()/关闭输入流并释放与之相关的所有系统资源int available()/返回输入流中可以读的字节数long skip(long n)/从输入流中跳过n个字节boolean markSupported()/测试输入流是否支持mark,reset方法void mark(int readlimit)/在输入流中标记当前位置void reset()/重新配置输入流,字节输入流继承结构,InputStream有7个直接子类,有4个属于FilterInputStream的子类,字节输入流继承结构,原始流处理器:接收一个byte数组对象、String对象、FileDescriptor对象等原始流源对象,并生成一个InputStream类型的流对象。共有4个:ByteArrayInputStream:为多线程的通信提供缓冲区操作功能,接收一个byte数组作为流源FileInputStream:建立一个与文件有关的输入流,接收一个File对象作为流源PipedInputStream:与PipedOutputStream配合使用,接收一个PipedOutputStream对象作为流源StringBufferInputStream:将一个字符串缓冲区转换成一个输入流,接收一个String对象作为流源,字节输入流继承结构,链接流处理器:就是可以接收另一个流对象作为流源,并对之进行功能扩展的流类InputStream类型的链接流处理器包括以下7个,都接收另一个InputStream对象作为流源FilterInputStream:过滤输入流,它将另一个输入流作为流源。它有4个子类:BufferedInputStream:用来从硬盘将数据读入到一个内存缓冲区中,并从该缓冲区提供数据DataInputStream:提供基于多字节的读取方法,可以读取基本数据类型的数据LineNumberInputStream:提供带有行计数功能的过滤输入流PushbackInputStream:提供特殊功能,可以将已经读取的字节“推回”到输入流中ObjectInputStream:可以将使用ObjectOutputStream串行化的基本数据类型和对象重新并行化SequenceInputStream:可将两个已有的输入流连接起来形成一个输入流,字节输入流继承结构,原始流处理器可以被链接流处理器所装饰:一方面,链接流对象接收一个原始流对象或者另一个链接流对象作为流源(表现形式上就是把它们作为链接流类构造函数的参数);另一方面,它们都对流源对象的内部工作方法做了相应的改变。比如:BufferedInputStream:装饰了InputStream的内部工作方式,使得流的读入操作使用缓冲机制(即不会对每一次的流读入操作都产生一个物理的读盘动作)LineNumberInputStream和PushbackInputStream:使得流的读入操作带有行计数功能或者可以将已经读取的字节“推回”到输入流中。它们在实际工作中很少用到,它们是为了支持用java语言制作编译器而准备的。DataInputStream:可以读取各种不同的基本数据类型以及String类型的数据,这一点可以从它所提供的各个read方法可以看出来。使用这个流处理器以及它的搭档DataOutputStream,可以将原始数据从一个地方通过流移到另一个地方,字节输出流基类OutputStream,类声明:public abstract class OutputStream extends Object implements Closeable,Flushable三个基本的write方法:abstract void write(int c)/这里的write方法是为了更复杂的类可以利用它们,以便提供一个更有用的接口void write(byte b)/将数组b中的数据写入到输出流中void write(byte b,int offset,int length)其它方法void close()/关闭输出流并释放与之相关的所有系统资源void flush()/刷新流内部的缓冲区,以强制将数据真正写入目标,字节输出流继承结构,OutputStream有5个直接子类,有3个属于FilterOutputStream的子类,字节输出流继承结构,原始流处理器ByteArrayOutputStream:输出流的汇集是一个byte数组FileOutputStream:输出流的汇集是一个文件对象PipedOutputStream:用于向一个数据管道输出数据,字节输出流继承结构,链接流处理器:FilterOutputStream:过滤输出流,它将另一个输出流作为流汇。其子类有:BufferedOutputStream:向一个内存缓冲区中写出数据,并将此中的数据输出到硬盘中DataOutputStream:可以写出基本数据类型的数据PrintStream:用于产生格式化输出ObjectOutputStream:将基本数据类型和对象串行化与DataInputStream相对应的是DataOutputStream。后者负责将由基本数据类型和String对象组成的数据格式化,并输出到一个流中,使得任何机器上的任何DataInputStream类型的对象都可以读入这些数据。所有的写方法都以write开始,比如writeByte()等,字节输出流继承结构,如果需要对数据做真正的格式化,以便输出到像控制台显示那样,就要用PrintStream。PrintStream可以对基本数据类型和String对象组成的数据进行格式化,以形成可阅读的格式。System.out就是一个静态的PrintStream对象。PrintStream对象最重要的两个方法是print()和println()BufferedOutputStream:对一个输出流进行装饰,使得流的写出操作使用缓冲操作,提高程序效率。在涉及到物理流的地方,比如控制台I/O、文件I/O等,都应当使用这个装饰流处理器,字符输入流基类Reader,类声明:public abstract class Reader extends Object implements Readable,Closeable三个基本的read方法:int read()/读取单个字符int read(char cbuf)/读取字符到字符数组cbuf中int read(CharBuffertarget)abstract int read(char cbuf,int offset,int length)/这里的read方法是为了更复杂的类可以利用它们,以便提供一个更有用的接口 其它方法void close()boolean ready()/测试流是否准备好被读取skip(long n)boolean markSupported()void mark(int readAheadLimit)void reset(),字符输入流等级结构,Reader有6个直接子类:,字符输入流 继承结构,原始流处理器:CharArrayReader:为多线程通信提供缓冲区操作功能InputStreamReader:有一个子类FileReaderPipedReader:与PipedInputStream配合使用,用于读入一个数据管道里的数据StringReader:建立一个与文件有关的输入流链接流处理器:BufferedReader:从硬盘将数据读入到一个内存缓冲区,并从该缓冲区提供数据FilterReader:它将另一个输入流作为流源,字符输出流基类Writer,类声明:public abstract class Writerextends Object implements Appendable,Closeable,Flushable三个基本的write方法:void write(int c)void write(char cbuf)abstract void write(char cbuf,int offset,int length)/这里的write方法是为了更复杂的类可以利用它们,以便提供一个更有用的接口。void write(String string)void write(String string,int offset,int length)其它方法abstract void close()abstract void flush(),字符输出流 继承结构,Writer有7个直接子类,字符输出流 继承结构,原始流处理器:CharArrayWriter:为多线程通信提供缓冲区操作功能OutputStreamWriter:建立一个与文件有关的输出流PipedWriter:与PipedOutputStream配合使用StringWriter:向一个StringBuffer写出数据链接流处理器:BufferedWriter:为Writer类型的流处理器提供缓冲区功能FilterWriter:没有子类的抽象类,将另一个输出流作为流源PrintWriter:支持格式化的文字输出,6、流的适配 byte流到char流,InputStreamReader是从byte流到char流的一个桥梁,它读入byte数据并根据指定的编码将之翻译成为char数据当把InputStreamReader与任何InputStream的具体子类链接时,可以从InputStream的输出读入byte类型的数据,将之转换成char类型的数据,6、流的适配 byte流到char流,类似地,当与任何一个OutputStream的具体子类链接时,OutputStreamWriter可以将char类型的数据转换成为byte类型的数据,再交给输出流,四、常见流介绍,File I/O数据输入/输出流压缩文件流对象序列化,1、File I/O,文件对象的建立File fp=new File(“tempfile.txt”);文件流的建立FileInputStream in=new FileInputStream(fp);FileOutputStream out=new FileOutputStream(fp);其中,输入流的参数是用于输入的文件名,输出流的参数是用于输出的文件名。,1、File I/O示例,1、File I/O性能优化,增加缓冲区流,减少访问硬盘的次数,提高效率,1、File I/O性能优化,缓冲区流:BufferedInputStream和 BufferedOutputStream将它们与文件流相接FileInputStream in=new FileInputStream(“file1.txt”);BufferedInputStream bin=new BufferedInputStream(in,256)只有缓冲区满时,才会将数据送到输出流.Java在输出数据流中,当对方尚未将数据取走时,程序就会被阻塞.有时要人为地将尚未填满的缓冲区中的数据送出,使用flush()方法.,2、数据输入输出流,什么时候需要数据输入输出流?文件流和缓冲区流的处理对象是字节或字节数组,利用数据输入输出流可以实现对文件的不同数据类型的读写.DataInputStream、DataOutputStream一种较为高级的数据输入输出方式,包含以下功能:除了字节和字节数组,还可以处理int,float,boolean等类型;用readLine方法读取一行信息。,2、数据输入输出流,数据流的建立FileOutputStream fos=new FileOutputStream(”file2.txt);DataInputStream dis=new DataInputStream(fos)数据输出流可以是一个已经建立好的输入数据流对象,例如网络的连结,文件等.,3、处理压缩文件压缩流类,包中提供了一些类,使我们可以以压缩格式对流进行读写它们都继承自字节流类OutputStream和InputStream其中GZIPOutputStream和ZipOutputStream可分别把数据压缩成GZIP格式和Zip格式GZIPInputStream和ZipInputStream可以分别把压缩成GZIP格式或Zip的数据解压缩恢复原状,3、处理压缩文件简单的GZIP压缩格式,GZIPOutputStream父类是DeflaterOutputStream 可以把数据压缩成GZIP格式GZIPInputStream父类是 InflaterInputStream 可以把压缩成GZIP格式的数据解压缩,示例,首先文本文件“Hello.txt”压缩为文件“test.gz”,再解压该文件,显示其中内容,并另存为“newHello.txt”,3、处理压缩文件运用ZIP压缩多个文件,Zip文件可能含有多个文件,所以有多个入口(Entry)每个入口用一个ZipEntity对象表示,该对象的getName()方法返回文件的最初名称ZipOutputStream父类是DeflaterOutputStream可以把数据压缩成ZIP格式ZipInputStream父类是InflaterInputStream可以把压缩成ZIP格式的数据解压缩,示例,1、从命令行输入若干个文件名,将所有文件压缩为“c:/test.zip”,再从此压缩文件中解压并显示,2、用来将指定zip文件解压到指定路径下,4、对象序列化,什么是对象序列化(object serialization):对象串行化面向那些实现了Serializable接口的对象,允许你以串行字节序列形式保存对象的状态,日后还可以将其完全恢复到对象的初始状态恢复一个串行化后的对象称为解串行化(deserialization)为什么要串行化呢?串行化机制使Java语言得以支持两个重要功能Java的远程方法调用(Remote Method Invocation,RMI):允许你“通过本地机器上的对象运用方式,使用其它机器上的对象”保持数据对象实例变量的数值和当时的运行环境,可不受对象生命周期的限制,供其它类、其它时间共享。,序列化接口Seriealizable接口,空接口,使类的对象可实现序列化Serializable 接口的定义package java.io;public interface Serializable/theres nothing in here!;实现Serializable接口的语句public class MyClass implements Serializable.,序列化接口Externalizable 接口,实现该接口可以控制对象的读写API中的说明为public interface Externalizable extends Serializable其中有两个方法writeExternal()和readExternal(),因此实现该接口的类必须实现这两个方法ObjectOutputStream的writeObject()方法只写入对象的标识,然后调用对象所属类的writeExternal()ObjectInputStream的readObject()方法调用对象所属类的readExternal(),4、对象序列化注意事项,串行化能保存的元素 只能保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。transient关键字 对于某些类型的对象,其状态是瞬时的,这样的对象是无法保存其状态的,例如一个Thread对象,或一个FileInputStream对象,对于这些字段,我们必须用transient关键字标明。定制串行化 缺省的串行化机制,对象串行化首先写入类数据和类字段的信息,然后按照名称的上升排列顺序写入其数值。如果想自己明确地控制这些数值的写入顺序和写入种类,必须定义自己的读取数据流的方式。就是在类的定义中重写接口serializeble的writeObject()和readObject()方法。例如可在上例子中,加入重写的writeObject()和readObject()方法,对Student 类定制其串行化。,4、对象序列化实现,怎样实现对象串行化呢?首先,判断对象是否可以串行化(serializable)类必须实现了 接口Serializable 接口仅仅是一个标记,没有任何的成员变量和方法从没有实现Serializable(or Externalizable)接口的类实例化来的对象是不能被串行化的创建某些OutputStream对象,然后将其封装到ObjectOutputStream对象内。此时,只需调用writeObject()即可完成对象的序列化,并将其发送给OutputStream相反的过程是:将一个InputStream封装到ObjectInputStream内,然后调用readObject()。我们最后获得的是一个Object对象,必须做向下类型转换,示例:写数据,示例:读数据,示例:序列化自定义对象,示例:序列化自定义对象,示例:序列化自定义对象,三、补充,标准输入/输出中文信息读写随机文件读写,1、标准输入/输出,在java 中:“标准输入”是System.in对象,“标准输出”是System.out 对象,“标准错误输出”是System.err对象。每当main方法被执行时,就自动生成上述三个对象System.out和System.err已预封装成一个PrintStream对象,能直接使用。System.in是一个原始的InputStream,未进行任何封装处理,必须事先封装System.in,否则不能从中读取数据。例如:我们希望用readLine()每次从标准输入中读取一行输入信息,然后显示出来,就需要将System.in封装到一个DataInputStream或者BufferedReader中。,1、标准输入/输出示例,1、标准输入/输出重定向标准I/O,标准I/O重新导向:setIn(InputStream):设置标准输入流setOut(PrintStream):设置标准输出流setErr(PrintStream):设置标准错误输出流如果突然要在屏幕上生成大量输出,而且滚动的速度快于人们的阅读速度,输出的重定向就显得特别有用。在一个命令行程序中,如果想重复测试一个特定的用户输入序列,输入的重定向也显得特别有价值。,2、中文信息读写,InputStream/OutputStream是处理8位的流,Reader/Writer是处理16位的流。Java中,byte是8位的,char是16位的,中文需要用Reader/Writer读写。但很多时候需要把两种库类结合起来用例如:英文dos窗口的字符集是ISO-Latin-1,如果要从英文dos窗口读入中文输入,就需要把System.in适配到Reader:InputStreamReader isr=new InputStreamReader(System.in);isr.readxxx(.);,3、随机文件读写,随机文件读写对于很多场合,例如银行系统、实时销售系统,要求能够迅速、直接地访问文件中的特定信息,而无需查找其他的记录。这种类型的即时访问可能要用到随机存取文件和数据库随机文件的应用程序必须指定文件的格式。最简单的是要求文件中的所有记录均保持相同的固定长度。利用固定长度的记录,程序可以容易地计算出任何一条记录相对于文件头的确切位置随机访问文件允许对文件的内容进行非顺序的访问(non-sequential(random)read-write access),可以直接跳到文件中指定的位置,3、随机文件读写随机访问示意图,随机访问示意图,3、随机文件读写RandomAccessFile,Java.io包提供了RandomAccessFile类用于随机文件的创建和访问RandomAccessFile的功能:可跳转到文件的任意位置读/写数据可在随机文件中插入数据,而不破坏该文件的其他数据有个位置指示器,指向当前读写处的位置。在等长记录格式文件的随机读取时有很大的优势,但仅限于操作文件,不能访问其它IO设备,如网络、内存映像等,3、随机文件读写RandomAccessFile,文件指针(file pointer)刚打开文件时,文件指示器指向文件的开头处。常用方法:getFilePointer():得到当前的文件指针seek(long):移动文件指针到指定的位置。skipBytes(int n):把文件指针向前移动指定的n个字节,3、随机文件读写RandomAccessFile,构造方法包括public RandomAccessFile(File file,String mode)throws FileNotFoundExceptionpublic RandomAccessFile(String name,String mode)throws FileNotFoundExceptionMode指定了操作模式,是随机读(r),还是读写兼施(rw)。,3、随机文件读写RandomAccessFile主要方法,RandomAccessFile(Filefile,Stringmode)RandomAccessFile(Stringname,Stringmode)r 只读 Rw 读写public void seek(longpos)throws IOException设置文件指针指向的位置,从文件开始的位置起,3、随机文件读写示例:,

    注意事项

    本文(Java基础系列-IO.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

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




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开