资源描述
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为部分常用字节输入流类和字节输出流子类的功能。,表8.1部分常用字节输入流类和输出流类的功能,2、字符流,处理字符数据的基本输入输出的类是Reader和Writer,它们也处于java.io包最顶层,且这两个类均为抽象类,Java.io包中其它处理字符流的类都是从这两个类继承而来的。,由于Reader和Writer是抽象类,因此,在java.io包中定义了许多这二个处理字符流基本类具体实现输入输出功能的子类,表8.2为部分常用字符输入流类和字符输出流子类的功能。,表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对象一经创建,就可以通过调用它的方法来获得文件或目录的属性。,获得文件或目录的属性,较常用的方法:,3、文件及目录操作,File类中还定义了一些对文件或目录进行管理、操作的方法,常用的方法有:(1)重命名文件publicbooleanrenameTo(FilenewFile);(2)删除文件publicvoiddelete();(3)创建目录publicbooleanmkdir();,8.2.2文件流,在Java中,操作二进制文件使用字节输入输流,操作字符文件使用字符输入输出流。对文件进行输入输出处理的四个类:FileInputStream:字节文件输入流;FileOutputStream:字节文件输出流;FileReader:字符文件输入流;FileWriter:字符文件输出流。,1、字节文件输入流读取文件,FileInputStream类是从InputStream类中派生出来的输入流类,它用于处理二进制文件的输入操作。它的构造方法有下面三种形式:FileInputStream(Stringfilename);FileInputStream(Filefile);FileInputStream(FileDescriptorfdObj);,(1)FileInputStream类,文件输入流只是建立了一条通往数据的通道,应用程序可以通过这个通道读取数据,要实现读取数据的操作,需要使用read()方法。使用read()方法有三种格式:intread();intread(byteb);intread(byteb,intoff,intlen);,(2)从文件输入流中读取字节,【例8-1】,1./*读取文件*/2.importjava.io.FileInputStream;3.importjavax.swing.JOptionPane;4.classExample8_15.publicstaticvoidmain(Stringargs)6.bytebuffer=newbyte2056;7.Stringstr;8.try9.Filefile=newFile(d:/jtest/test.dat);10.FileInputStreamfileInput=newFileInputStream(file);11.intbytes=fileInput.read(buffer,0,2056);/读到的字节数12.str=newString(buffer,0,bytes);13.14.catch(Exceptione)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类的常用方法:,例如,下面是使用DataInputStream的一个程序段。DataInputStreamdis;dis=newDataInputStream(newFileInputStream(“records.dat”);/现以Java流的形式读入文件records.dat中的数据for(;)/设记录由int,long,double型数据组成intfld1;longfld2;doublefld3;tryfld1=dis.readInt();fld2=dis.readLong();fld3=dis.readDouble();catch(EOFExceptione)break;,例如,下面是使用DataOutputStream实例的一个程序段。FileOutputStreamfileout=newFileOutputStream(“records.dat”);DataOutputStreamdos=newDataOutputStream(fileout);/现在Java数据流的形式写入文件records.datFor(intx=1;x=100;x+)/设记录由int,long,double型数据组成intfld1;longfld2;fld1=x+5;fld2=x*5;fld3=x*25;trydos.writeInt(fld1);dos.writeLong(fld2);dos.writeDouble(fld3);catch(IOExceptione)System.out.println(e);break;,Java可以将对象作为一个整体通过对象流进行传输和存储。,8.4.2对象流,1、对象流的构造方法ObjectInputStream类和ObjectOutputStream类的构造方法为:ObjectInputStream(InputStreamin);ObjectOutputStream(OutputStreamout);,【例8-10】,程序分析:,2、对象序列化我们把描述对象状态的数值写入字节流的过程称为对象序列化。对象序列化就是把一个对象的状态记录下来。Java提供给我们的绝大多数类对象都是序列化对象,比如组件等。用户自己定义的类需要序列化时,必须实现Serializable接口。这个接口非常简单,因为它不包含任何需要实现的方法。Serializable接口包含在java.io包中。另外,一个已序列化类的子类也是序列化的。,1.importjava.io.*;2.importjava.util.*;3.classAddressimplementsSerializable4.5.protectedStringfirst,email;6.publicAddress()7.8.first=email=;9.10.publicAddress(String_first,String_email)11.12.first=_first;13.email=_email;14.15.publicStringtoString()16.17.returnfirst+(+email+);18.19.,【例8-11】,20./主类21.publicclassExample8_1122.23.publicstaticvoidmain(Stringargs)24.25.try26.FileOutputStreamfile=newFileOutputStream(test.dat);27.ObjectOutputStreamout=newObjectOutputStream(file);28./定义对象29.Datenow=newDate();30.Addressaddress=newAddress(abc,abc);31./把对象写入对象流32.out.writeObject(now);33.out.writeObject(address);34.out.close();35.36.catch(IOExceptionioe)37.System.out.println(ioe);38.39.,注意:当这个类执行时,它创建一个包含恢复对象(即对对象进行反序列化(deserialize)信息的Sample.dat数据文件。要知道这个程序是否正确地存储数据,最好的办法还要看是否能够成功地读出所保存的数据。,8.5Java多媒体技术,在Java中,可以使用Applet的静态方法编写播放声音的程序。但只能播放.au、.Wav、.Midi等格式的音频文件。,8.5.1在Applet程序中播放声音,1、使用play()方法播放声音play(Urlurl,Stringname)【例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(JavaMediaFramework),可以用来编写多媒体应用程序。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】,本章结束!,
展开阅读全文