Java语言程序设计(自考)课件 第七章 输入和输出流_第1页
Java语言程序设计(自考)课件 第七章 输入和输出流_第2页
Java语言程序设计(自考)课件 第七章 输入和输出流_第3页
Java语言程序设计(自考)课件 第七章 输入和输出流_第4页
Java语言程序设计(自考)课件 第七章 输入和输出流_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章Java语言的高级特性学习目标掌握数据流的基本概念和主要的操作方法,能够实现基本的输入输出功能掌握字节数据流的基本概念,包括文件数据流、过滤器数据流、缓冲数据流等,能够使用字节数据流的主要操作方法实现基本的输入输出功能。能够使用串接功能完成输入输出功能掌握字符流的基本概念,包括字符输入流和字符输出流。能够使用缓冲区输入输出方法实现基本的输入输出功能掌握文件操作的基本方法,熟悉对文件操作的File类和RandomAccessFile随机存取文件类。能够创建File对象,使用文件对话框打开和保存文件,能够编写文件输入和输出应用程序本章内容数据流的基本概念1基本字节数据流类2基本字符流3文件的处理4第一节数据流的基本概念数据流是指一组有顺序的、有起点和终点的字节集合,程序从键盘接收数据或向文件中写数据,都可以使用数据流来完成

流被组织成不同的层次用于字节传输(如二进制)用于字符传输

(如文本或ASCII)数据流分为输入数据流和输出数据流输入数据流只能读不能写输出数据流只能写不能读从数据流中读取数据时,必须有一个数据源与该数据流相连java.io包中提供了表示数据流的4个基本抽象类InputStream和OutputStreamReader和Writer要使用引入语句:importjava.io.*;输入数据流输入数据流(InputStream)是指只能读不能写的数据流,用于向计算机内输入信息而用java.io包中所有输入数据流都是由抽象类InputStream继承而来读取数据、标记位置、重置读写指针、获取数据量从数据流中读取数据时,必须有一个数据源与该数据流相连输入数据流中的主要数据操作方法以下3个方法提供了访问数据流中数据的方法,所读取的数据都默认为字节类型intread()从输入流中读取一个字节的二进制数据intread(byte[]b)将多个字节读到数组中,填满整个数组intread(byte[]b,intoff,intlen)从输入流中读取长度为len的数据,从数组b中下标为off的位置开始放置读入的数据,读毕返回读取的字节数read()方法将读取的一个字节作为低位,形成一个0~255之间的int类型的数值返回。它是一个抽象方法,需要在子类中具体实现输入数据流中的主要数据操作方法voidclose()关闭数据流,同时释放与该数据流相关的资源也可以由运行时系统自动关闭intavailable()返回目前可以从数据流中读取的字节数(实际的读操作所读得的字节数可能大于该返回值)longskip(longl)跳过数据流中指定数量的字节不读,返回值表示实际跳过的字节数输入数据流中的主要数据操作方法booleanmarkSupported()用于测试数据流是否支持回推操作,当一个数据流支持mark()和reset()方法时返回true,否则返回false。voidmark(intmarkarea)用于标记数据流的当前位置,并划出一个缓冲区,其大小至少为指定参数的大小。voidreset()将输入流重新定位到对此流最后调用mark方法时的位置输出数据流输出数据流是指只能写不能读的流,用于从计算机中输出数据java.io包中所有输出数据流大多是从抽象类OutputStream继承而来,并且实现了其中的所有方法,这些方法主要提供了关于数据输出方面的支持输出数据流中的主要数据操作方法voidwrite(inti)将字节i写入到数据流中,它只输出所读入参数的最低8位。该方法是抽象方法,需要在其输出流子类中加以实现,然后才能使用。voidwrite(byteb[])将数组b[]中的全部b.length个字节写入数据流。voidwrite(byteb[],intoff,intlen)将数组b[]中从下标off开始的len个字节写入数据流。元素b[off]是此操作写入的第一个字节,b[off+len-1]是此操作写入的最后一个字节输出数据流中的主要数据操作方法voidclose()当结束对输出数据流的操作时应该将其关闭。voidflush()刷新此输出流并强制写出所有缓冲的输出字节缓存技术为加快数据传输速度,提高数据输出效率,有时输出数据流会在提交数据之前把所要输出的数据先暂时保存在内存缓冲区中,然后成批进行输出,每次传输过程都以某特定数据长度为单位进行传输这种方式下,在数据的末尾一般都会有一部分数据由于数量不够一个批次,而存留在缓冲区里,调用方法flush()可以将这部分数据强制提交…缓冲区单位的容量末尾剩余部分第二节基本字节数据流类文件数据流包括FileImputStream和FileOutputStream,用来进行文件的I/O处理,其数据源都应当是文件

