第八章JAVA文件和输入输出流_第1页
第八章JAVA文件和输入输出流_第2页
第八章JAVA文件和输入输出流_第3页
第八章JAVA文件和输入输出流_第4页
第八章JAVA文件和输入输出流_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

第8章输入输出流I/O一、输入输出流I/O是计算机的最基本操作。比如从键盘输入数据、从文件中读取数据或向文件中写数据、通过网络上传或下载数据等。Java类库的设计者是通过创建大量的类来解决这个难题的。在java中有关流的操作使用io包importjava.io.*;在JDK1.4中,添加了nio类,用于改进性能及功能。我们需要学习相当数量的类。另外,很有必要理解I/O类库的演化过程,本章就介绍Java标准类库中各种各样的类以及它们的用法。流式I/O“流(stream)”是个抽象概念,它代表任何有能力产出数据的数据源对象或者是有能力接收数据的接收端对象。就流的运行方向来说,有两种基本的流是:输入流(InputStream)和输出流(OutputStream)。可从中读出一系列字节的对象称为输入流。而能向其中写入一系列字节的对象称为输出流。按处理数据的类型不同,流的分类流字节流字符流字符流适用于16位的字符文件每次读写16位字符效率较高字节流适用于各类文件每次读写8位字节效率较低Java.io中的四个类:以字节为对象:

输入流:InputStream

输出流:OutputStream以字符为对象:输入流:Reader

输出流:Writer文件处理:File类在学习那些真正用于在流中读写数据的类之前,让我们先看看一个实用工具,它提供了一个用于帮助我们处理文件目录事务的类库。File(文件)类。它既能代表一个特定文件的名称又能代表一个目录下的文件集合的名称。如果它指的是一个文件集,我们就可以对此集合调用list()方法,这个方法会返回一个字符数组。实际上,“文件路径”对这个类来说是个更好的名字。(1)目录的检查及创建

文件类不仅仅只表示存在的文件或目录。我们也可以用文件对象来创建新的目录或不存在的整个目录路径。我们还可以查看文件的特性(如:大小,最后修改日期,读/写),来检查某个文件对象代表的是一个文件还是一个目录,并可以删除这个文件。(2)目录列表器假设我们想查看一个目录列表,可以用两种方法列出文件对象。(1)如果我们调用不带参数的list()方法,便可以获得此文件对象包含的全部列表。(2)然而,如果我们想获得一个受限列表——例如,想得到所有扩展名为.java的文件——那么我们就要用到“目录过滤器”,这个类会告诉我们怎样显示符合条件的文件对象。可以在JDK文档里的类层次结构中查看到。通过继承,任何Inputstream或Reader衍生而来的类都含有名为read()的基本方法,用于读取单个字节或者字节数组。同样地,任何自OutputStream或Writer衍生而来的类都含有名为write()的基本方法,用于写单个字节或者字节数组。InputStream三个基本的读方法abstractintread():读取一个字节数据,并返回读到的数据,如果返回-1,表示读到了输入流的末尾。intread(byte[]

b):将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。intread(byte[]

b,int

off,int

len):将数据读入一个字节数组,同时返回实际读取的字节数。如果返回-1,表示读到了输入流的末尾。off指定在数组b中存放数据的起始偏移位置;len指定读取的最大字节数。其它方法longskip(long

n):在输入流中跳过n个字节,并返回实际跳过的字节数。voidclose():关闭输入流,释放和这个流相关的系统资源。voidmark(int

readlimit):在输入流的当前位置放置一个标记,如果读取的字节数多于readlimit设置的值,则流忽略这个标记。voidreset():返回到上一个标记。

java.io包中InputStream的类层次InputStreamFileInputStreamByteArrayInputStreamFilterInputStreamObjectInputStreamPipedInputStreamDataInputStreamBufferedInputStreamOutputStream三个基本的写方法abstractvoidwrite(int

b):往输出流中写入一个字节。voidwrite(byte[]

b):往输出流中写入数组b中的所有字节。voidwrite(byte[]

b,int

off,int

len):往输出流中写入数组b中从偏移量off开始的len个字节的数据。其它方法

voidflush():刷新输出流,强制缓冲区中的输出字节被写出。

voidclose():关闭输出流,释放和这个流相关的系统资源。java.io包中OutputStream的类层次OutputStreamFileOutputStreamByteArrayOutputStreamFilterOutputStreamObjectOutputStreamPipedOutputStreamDataOutputStreamBufferedOutputStream文件流FileInputStream(字节文件输入流)FileOutputStream字节文件输出流)

节点流,用于从文件中读取或往文件中写入字节流。二进制文件的处理文件对象的建立Filefp=newFile(“file1.dat”);FileInputStream类:可以用它来从文件中读取字节。FileOutputStream类:创建一个可用来将字节写入文件的输出流。FileInputStream类的常用方法:read():从流中读入数据close():关闭流FileOutputStream类的常用方法:write(byteb[],intoff,intlen):在数组b中,从off开始,写入len个字节的数据。缓冲字节流:

BufferedInputStream和BufferedOutputStream

