程序设计第15章输入输出流和文件操作ppt课件.ppt_第1页
程序设计第15章输入输出流和文件操作ppt课件.ppt_第2页
程序设计第15章输入输出流和文件操作ppt课件.ppt_第3页
程序设计第15章输入输出流和文件操作ppt课件.ppt_第4页
程序设计第15章输入输出流和文件操作ppt课件.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第十五章输入输出流与文件操作,目录,重点与难点点拨,输入输出流的分类,目录和文件管理,文件和随机访问,其他常用的流,综合案例,字符流,字节流,经典练习题,本章知识重点,输入输出流的分类,java.io包中流的体系结构,目录和文件管理涉及到的类,输入输出流的概念,本章知识难点,目录和文件管理涉及到的类,流输入及输出的一般过程,输入输出流的分类,Java流的概念Java使用流(stream)来执行输入输出(I/O)的功能,流是一种数据的源头和目的之间的通信途径标准输入输出Java系统事先定义好两个流对象,分别与系统的标准输入和标准输出相联系,它们是System.in和System.outSystem是Java中一个功能很强大的类,利用它可以获得很多Java运行时的系统信息。,【例15.1】,输出流(程序写出数据),输入流(程序读入数据),Java流类体系结构1,Java流类体系结构2,Java流类体系结构3,Java流类体系结构4,Java流的概念,输入输出流的分类,目录和文件管理,文件名的处理,File类,文件或目录的生成,文件属性测试,普通文件信息和工具,目录操作,publicFile(Stringpath):如果path是实际存在的路径,则该File对象表示的是目录;如果path是文件名,则该File对象表示的是文件。publicFile(Stringpath,Stringname):path是路径名,name是文件名(不可为空)。publicFile(Filedir,Stringname):dir是路径名,name是文件名。,StringgetName():得到一个文件的名称(不包括路径)。StringgetPath():得到一个文件的路径名。StringgetAbsolutePath():得到一个文件的绝对路径名。StringgetParent():得到一个文件的上一级目录名。StringrenameTo(FilenewName):将当前文件名更名为给定文件的完整路径。,【例15.2】,booleanexists():测试当前File对象所指示的文件或目录是否存在,若存在,返回True。booleancreateNewFile():创建当前文件。booleancanWrite():测试当前文件是否可写。booleancanRead():测试当前文件是否可读。booleanisFile():测试当前文件是否是文件(不是目录)。booleanisDirectory():测试当前文件是否是目录,若为目录则返回True。,【例15.3】,longlastModified():得到文件最近一次修改的时间。longlength():得到文件的长度,以字节为单位,若不存在,返回0。booleandelete():删除File对象代表的文件或目录,目录需为空。删除成功,返回True。,booleanmkdir():生成一个由该对象指定的路径(新目录),若成功,返回True。booleanmkdirs():生成一个新的目录,包含子目录。若成功,返回true。booleanrenameTo(FilenewName):将当前File对象所代表的路径名改为newName所代表的路径名。若成功,返回true。Stringlist():列出当前目录下的文件。FilelistFiles():得到该对象所代表的目录下的File对象数组。StringtoString():得到抽象路径表示法。,【例15.4】,File类的应用,【例15.5】,【例15.6】,字节流,顺序读/写文件(FileInputStream与FileOutputStream),FileInputStream类从磁盘文件读取数据。常用的构造方法有:FileInputStream(Stringname):打开文件name用来读取数据。如:FileInputStreamf=newFileInputStream(c:/test.txt);FileInputStream(Filefile):打开文件file用来读取数据。如:Filef=newFile(c:/test.txt);FileInputStreamf1=newFileinputStream(f);将FileDescriptor对象作为其参数。如:FileDescriptor()fd=newFileDescriptor();FileinputStreamf2=newFileInputstream(fd);,FileOutputStream类创建文件(如果文件不存在),并将数据写入文件。FileOutputStream类常用的构造方法有:FileOutputStream(Stringname):打开文件name用来写入数据。如:FileOutputStreamf=newFileOutputStream(c:/test.txt);FileOutputStream(Filefile):打开文件file用来写入数据。如:Filef=newFile(c:/test.txt);FileOutputStreamf1=newFileOutputStream(f);FileOutputStream(Stringname,Booleanappend):打开文件name用来写入数据,若append为true,则写入的数据会加到原有文件后面,否则,覆盖原有的文件。如:FileOutputStreamf=newFileOutputStream(c:/test.txt,true);将FileDescriptor对象作为其参数。FileDescriptor()fd=newFileDescriptor();FileOutputStreamf=newFileOutputStream(fd);,【例15.7】,字节流,字节流,ByteArrayInputStream将字节数组用作源,并在该数组中执行读操作它有两种构造方法。第一种构造方法将字节数组作为参数。ByteArrayInputStream(bytebuffer):生成一个字节数组的输入流,并指定一个字节数组buffer为此输入流的流缓冲区。如:ByteArrayInputStreamb=newByteArrayInputStream(buf);另外一种构造方法有助于从指定的字节数组来创建ByteArrayInputStream。ByteArrayinputStreamb=newByteArrayinputStream(buf,off,len);其中off是要读取的第一个字节的偏移,len是要读取数组的字节数;,ByteArrayOutputStream有2种构造方法ByteArrayOutputStream():生成一个字节数组的输出流,其缓冲区的默认初始大小为32字节,若有需要,缓冲区的大小会随之增加。如:ByteArrayOutPutStreamb=newByteArrayOutputStream();ByteArrayOutputStream(intsize):创建32个自己的缓冲器用于储存数据,但分配size字节的初始大小给此缓冲区。如:ByteArrayOutputStreamb1=newByteArrayOutputStream(size);创建大小为size的缓冲器,ByteArrayOutputStream的一些常用方法:intsize():返回此流缓冲区的大小。bytetoByteArray():生成一个新的字节数组,并将流的内容复制到此字节数组。StringtoString():将流的内容转换为String对象。,【例15.8】,字节流,缓冲区流BufferedInputStream和BufferedOutputStream,BufferedInputStream类的构造方法和方法:BufferedInputStream(InputStreamin):构造一个BufferedInputStream。BufferedInputStream(InputStreamin,intsize):构造一个具有给定的缓冲区大小的BufferedInputSavailable():得到可以从这个输入流读取的字节数。voidclose():关闭流。voidmark(intreadlimit):在这个输入流的当前位置做标记。booleanmarkSupported():检查这个输入流是否支持mark和reset方法。intread():读取数据的下一个字节。intread(byteb,intoff,intlen):从这个字节输入流的给定偏移量处开始读取字节,存储到给定的字节数组。voidreset():将缓冲区重新设置到加标记的位置。longskip(longn):跳过n个字节的数据。,BufferedOutputStream类的构造方法和方法:BufferedOutputStream(OutputStreamout):构造一个BufferedOutputStream。BufferedOutputStream(OutputStreamout,intsize):构造一个具有给定的缓冲区大小的BufferedOutputStream。voidflush():刷新这个流。voidwrite(byteb,intoff,intlen):将给定的字节数组写到这个缓冲输出流。voidwrite(intb):将给定的字节写到这个缓冲输出流。,【例15.9】,字符流,字符流,InputStreamReader和OutputStreamWriter,InputStreamReader类的构造方法和方法:InputStreamReader(InputStreamin):构造一个InputStreamReader。InputStreamReader(InputStreamin,Stringenc):使用命名的字符编码构造一个InputStreamReader。voidclose():关闭流。StringgetEncoding():得到字符编码的名称。intread():读取一个字符。intread(charcbuf,intoff,intlen):将字符读到数组中。booleanready():如果这个流已准备好,返回True。,OutputStreamWriter类的构造方法和方法:OutputStreamWriter(OutputStreamout):构造一个OutputStreamWriter。OutputStreamWriter(OutputStreamout,Stringenc):使用命名的字符编码构造一个OutputStreamWriter。voidclose():关闭流。voidflush():刷新流。StringgetEncoding():得到这个流使用的字符编码的名称。voidwrite(charcbuf,intoff,intlen):写字符数组的一部分。voidwrite(intc):写一个字符。voidwrite(Stringstr,intoff,intlen):写一个字符串的一部分。,【例15.10】,字符流,FileReader,FileReader(Filefile):构造一个FileReader。FileReader(FileDescriptorfd):从一个文件描述符构造一个FileReader。FileReader(Stringfilename):从一个文件名构造一个FileReader。,【例15.11】,字符流,FileWriter,FileWriter(Filefile):从File对象构造一个FileWriter。FileWriter(FileDescriptorfd):从文件描述符构造一个FileWriter。FileWriter(Stringfilename):从文件名构造一个FileWriter。FileWriter(Stringfilename,booleanappend):构造一进行附加的FileWriter。,【例15.12】,字符流,BufferedReader和BufferedWriter,这两个类对应的流使用了缓冲,能大大提高输入输出的效率。这两个也是过滤器流,常用来对InputStreamReader和OutputStreamWriter进行处理。,【例15.13】,字符流,CharArrayReader和CharArrayWriter,CharArrayReader类的构造方法和方法如下:CharArrayReader(charbuf):从给定的字符数组构造一个CharArrayReader。CharArrayReader(charbuf,intoffset,intlength):同上。voidclose():关闭流。voidmark(intreadAheadLimit):在流中的当前位置加标记。booleanmarkSupported():如果这个流支持mark操作,那么返回Tread():读取一个字符。intread(charb,intoff,intlen):将字符读入数组的一部分。booleanready():检查这个流是否已经准备好被读取。voidreset():将流重设到最近的标记。longskip(longn):跳过n个字符。,CharArrayWriter类的构造方法和方法如下:CharArrayWriter():构造一个CharArrayWriter。CharArrayWriter(intinitialSize):构造一个具有给定初始大小的CharArrayWriter。voidclose():关闭流。voidflush():刷新流。voidreset():重设流。intsize():得到缓冲区的当前大小。chartoCharArray():得到输入数据的副本。StringtoString():将输入数据转换为字符串。voidwrite(charc,intoff,intlen):将字符写到缓冲区中。voidwrite(intc):将一个字符写到缓冲区中。voidwrite(Stringstr,intoff,intlen):将字符串的一部分写到缓冲区中。voidwriteTo(Writerout):将缓冲区的内容写到另一个字符流中。,【例15.14】,文件的随机访问,RandomAccessFile(Filefile,Stringmode):构造一个随机访问文件流,file为被访问的文件对象,mode是用来指定存取的模式,mode可以为r(读)、w(写)或rw(读写)。RandomAccessFile(Stringname,Stringmode):构造一个随机访问文件流,以便访问由字符串name指定名字的文件,mode参数使用同上,booleanreadBoolean()bytereadByte()charreadChar()doublereadDouble()floatreadFloat()intreadInt()longreadLong()shortreadShort()StringreadLine(),voidwriteByte(byteb)voidwriteBytes(Strings)voidwriteChar(charc)voidwriteChars(Strings)voidwriteDouble(doubled)voidwriteFloat(floatf)voidwriteInt(inti)voidwriteLong(longl)voidwriteShort(shorts),voidseek(longpos):将文件指针移到pos(不可为负)的位置,相对于文件初始位置值(初始值为0)。longgetFilePointer():得到目前文件指针的位置(相对于文件初始位置)。longlength():得到文件的长度。intskipBytes(intn):使文件指针向前移动指定的n个字节,【例15.15】,其他常用的流,管道流,ZIP文件流,DataInputStream和DataOutputStream,对象流,综合案例,【例15.16】下面的代码实现了一个简单的文件编辑器,importjava.awt.*;importjava.awt.event.*;importjava.io.*;publicclassFileEditextendsWindowAdapterimplementsActionListener,TextListenerFramef;TextAreata1;Panelp1;TextFieldtf1;Buttonb1,b2,b3;FileDialogfd;Filefile1=null;publicstaticvoidmain(Stringargs)(newFileEdit().display();,综合案例(续),publicvoiddisplay()f=newFrame(FileEdit);f.setSize(680,400);f.setLocation(200,140);f.setBackground(Color.lightGray);f.addWindowListener(this);tf1=newTextField();tf1.setEnabled(false);tf1.setFont(newFont(Dialog,0,20);/设置文本行的初始字体f.add(tf1,North);ta1=newTextArea();ta1.setFont(newFont(Dialog,0,20);/设置文本区的初始字体f.add(ta1);ta1.addTextListener(this);/注册文本区的事件监听程序p1=newPanel();p1.setLayout(newFlowLayout(FlowLayout.LEFT);,综合案例(续),b1=newButton(Open);b2=newButton(Save);b3=newButton(SaveAs);p1.add(b1);p1.add(b2);p1.add(b3);b2.setEnabled(false);b3.setEnabled(false);b1.addActionListener(this);/注册按钮的事件监听程序b2.addActionListener(this);b3.addActionListener(this);f.add(p1,South);f.setVisible(true);publicvoidtextValueChanged(TextEvente)/实现TextListener接口中的方法,对文本区操作时触发b2.setEnabled(true);b3.setEnabled(true);,综合案例(续),publicvoidactionPerformed(ActionEvente)if(e.getSource()=b1)/单击打开按钮时fd=newFileDialog(f,Open,FileDialog.LOAD);fd.setVisible(true);/创建并显示打开文件对话框if(fd.getDirectory()!=null),综合案例(续),if(e.getSource()=b2)|(e.getSource()=b3)/单击保存按钮时if(e.getSource()=b3)|(e.getSource()=b2),综合案例(续),elsesave(file1);publicvoidsave(Filefile1)try/将文本区内容写入字符输出流FileWriterfw=newFileWriter(file1);fw.write(ta1.getText();fw.close();b2.setEnabled(false);b3.setEnabled(false);catch(IOExceptionioe)System.out.println(ioe);publicvoidwindowClosing(WindowEvente)System.exit(0);,综合案例(续),程序运行结果,简答练习题,利用输入输出流编写程序,实现文件拷贝的功能。,编写程序,实现在屏幕上显示文本文件的功能。,有哪些常用的字节流和字符流,他们的主要区别是什么?,对字节流和字符流进行读写操作的一般步骤是什么?,File类有哪些构造方法和常用方法?,编写程序,从键盘输入一串字符,从屏幕输出并将其存入a.txt文件中。,【例15.1】标准输入输出举例,标准输入输出,输入输出流的分类,importjava.io.*;publicclassIODemopublicstaticvoidmain(Stringargs)throwsIOExceptionintb;intcount=0;while(b=System.in.read()!=-1)count+;System.out.print(char)b);System.out.println();System.out.println(programend);,程序运行如下:输入:a,b,c,d输出:a,b,c,d输入:Z输出:programend,【例15.2】对Test.txt及其上一级目录的File类对象进行操作,目录和文件管理,File类,importjava.io.*;publicclassfileTest/创建一个文件publicstaticvoidmain(Stringargs)Filef=newFile(parentfileTest.txt);Filef1=newFile(newfileTest.txt);trySystem.out.println(f.getParent();System.out.println(f.getName();System.out.println(f1.getPath();System.out.println(f1.getAbsolutePath();catch(Exceptione)e.printStackTrace();,程序运行结果,【例15.3】建立test.txt文件对象,判断是否存在,如果不存在就创建之,importjava.io.*;publicclassCreateNewFilepublicstaticvoidmain(Stringargs)Filef=newFile(test.txt);tryif(!f.exists()f.createNewFile();elseSystem.out.println(exists);catch(Exceptione)e.printStackTrace();,程序运行结果,目录和文件管理,File类,【例15.4】创建文件夹Dir以及文件夹dir/cdir。,目录和文件管理,File类,importjava.io.*;publicclassCreateDirpublicstaticvoidmain(Stringargs)Filef=newFile(test.txt);Filef1=newFile(Dir);Filef2=newFile(dir/cdir);Filef3=newFile(newTest.txt);tryf.renameTo(f3);/把test.txt改名为newTest.txtf1.mkdir();/创建目录Dirf2.mkdirs();/创建目录dir及其子目录cdircatch(Exceptione)e.printStackTrace();,程序运行结果,【例15.5】使用File类的方法获取文件file.txt的属性信息,目录和文件管理,File类的应用,importjava.io.*;publicclassfilepublicstaticvoidmain(Stringargs)Filefl=newFile(file.txt);System.out.println(Thefileisexist?+fl.exists();System.out.println(Thefilecanwrite?+fl.canWrite();System.out.println(Thefilecanread?+fl.canRead();System.out.println(Thefileisafile?+fl.isFile();System.out.println(Thefileisadirectory?+fl.isDirectory();System.out.println(Thefilesnameis:+fl.getName();System.out.println(Thefilesallpathis:+fl.getAbsolutePath();System.out.println(Thefileslengthis+fl.length();,程序运行结果,【例15.6】列出Dir目录下的所有文件和目录(Stringlist(),最后修改时间;若为目录则在其后面标出,若为文件,则在其后面标出文件长度(提示:方法longlastModified()能够返回自1970.1.1起到最后修改时间之间的秒数),importjava.io.*;importjava.util.*;publicclasstestDirpublicstaticvoidmain(Stringargs)Filef=newFile(Dir);StringlistAll=null;Filetemp=null;trylistAll=f.list();for(inti=0;it);elseSystem.out.print(temp.length()+t);System.out.println(newDate(temp.lastModified();catch(Exceptione)e.printStackTrace();,目录和文件管理,File类的应用,程序运行结果,字节流,【例15.7】将FileIO.java复制为FileExam.java.bak,importjava.io.*;publicclassFileIOpublicstaticvoidmain(Stringargs)FileInputStreaminFile=null;FileOutputStreamoutFile=null;tryinFile=newFileInputStream(FileIO.java);outFile=newFileOutputStream(FileExam.java.bak);intdate;while(date=inFile.read()!=-1)outFile.write(date);catch(FileNotFoundExceptione)System.out.println(e.getMessage();catch(IOExceptione)System.out.println(e.getMessage();finallyif(inFile!=null)tryinFile.close();catch(IOExceptione)if(outFile!=null)tryoutFile.close();catch(IOExceptione),程序运行结果,【解题分析】以下问题的求解过程可分解如下:先打开文件FileExam.java用read()将其内容逐字节读取出来(如果返回值为-1,则表明已到达文件尾端)再用write()将读出的字节逐一写入另一个文件FileExam.java.bak中若文件无法打开(例如FileExam.java不存在)或无法生成(FileExam.java.bak),则抛出FileNotFoundException异常,若读写出错,则抛出IOException异常。最后,在finally中关闭文件。,【例15.8】程序读入文件ByteIO.java,将其内容写入内存中(一个字节数组),接着转换为String对象,并将该String对象内的令牌解析出来,字节流,importjava.io.*;importjava.util.*;publicclassByteIOpublicstaticvoidmain(Stringargs)tryFileinFile=newFile(FileIO.java);FileInputStreaminData=newFileInputStream(inFile);ByteArrayOutputStreamdataArray=newByteArrayOutputStream();intdata;while(data=inData.read()!=-1)dataArray.write(data);inData.close();StringdataStr=dataArray.toString();StringTokenizertokens=newStringTokenizer(dataStr);while(tokens.hasMoreTokens()System.out.println(tokens.nextToken();catch(IOExceptione)System.out.println(e.getMessage();,程序运行结果,【例15.9】文件拷贝的缓冲改进,字节流,/文件拷贝的缓冲改进importjava.io.*;publicclassCopypublicstaticvoidmain(Stringargs)BufferedInputStreambis=null;BufferedOutputStreambos=null;bytebuf=newbyte100;trybis=newBufferedInputStream(newFileInputStream(test.txt);bos=newBufferedOutputStream(newFileOutputStream(testcopy.txt);intlen=0;while(true)len=bis.read(buf);if(len=0)break;bos.write(buf,0,len);bos.flush();/缓冲区只有满时才会将数据输出到输出流,用flush()将未满的缓冲区中数据强制输出catch(Exceptione)e.printStackTrace();finallyif(bis!=null)trybis.close();catch(Exceptione)e.printStackTrace();if(bos!=null)trybos.close();catch(Exceptione)e.printStackTrace();,程序运行结果,【例15.10】利用InputStreamReader从键盘接受输入,再将输入的字符显示出来,字符流,importjava.io.*;classinputstreamreaderpublicstaticvoidmain(Stringargs)tryintcharacter;InputStreamReaderinstreamread=newInputStreamReader(System.in);/InputStreamReader以字符形式读取输入while(character=instreamread.read()!=-1)System.out.print(char)character);catch(IOExceptione)System.out.print(“Bye”);,程序运行结果如下:输入:a,b,c,d输出:a,b,c,d输入:1,2,3,4输出:1,2,3,4输入:Z输出:Bye,【例15.11】下例中打开一个文件file.txt(内容为:Hellofromfile),将文件的内容读到缓冲区,然后显示数据,字符流,importjava.io.*;publicclassfilereadpublicstaticvoidmain(Stringargs)throwsExceptionFileReaderfileread=newFileReader(file.txt);/打开文件chardata=newchar1024;intcharsread=fileread.read(data);/读入System.out.println(newString(data,0,charsread);/显示fileread.close();/关闭文件流,程序运行结果,字符流,【例15.12】下例中,分别采用三种方式:逐字符地写数据、一次写入所有数据、分批写数据,使用类FileWriter,importjava.io.*;publicclassfilewritepublicstaticvoidmain(Stringargs)throwsExceptionchardata=T,h,i,s,i,s,a,s,t,r,i,n,g,o,f,t,e,x,t,.;FileWriterfilewriter1=newFileWriter(file1.tx

温馨提示

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

评论

0/150

提交评论