对本机上的文件进行操作,但是它们不支持方法mark()和reset()

在构造文件数据流时,可以直接给出文件名

FileInputStreamfis=newFileInputStream("myFile");

输入输出时处理异常示例使用文件数据流进行I/O操作时,对于类FileInputStream的实例对象,如果所指定的文件不存在,则产生FileNotFoundException异常,必须加以捕获或声明对于类FileOutputStream的实例对象,如果所指定的文件不存在,则系统创建一个新文件;如果存在,那么新写入的内容将会覆盖原有数据如果在读、写文件或生成新文件时发生错误,则会产生IOException异常,也需要由程序员捕获并处理程序7.1示例可以使用FileInputStream来读取FileOutputStream输出的数据程序7.2过滤器数据流过滤器数据流在创建时与一个已经存在的数据流相连,这样在从这样的数据流中读取数据时,它提供的是对一个原始输入数据流的内容进行了特定处理的数据缓冲区数据流数据输入流和数据输出流

缓冲区数据流BufferedInputStream和BufferedOutputStream

都属于过滤器数据流,都是在数据流上增加了一个缓冲区

读写数据时,数据以块为单位先进入缓冲区(块的大小可以进行设置),其后的读写操作则作用于缓冲区

降低了不同硬件设备之间速度的差异,提高了I/O操作的效率

提供了对mark()、reset()、skip()等方法的支持

创建该类实例对象的方法一使用默认缓冲区的大小

FileInputStreamfis=newFileInputStream("myFile");InputStreamis=newBufferedInputStream(fis);FileOutputStreamfos=newFileOutputStream("myFile");OutputStreamos=newBufferedOutputStream(fos);

创建该类实例对象的方法二自行设置缓冲区的大小FileInputStreamfis=newFileInputStream("myFile");InputStreamis=newBufferedInputStream(fis,1024);FileOutputStreamfos=newFileOutputStream("myFile");OutputStreamos=newBufferedOutputStream(fos,1024);关闭一个缓冲区输出流之前,应使用flush()方法,强制输出剩余数据,以确保缓冲区内的所有数据全部写入输出流

数据输入流和数据输出流DataInputStream和DataOutputStream允许通过数据流来读写Java基本数据类型布尔型(Boolean)浮点型(float)等等

数据流的创建方式DataInputStreamdis=newDataInputStream(is);DataOutputStreamdos=newDataOutputStream(os);DataInputStream类中的一些方法bytereadByte()longreadLong()doublereadDouble()booleanreadBoolean()StringreadUTF()intreadInt()floatreadFloat()shortreadShort()charreadChar()DataOutputStream类中的一些方法voidwriteByte(intaByte)voidwriteLong(longaLong)voidwriteDouble(doubleaDouble)voidwriteBoolean(booleanaBool)voidwriteUTF(StringaString)voidwriteInt(intanInt)voidwriteFloat(floataFloat)voidwriteShort(shortaShort)voidwriteChar(charaChar)对象流Java中的数据流不仅能对基本数据类型的数据进行操作,而且也提供了把对象写入文件数据流或从文件数据流中读出的功能通过java.io包中ObjectInputStream和ObjectOutputStream两个类实现能够输入输出对象的流称为对象流写对象数据流将一个java.util.Date对象实例写入文件

读对象数据流readObject()把数据流以Object类型返回,应该在转换为正确的类名之后再执行序列化的概念能够记录自己的状态以便将来得到复原的能力,叫对象的持久性(Persistence)称一个对象是可持久的,意味着可以把这个对象存入磁盘、磁带,或传入另一台机器保存在它的内存或磁盘中。也就是说把对象存为某种永久存储类型

