java08(第8章输入输出流).ppt
Java语言程序设计清华大学出版社第第8章输入输出流章输入输出流第第8章章主要内容主要内容1、输入输出流、输入输出流2、文件处理、文件处理3、随机存取文件和本地可、随机存取文件和本地可执行文件执行文件4、数据流与对象流、数据流与对象流5、Java多媒体技术多媒体技术8.1输入输出流输入输出流8.1.1流的概念流的概念流是一个比文件所包含范围更广的概念。流是一个比文件所包含范围更广的概念。流是一个可被顺序访问的数据序列,它是对计流是一个可被顺序访问的数据序列,它是对计算机输入数据和输出数据的抽象。算机输入数据和输出数据的抽象。图8.1“流”是数据从一种设备流向另一种设备的过程8.1.2io类库类库流序列中的数据既可以是未经加工流序列中的数据既可以是未经加工的原始二进制数据,也可以是经一定编的原始二进制数据,也可以是经一定编码处理后符合某种格式规定的特定数码处理后符合某种格式规定的特定数据。所以据。所以Java中的数据流有字节流和字中的数据流有字节流和字符流之分。符流之分。在在java.io包中有四个基本类:包中有四个基本类:InputStream、OutputStream及及Reader、Writer类,它们分别处理字节类,它们分别处理字节流和字符流。如图流和字符流。如图8.2所示。所示。图8.2流的分类1、字节流、字节流在在io类库中,类库中,InputStream和和OutputStream是处理字节数据的基本是处理字节数据的基本输入输出类,它们处于输入输出类,它们处于java.io包最顶包最顶层。这两个类均为抽象类,也就是说它层。这两个类均为抽象类,也就是说它们不能被实例化,必须生成子类之后才们不能被实例化,必须生成子类之后才能实现一定的功能。能实现一定的功能。在在java.io包中定义了很多这二个基本类具体实现包中定义了很多这二个基本类具体实现输入输出功能的子类,表输入输出功能的子类,表8.1为部分常用字节输入为部分常用字节输入流类和字节输出流子类的功能。流类和字节输出流子类的功能。类名功能FileInputStream和FileOutputStream文件流,实现在本地磁盘文件系统中的文件进行顺序读写操作。ByteArrayInputStream和ByteArrayOutputStream字节型数组流,实现与内存缓冲区的同步读写及对CPU寄存器的读写操作。ObjectInputStream和ObjectOutputStream对象流,将对象作为一个数据通过流进行传输和存储。FilterInputStream和FilterOutputStream过滤流,是一个抽象类。它们都有实现具体功能的子类。DataInputStream和DataOutputStream数据输入输出流,是过滤流的子类,实现独立于具体机器的带格式的读写操作。BufferedInputStream和BufferedOutputStream将数据读写到缓冲区,它们是过滤流的子类。表8.1部分常用字节输入流类和输出流类的功能2、字符流、字符流处理字符数据的基本输入输出的类处理字符数据的基本输入输出的类是是Reader和和Writer,它们也处于,它们也处于java.io包最顶层,且这两个类均为抽象类,包最顶层,且这两个类均为抽象类,Java.io包中其它处理字符流的类都是从包中其它处理字符流的类都是从这两个类继承而来的。这两个类继承而来的。由于由于Reader和和Writer是抽象类,因此,是抽象类,因此,在在java.io包中定义了许多这二个处理字符流包中定义了许多这二个处理字符流基本类具体实现输入输出功能的子类,表基本类具体实现输入输出功能的子类,表8.2为部分常用字符输入流类和字符输出流为部分常用字符输入流类和字符输出流子类的功能。子类的功能。类名功能BufferedReader和BufferedWriter用于字符流读写缓冲存储。InputStreamReader和OutputStreamWriter用于将字节码与字符码相互转换。FileReader和FileWriter用于字符文件的输入输出。表8.2部分常用字符输入流类和输出流类的功能8.2文件处理文件处理8.2.1文件与目录管理文件与目录管理在Java语言的java.io包中,由File类提供了描述文件和目录的操作与管理方法。但File类不是InputStream、OutputStream或Reader、Writer的子类,因为它不负责数据的输入输出,而专门用来管理磁盘文件与目录。1、创建、创建File类文件对象类文件对象File类共提供了三个不同的构造函数,类共提供了三个不同的构造函数,以不同的参数形式灵活地接收文件和目以不同的参数形式灵活地接收文件和目录名信息。录名信息。(1)Filef1=newFile(Stringpath)(2)Filef2=newFile(Stringpath,Stringname)(3)Filef3=newFile(Filedir,Stringname)2、获取文件及目录属性、获取文件及目录属性一个对应于某磁盘文件或目录的一个对应于某磁盘文件或目录的File对对象一经创建,象一经创建,就可以通过调用它的方法来就可以通过调用它的方法来获得文件或目录的属性。获得文件或目录的属性。获得文件或目录的属性获得文件或目录的属性,较常用的方法较常用的方法:方法名方法名 功能功能public boolean exists()判断文件或目录是否存在判断文件或目录是否存在public boolean isFile()判断是文件还是目录判断是文件还是目录 public boolean isDirectory()判断是文件还是目录判断是文件还是目录public String getName()返回文件名或目录名返回文件名或目录名public String getPath()返回文件或目录的路径。返回文件或目录的路径。public long length()获取文件的长度获取文件的长度 public String list()将目录中所有文件名保存在字符串将目录中所有文件名保存在字符串数组中返回。数组中返回。3、文件及目录操作、文件及目录操作File类中还定义了一些对文件或目录进行管类中还定义了一些对文件或目录进行管理、操作的方法,常用的方法有:理、操作的方法,常用的方法有:(1)重命名文件)重命名文件publicbooleanrenameTo(FilenewFile);(2)删除文件)删除文件publicvoiddelete();(3)创建目录)创建目录publicbooleanmkdir();8.2.2文件流文件流在在Java中,操作二进制文件使用字节输中,操作二进制文件使用字节输入输流,操作字符文件使用字符输入输出入输流,操作字符文件使用字符输入输出流。对文件进行输入输出处理的四个类:流。对文件进行输入输出处理的四个类:FileInputStream:字节文件输入流;:字节文件输入流;FileOutputStream:字节文件输出流;:字节文件输出流;FileReader:字符文件输入流;:字符文件输入流;FileWriter:字符文件输出流。:字符文件输出流。1、字节文件输入流读取文件、字节文件输入流读取文件 FileInputStream类是从类是从InputStream 类中派生出来的输入流类,它用于处理类中派生出来的输入流类,它用于处理二进制文件的输入操作。它的构造方法二进制文件的输入操作。它的构造方法有下面三种形式:有下面三种形式:FileInputStream(String filename);FileInputStream(File file);FileInputStream(FileDescriptor fdObj);(1)FileInputStream类类文件输入流只是建立了一条通往数据的通文件输入流只是建立了一条通往数据的通道,应用程序可以通过这个通道读取数据,要道,应用程序可以通过这个通道读取数据,要实现读取数据的操作,需要使用实现读取数据的操作,需要使用read()方法。方法。使用使用read()方法有三种格式:方法有三种格式:intread();intread(byteb);intread(byteb,intoff,intlen);(2)从文件输入流中读取字节)从文件输入流中读取字节【例例8-1】1./*读取文件读取文件*/2.import java.io.FileInputStream;3.import javax.swing.JOptionPane;4.class Example8_15.public static void main(String args)6.byte buffer =new byte2056;7.String str;8.try9.File file=new File(d:/jtest/test.dat);10.FileInputStream fileInput=new FileInputStream(file);11.int bytes=fileInput.read(buffer,0,2056);/读到的字节数读到的字节数12.str=new String(buffer,0,bytes);13.14.catch(Exception e)15.16.str=e.toString();17.18.JOptionPane.showMessageDialog(null,str);19.System.exit(0);/退出程序退出程序20.21.2、字节文件输出流写入文件、字节文件输出流写入文件FileOutputStream类是从类是从OutputStream类派类派生出来的输出类,它具有处理向文件中写数据的能生出来的输出类,它具有处理向文件中写数据的能力。该类主要应用于处理字节文件流,例如图像文力。该类主要应用于处理字节文件流,例如图像文件或声音文件等。它的构造方法有以下三种形式:件或声音文件等。它的构造方法有以下三种形式:FileOutputStream(Stringfilename)FileOutputStream(Filefile)FileOutputStream(FileDescriptorfdObj)其各参数的含义同其各参数的含义同FileInputStream一样。一样。(1)FileOutputStream类类(2)把字节发送到文件输出流)把字节发送到文件输出流与输入流的功能类似,输出流只是建立了与输入流的功能类似,输出流只是建立了一条通往数据要去的目的地的通道,数据并一条通往数据要去的目的地的通道,数据并不会自动进入输出流通道,我们要使用不会自动进入输出流通道,我们要使用write()方法把字节发送到输出流。方法把字节发送到输出流。使用使用write()方法有三种格式:方法有三种格式:write(intb)write(byteb)write(byteb,intoff,intlen)3、字符文件流读写文本文件、字符文件流读写文本文件处理字符文件有二个与处理二进制文处理字符文件有二个与处理二进制文件件FileInputStream和和FileOutputStream等等价的类:价的类:FileReader和和FileWriter,它们分,它们分别是别是Reader和和Writer类的子类。类的子类。(1)FileReader和和FileWriter它们的构造方法分别有三种形式:它们的构造方法分别有三种形式:FileReader(Stringfilename);FileReader(Filefile);FileReader(FileDescriptorfdObj);FileWriter(Stringfilename);FileWriter(Filefile);FileWriter(FileDescriptorfdObj);此外,此外,Java还提供了还提供了BufferedReader类和类和BufferedWriter类与类与FileReader类和类和FileWriter类配合使用,将字符输入或输出到类配合使用,将字符输入或输出到缓冲区,使数据处理速度大大加快,提高了缓冲区,使数据处理速度大大加快,提高了读写效率。读写效率。BufferedReader的构造方法为:的构造方法为:BufferedReader(Readerin);BufferedWriter的构造方法为的构造方法为:BufferedWriter(Writerout);与字节输入输出流的功能一样,与字节输入输出流的功能一样,Reader和和Writer只是建立一条通往字符文件的通道,只是建立一条通往字符文件的通道,而要实现对字符数据的读写操作,还需要读而要实现对字符数据的读写操作,还需要读方法和写方法来完成。方法和写方法来完成。从输入流中按行读取字符的方法:从输入流中按行读取字符的方法:StringreadLine();向输出流写入多个字符的方法:向输出流写入多个字符的方法:write(Strings,intoff,intlen);刷新刷新BufferedWriter所建立的缓冲区:所建立的缓冲区:flush();关闭流:关闭流:close();(2)用字符流进行读写操作的方法)用字符流进行读写操作的方法【例例8-3】【程序分析】8.3随机存取文件和随机存取文件和本地可执行文件本地可执行文件随机存取文件流随机存取文件流RandomAccessFile类可以读写文件中任意位置上的字节、类可以读写文件中任意位置上的字节、文本等数据。它有二个构造方法:文本等数据。它有二个构造方法:(1)RandomAccessFile(Stringfilename,Stringmode)(2)RandomAccessFile(Filefile,Stringmode)8.3.1随机存取文件流随机存取文件流【例例8-4】1/*随机流随机流*/2importjava.io.*;3classExample8_445publicstaticvoidmain(Stringargs)67try8.RandomAccessFilef=newRandomAccessFile(a.txt,rw);9.f.writeBytes(Zhangsiming);10.f.close();11.12.catch(IOExceptione)13.System.out.println(e);14.15.16.8.3.2本地可执行文件本地可执行文件 在在Java语言中,使用语言中,使用java.lang包中的包中的Runtime类可以运行本地机的可执行文类可以运行本地机的可执行文件件。每每个个Java 应应用用程程序序都都有有一一个个 Runtime 类类实实例例对对象象,使使应应用用程程序序能能够够与与其其运运行行的的环环境境相相连连接接。但但应应用用程程序序不不能能创创建建自自己己的的 Runtime 类类实实例例对对象象,而而要要通通过过该该类类的的静静态方法态方法getRuntime()创建创建Runtime 类对象。类对象。Runtime类对象有几个常用方法:类对象有几个常用方法:(1)exit(intstatus)(2)gc()(3)getRuntime()(4)exec(Stringcommand)【例例8-7】1.publicclassExample8_72.publicstaticvoidmain(Stringargs)3.4.try5.Runtimert=Runtime.getRuntime();6.rt.exec(c:/windows/system32/calc.exe);7.8.catch(Exceptione)System.out.println(e);9.10.8.4数据流与对象流数据流与对象流8.4.1数据流数据流有有许许多多应应用用程程序序需需要要将将处处理理的的数数据据作作为为Java的的一一种种基基本本类类型型(如如布布尔尔型型,字字节节,整整数数和和浮浮点点数数)来来使使用用。这这就就要要用用到到数数据据流流类类DataInputStream类类和和DataOutputStream类。类。这这两两个个数数据据流流类类是是很很有有用用处处的的,它它们们允允许许程序按机器无关的格式读取程序按机器无关的格式读取Java原始数据。原始数据。建立建立DataInputStream类和类和DataOutputStream类的实例:类的实例:publicDataInputStream(InputStreamin);publicDataOutputStream(OutputStreamout);数据流类数据流类DataInputStream类和类和DataOutputStream类的常用方法类的常用方法:方 法功 能close()关闭流并释放资源。readBoolean()读取一个布尔值。readByte()读取一个字节。readInt()从文件中读取一个int值。readUTF()从文件中读取一个UTF字符串。seekByte(int pos)设置文件指针偏移量,在该位置发生下一个读取或写入操作。writeBoolean(boolean b)把一个布尔值作为单字节值写入。writeChars(String s)向文件写入一个字符串。writeInt(int v)向文件写入一个int值。writeBytes(String s)向文件写入一个字符串。writeUTF(String str)使用UTF-8 编码以与机器无关的方式将一个字符串写入该文件。例如,下面是使用例如,下面是使用DataInputStream的一个程序段。的一个程序段。DataInputStream dis;dis=new DataInputStream(new FileInputStream(“records.dat”);/现以现以Java流的形式读入文件流的形式读入文件records.dat中的数据中的数据 for(;)/设记录由设记录由int,long,double 型数据组成型数据组成 int fld1;long fld2;double fld3;try fld1=dis.readInt();fld2=dis.readLong();fld3=dis.readDouble();catch(EOFException e)break;例如,下面是使用例如,下面是使用DataOutputStream实例的一个程序段。实例的一个程序段。FileOutputStreamfileout=new FileOutputStream(“records.dat”);DataOutputStream dos=new DataOutputStream(fileout);/现在现在Java数据流的形式写入文件数据流的形式写入文件records.dat For(int x=1;x =100;x+)/设记录由设记录由int,long,double型数据组成型数据组成 int fld1;long fld2;fld1=x+5;fld2=x*5;fld3=x*25;try dos.writeInt(fld1);dos.writeLong(fld2);dos.writeDouble(fld3);catch(IOException e)System.out.println(e);break;Java可以将对象作为一个整体通过对象流进行传输和存储。8.4.2 8.4.2 对象流对象流1、对象流的构造方法ObjectInputStream类和ObjectOutputStream类的构造方法为:ObjectInputStream(InputStreamin);ObjectOutputStream(OutputStreamout);【例8-10】程序分析:2 2、对象序列化、对象序列化 我们把描述对象状态的数值写入字节流的过程称为对象序列化。对象序列化就是把一个对象的状态记录下来。Java提供给我们的绝大多数类对象都是序列化对象,比如组件等。用户自己定义的类需要序列化时,必须实现Serializable接口。这个接口非常简单,因为它不包含任何需要实现的方法。Serializable接口包含在java.io包中。另外,一个已序列化类的子类也是序列化的。1.import java.io.*;2.import java.util.*;3.class Address implements Serializable4.5.protected String first,email;6.public Address()7.8.first=email=;9.10.public Address(String _first,String _email)11.12.first=_first;13.email=_email;14.15.public String toString()16.17.return first+(+email+);18.19.【例例8-11】20./主类主类21.public class Example8_1122.23.public static void main(String args )24.25.try 26.FileOutputStream file=new FileOutputStream(test.dat);27.ObjectOutputStream out=new ObjectOutputStream(file);28./定义对象定义对象29.Date now=new Date();30.Address address=new Address(abc,);31./把对象写入对象流把对象写入对象流32.out.writeObject(now);33.out.writeObject(address);34.out.close();35.36.catch(IOException ioe)37.System.out.println(ioe);38.39.注意:当这个类执行时,它创建一个包含恢注意:当这个类执行时,它创建一个包含恢复对象(即对对象进行反序列化复对象(即对对象进行反序列化(deserialize)信息的)信息的Sample.dat数据文数据文件。要知道这个程序是否正确地存储数据,件。要知道这个程序是否正确地存储数据,最好的办法还要看是否能够成功地读出所保最好的办法还要看是否能够成功地读出所保存的数据。存的数据。8.5Java多媒体技术多媒体技术在Java中,可以使用Applet的静态方法编写播放声音的程序。但只能播放.au、.Wav、.Midi等格式的音频文件。8.5.1在Applet程序中播放声音1、使用play()方法播放声音play(Url url,String name)【例8-13】1.importjava.applet.*;2.importjava.awt.Graphics;3.publicclassExample8_13extendsApplet4.publicvoidpaint(Graphicsg)5.g.drawString(Listentothemusic!,25,25);6.play(getDocumentBase(),笨小孩.mid);7.8.2、使用getAudioClip()方法播放声音getAudioClip(Urlurl,Stringname);用getAudioClip()方法建立的AudioClip对象可以处理声音:play()开始播放loop()循环播放stop()停止播放8.5.2Java多媒体包多媒体包JMF的应用的应用Java有 一 个 多 媒 体 包 JMF(Java MediaFramework),可以用来编写多媒体应用程序。Sun公司的网站俄有JMF多媒体包下载,其文件名为:jmf-2_1_1e-windows-i586.exe。JMF提供给我们编写多媒体程序的包为javax.media。应用JMF建立的多媒体程序可以播放.mpg、.avi、.mp3等格式的音频及视频文件。建立一个多媒体程序有下列几个步骤:建立一个多媒体程序有下列几个步骤:1、创建多媒体播放对象我们使用javax.media包中的manager类的静态方法createPlayer()创建一个多媒体播放对象player。tryURLmediaURL=newURL(getDocumentBase(),多媒体文件名);player=Manager.createPlayer(mediaURL);catch(MalformedURLExceptione)catch(IOExceptione)catch(NoPlayerExceptione)2、向多媒体播放对象注册控制监视器在javax.media包中有一个接口ControllerListener,我们应用该接口向多媒体播放对象注册控制监视器:player.addControllerListener(监视器);同时,实现ControllerListener接口的方法:publicvoidcontrollerUpdate(ControllerEventevent)。在该方法中进行创建播放组件及控制媒体的播放操作。3、让多媒体播放对象对播放媒体进行预提取player.prefetch();多媒体播放对象进行播放媒体预提取时,将不断获得媒体文件的有关信息,每当得到一个新的信息将触发ControllerEvent事件的发生。并通过监视器调用方法controllerUpdate(ControllerEventevent)开始播放多媒体文件。4、启动多媒体播放对象player.start();5、停止并释放多媒体播放对象player.stop();player.deallocate();player.close();示例:【例8-15】8.5.3应用输入流播放音频文件应用输入流播放音频文件在Sun公司的jdk自带的rt.jar包文件中,有AudioStream.class、AudioPlayer.class类,我们使用以下语句进行引用:importsun.audio.*;播放声音文件时,我们要使用输入流:FileInputStreamfile=newFileInputStream(e.wav);AudioStreamaudio=newAudioStream(file);使用AudioPlayer类的start()进行播放:AudioPlayer.player.start(audio);示例:示例:【例例8-16】本章结束本章结束!