过滤流,需要使用已经存在的节点流来构造,提供带缓冲的读写,提高了读写的效率。DataInputStream(数据输入流)DataOutputStream(数据输出流)过滤流,需要使用已经存在的节点流来构造,提供了读写Java中的基本数据类型的功能。PipedInputStream和PipedOutputStream

管道流,用于线程间的通信。一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。要使管道流有用,必须同时构造管道输入流和管道输出流。JavaI/O库的设计原则Java的I/O库提供了一个称做链接的机制,可以将一个流与另一个流首尾相接,形成一个流管道的链接。通过流的链接,可以动态的增加流的功能,而这种功能的增加是通过组合一些流的基本功能而动态获取的。I/O流的链接FileInputStreamBufferedInputStreamDataInputStream数据DataOutputStreamBufferedOutputStreamFileOutputStream数据从文件中获取输入字节增加了缓冲的功能增加了读取Java基本数据类型的功能InputStreamChainOutputStreamChain可以往输出流中写入Java基本数据类型提供数据写入到缓冲区的功能将数据写入到文件中Reader和WriterJava程序语言使用Unicode来表示字符串和字符。Reader和Writer这两个抽象类主要用来读写字符流。字节流不能直接操作Unicode字符,所以Java提供了字符流。由于汉字在文件中占两个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象,因为,在Unicode字符中,一个汉字被看作一个字符。java.io包中Reader的类层次ReaderBufferedReaderCharArrayReaderFilterReaderPipedReaderStringReaderFileReaderLineNumberReaderPushbackReaderInputStreamReaderjava.io包中Writer的类层次WriterBufferedWriterCharArrayWriterFilterWriterPipedWriterPrintWriterFileWriterOutputStreamWriterStringWriter操作字符文件的类FileReader读取文件;FileWriter写入文件;BufferedReader输入到缓冲区。BufferedWriter

输出到缓冲区。字符流的读写操作方法从输入流中按行读取字符的方法:

StringreadLine();向输出流写入多个字符的方法:

write(String

s,int

off,int

len);将指定的字符串s从偏移量off开始的len个字符写入文件输出流。标准I/O重定向

Java的System类提供一些简单的静态方法调用,允许我们对标准输入、输出和错误I/O流进行重定向:setIn(InputStream):将标准输入重定向到InputStream的对象。setOut(PrintStream)setErr(PrintStream)如果我们突然开始在显示器上创建大量输出,而这些输出滚动的如此之快以至于无法阅读时,重定向输出就显得极为有用。对于“我们想重复测试特定用户的输入序列”的命令行程序来说,重定向输入就很有价值。下例简单演示了这些方法的使用:这个程序将标准输入附加在文件上,并将标准输出和标准错误重定向到另一个文件。I/O重定向操纵的是字节流,而不是字符流,因此我们使用的是InputStream和OutputStream而不是Reader和Writer。随机存取文件流RandomAccessFile前面学习的文件流都是按顺序访问的,文件操作中经常要用到随机访问。随机存取文件流RandomAccessFile类可以读写文件中任意位置上的字节、文本等数据。RandomAccessFile并不是InputStream、OutputStream、Reader或Writer的子类,因为它既可以输入,又可以输出,并且既可以操作字符,又可以操作字节。该类的构造器有一个参数,用来声明所构建的流是用于输入还是用于输出,或者既用于输入,又用于输出。随机存取文件流RandomAccessFileRandomAccessFile类同时实现了DataInput和DataOutput接口,提供了对文件随机存取的功能,利用这个类可以在文件的任何位置读取或写入数据。读取和写入集中到一个类中。RandomAccessFile类提供了一个文件指针,用来标志要进行读写操作的下一数据的位置。Seek(longa):用来定位流的读写位置,其中参数a确定读写位置距离文件开头的字节个数。getFilePointer()获取流的当前位置。RandomAccessFile流对文件的读写比顺序读写更为灵活。对象序列化将对象转换为字节流保存起来,并在日后还原这个对象,这种机制叫做对象序列化。对象序列化就是把一个对象的状态记录下来。一个对象要想能够实现序列化,必须实现Serializable接口。对象流ObjectInputStream类创建的对象被称为对象输入流ObjectOutputStream类创建的对象被称为对象输出流ObjectInputStream类和ObjectOutputStream类分别是InputStream类和OutputStream类的子类。对象输出流使用writeObject(Objectobj)方法将一个对象obj写入输出流送往目的地对象输入流使用readObject()方法从源中读取一个对象到程序中。当使用对象流写入或读入对象时,要保证对象是序列化的。这是为了保证能把对象写入到文件,并能再把对象正确读回到程序中的缘故。一个类如果实现了Serializable接口,那么这个类创建的对象就是所谓序列化的对象。Serializable接口中的方法对程序是不可见的,因此,实现该接口的类不需要实现额外的方法,当把一个序列化的对象写入到对象输出流时,JVM就会实现Serializable接口中的方法,将一定格式的文本------对象的序列化信息,写入到目的地。在Sun公司的jdk自带的rt.jar包文件中,有AudioStream.class、AudioPlayer.class类用于播放声音文件,我们可以使用输入流:

FileInputStreamfile=newFileInputStream("声音文件.wav"); AudioStreamaudio=newAudioStream(file);使用AudioPlayer类的start()进行播放:

AudioPl

温馨提示

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

评论

0/150

提交评论