序列化的概念对象通过数值来描述自己的状态,记录对象也就是记录下这些数值把对象转换为字节序列的过程称为对象的序列化把字节序列恢复为对象的过程称为对象的反序列化序列化的主要任务是写出对象实例变量的数值序列化序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。序列化是为了解决在对对象流进行读写操作时所引发的问题如果变量是另一个对象的引用,则引用的对象也要序列化。这个过程是递归的,保存的结果可以看作是一个对象网JDK1.1新增加了接口java.io.Serializable,并对Java虚拟机作了改动以支持将Java对象存为数据流的功能只有实现Serializable接口的类才能被序列化当一个类声明实现Serializable接口时,表明该类加入了对象序列化协议序列化示例示例程序7.3程序7.4对象结构表序列化只能保存对象的非静态成员变量,而不能保存任何成员方法和静态成员变量,并且保存的只是变量的值,对于变量的任何修饰符都不能保存,访问权限(public,protected,private)对于数据域的序列化没有影响有一些对象类不具有可持久性,因为其数据的特性决定了它会经常变化,其状态只是瞬时的,这样的对象是无法保存其状态的,如Thread对象或流对象。对于这样的成员变量,必须用transient关键字标明,否则编译器将报错。任何用transient关键字标明的成员变量,都不会被保存对象结构表当数据变量是一个对象时,该对象的数据成员也可以被持久化。对象的数据结构或结构树,包括其子对象树在内,构成了这个对象的结构表如果一个对象结构表中包含了一个对不可持久化对象的引用,而这个引用已用关键字transient加以标记,则这个对象仍可以被持久化示例整个对象的序列化publicclassMyClassimplementsSerializable{publictransientThreadmyThread;privateStringcustomerID;privateinttotal;}数据不被序列化publicclassMyClassimplementsSerializable{publictransientThreadmyThread;privatetransientStringcustomerID;privateinttotal;}第三节基本字符流从JDK1.1开始,java.io包中加入了专门用于字符流处理的类,它们是以Reader和Writer为基础派生的一系列类Reader和Writer也是抽象类,只提供了一系列用于字符流处理的接口它们的方法与类InputStream和OutputStream类似,只不过其中的参数换成字符或字符数组字符输入流和字符输出流字符输入流(Readers)和字符输出流(Writers)提供对不同平台之间数据流数据进行转换的功能同其他程序设计语言使用ASCII字符集不同,Java使用Unicode来表示字符串和字符ASCII字符集是以一个字节(8bit)来表示一个字符,所以可以认为一个字符就是一个字节(byte)Unicode是一种大字符集,要用两个字节(16bit)来表示一个字符

为实现与其他程序语言及不同平台的交互,Java提供一种新的数据流处理方案,称作字符输入流(Reader)和字符输出流(Writer)像数据流一样,在java.io包中有许多不同类对其进行支持,其中最重要的是InputStreamReader和OutputStreamWriter这两个类是字节流和字符输入流、字符输出流的接口,用来在字节流和字符流之间作为中介使用这两个类进行字符处理时,在构造方法中应指定一定的平台规范,以便把以字节方式表示的流转换为特定平台上的字符表示构造方法InputStreamReader(InputStreamin)默认规范InputStreamReader(InputStreamin,Stringenc)指定规范encOutputStreamWriter(OutputStreamout)默认规范OutputStreamWriter(OutputStreamout,Stringenc)指定规范enc字符输入流提供的方法voidclose()voidmark(intreadAheadLimit)booleanmarkSupported()intread()intread(char[]cbuf)intread(char[]cbuf,intoff,intlen)booleanready()voidreset()longskip(longn)字符输出流提供的方法voidclose()voidflush()voidwrite(char[]cbuf)voidwrite(char[]cbuf,intoff,intlen)voidwrite(intc)voidwrite(Stringstr)voidwrite(Stringstr,intoff,intlen)缓冲区字符输入流和缓冲区字符输出流如果格式转换以较大数据块为单位进行,那么会提高效率java.io中提供了缓冲流BufferedReader和BufferedWriter其构造方法与BufferedInputStream和BufferedOutputStream相类似除了read()和write()方法外,它还提供了整行字符处理方法publicStringreadLine()BufferedReader的方法,从输入流中读取一行字符,行结束标志为‘\n’、‘\r’或两者一起publicvoidnewLine()BufferedWriter的方法,向输出流中写入一个行结束标志把BufferedReader或BufferedWriter正确连接到InputStreamReader或OutputStreamWriter的末尾是一个很好的方法要在BufferedWriter中使用flush()方法,以强制清空缓冲区中的剩余内容,防止遗漏程序7.5程序7.6示例辅助类程序7.7程序7.8第四节文件的处理Java提供了File类,用于处理与文件相关的操作File对象可以用来生成与文件(及其所在的路径)或目录结构相关的对象使用File类可以达到与系统无关的目的,使用的是抽象的路径表示法类java.io.File提供了获得文件基本信息及操作文件的一些方法File类创建一个新的File对象可以使用以下3种构造方法第1种方法FilemyFile;myFile=newFile("mymotd");第2种方法myFile=newFile("/","mymotd");第3种方法FilemyDir=newFile("/");myFile=newFile(myDir,"mymotd");与文件名相关的方法StringgetName()获取文件名StringgetPath()获取文件路径StringgetAbsolutePath()获取文件绝对路径StringgetParent()获取文件父目录名称booleanrenameTo(FilenewName)更改文件名,成功则返回true,否则返回false文件测定方法booleanexists()文件对象是否存在booleancanWrite()文件对象是否可写booleancanRead

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论