第六章对文件的操作6.1File类数据流类实现文件的顺序读写。RandomAccessFile类实现文件的随机读写。他们都不能对文件的属性进行访问。使用File类,可以访问文件属性信息,但是,它不提供读写文件的方法。下面列出File类的构造方法和实例方法:1.File类有三个构造方法File(Stringfilename)File(StringdirectoryPath,Stringfilename)File(Filef,Stringfilename)其中,filename指文件名,directoryPath指文件所在的目录,f指文件的目录对象。2.实用方法(1)属性操作pubicStringgetName()获取文件名publicStringgetPath()获取文件路径publicStringgetAbsolutePath()获取文件绝对路径publiclonglength()获取文件的长度(单位是字节)publicStringgetParent()获取文件的父目录publicFilegetParentFile()获取文件的父目录publiclonglastModified()获取文件最后修改时间(时间是从1970年午夜至文件最后修改时刻的毫秒数)publicbooleancanRead()判断文件是否是可读的publicbooleancanWrite()判断文件是否可被写入publicbooleanexits()判断文件是否存在publicbooleanisFile()判断是不是一个正常文件publicbooleanisDirectroy()判断是不是一个目录publicbooleanisHidden()判断文件是不是隐藏文件(2)文件操作publicbooleanrenameTo(Filedest)给文件换名publicbooleandelete()删除文件(3)目录操作publicbooleanmkdir()创建目录publicString[]list()以字符串形式列出目录publicFile[]listFiles()以File对象形式列出目录6.1.1获得文件信息[例子6.1]在e:/test/6目录下,创建一个文件”new.txt”,然后测试该文件的属性。程序结构:程序名:ex6_1.jsp关键代码:%@pageimport=java.io.*%Filef1=newFile(E:/test/6,new.txt);f1.createNewFile();//创建文件new.txtp文件new.txt存在吗?:%=f1.exists()%BR6.1.2创建目录和文件[例子6.2]在e:/test目录下创建一个子目录Students,在Students目录下创建文件new.doc。问题分析:以e:/test和Students为参数,创建一个File对象,然后调用mkdir()方法,创建目录。程序结构:程序名:ex6_2.jsp程序算法:1.以e:/test和Students为参数,创建一个File对象:dir2.调用mkdir()方法,创建目录Students。3.调用createNewFile()方法,创建文件:new.doc关键代码:Filedir=newFile(E:/test,Students);dir.mkdir()FilenewFile=newFile(dir,new.doc);newFile.createNewFile();6.1.3列出文件和子目录[例子6.3]列出c盘根目录下的所有子目录和文件。问题分析:以”c:/”为参数,创建一个对象,然后调用listFiles()方法,获得该对象包含的所有目录和文件。然后使用条件语句将文件和目录分开。程序结构:程序名:ex6_3.jsp程序算法:1.以c:/为参数,创建对象:dir2.获取对象dir所包含的对象数组(文件和目录构成的对象):file[]3.输出所包含的子目录4.输出所包含的文件关键代码:Filedir=newFile(c:/);Filefile[]=dir.listFiles();if(file[i].isDirectory())6.1.4列出指定类型的文件[例子6.4]列出e:/test/6目录下所有的jsp文件。程序结构:程序名:ex6_4.jsp程序算法:1.定义类FileJSP,该类实现接口FilenameFilter的accept(Filedir,Stringname)方法,该方法用文件后缀为str为过滤器,对dir目录下的文件name进行筛选。2.以e:/test/6为参数,构造目录对象:dir。3.以jsp为文件后缀,构造文件筛选条件:file_jsp4.以筛选条件file_jsp对目录对象dir进行筛选,得到文件数组:file_name。5.输出文件数组。6.1.5删除文件和目录[例子6.5]删除e:/test/Students目录下的文件“new.doc”,然后删除目录“Students”。程序结构:程序名:ex6_5.jsp程序算法:1.以文件名E:/test/Students/new.doc为参数创建File对象:f2.以目录名E:/test/Students为参数创建File对象:dir3.删除文件:f.delete()4.删除目录:dir.delete()//必须为非空目录6.2数据流概述数据流是对各种流的总称。每个流本身是一个类。我们可以使用数据流读文件或写文件。输入流只能读文件不能写文件,输出流只能写文件不能读文件。1.数据流概念我们把数据的输入流和数据输出流统称为数据流(这里说的输入/输出是以程序为参考点而言)。2.数据流分类按照数据流动方向分为:输入流和输出流按照数据流动成分分为:字节流、字符流、缓冲流、数据流、对象流等等。3.数据流模型为了便于理解数据流工作方式,对数据流进行抽象,得到数据流模型如图6-1所示。在程序中,使用输入流,可从键盘或文件中读取数据;使用输出流,可向显示器、打印机或文件中传输数据。6.3字节流字节流有两个超类,也是两个抽象类,它们是字节输入流(InputStream)和字节输出流(OutputStream)。InputStream类是所有字节输入流的超类;OutputStream类是所有字节输出流的超类。1.InputStream类层次图2.OutputStream类层次图字节流有多个子类,能直接对文件进行读或写的子类有FileInputStream和键盘文件程序输入流输出流显示器打印机文件InputStreamFileInputStreamPipedInputStreamFilterInputStreamObjectInputStreamSequenceInputStreamByteArrayInputStreamStringBufferInputStreamPushbackInputStreamBufferedInputStreamDataInputStreamOutputStreamFileOutputStreamPipedOutputStreamFilterOutputStreamObjectOutputStreamByteArrayOutputStreamPrintStreamBufferedOutputStreamDataOutputStreamFileOutputStream.下面是它们的构造方法.1.FileInputStream类的构造方法:FileInputStream(Stringname)FiIeInputStream(Filefile)其中,name为文件名,file为文件类File对象,即可以以文件名或File对象构造文件输入流对象。通过文件输入流对象读文件。2.FileOutputStream类的构造方法:FileOutputStream(Stringname)throwsFileNotFoundExceptionFileOutputStrearm(Filefile)throwsFileNotFoundExceptionFileOutputStrearm(Stringname,booleanappend)throwsFileNotFoundException其中,name为文件名,file为File对象,append表示文件的写入方式。append的值为false时,为重写方式,即要写入的内容从文件开头写入,覆盖以前的文件内容;当append的值为true时,为添加方式,即要写入的内容添加到文件的尾部。append的默认值是false。可以以文件名或File对象构造文件输出流对象,通过文件输出流对象写文件。6.3.1用类FileInputStream读文件[例子6.6]读文件e:/read.txt的内容,并输出到客户端。问题分析:以文件名e:/read.txt为参数构造File对象,再以File对象为参数构造输入流,循环读取输入流,并输出到客户端。程序结构:程序名:ex6_6.jsp程序算法:1.以文件名e:/read.txt为参数,构造文件对象:f2.以文件对象f为参数,构造输入流:in3.每次从in中读取n个字节,保存在数组b中4.n等于-1时结束循环,否则,把数组b以字符串的方式输出到客户端,重复步骤3。6.3.2用类FileOutputStream写文件[例子6.7]把从客户端输入的文本,添加到服务器的e:/write.txt文件中。问题分析:创建一个表单接受客户端的文本输入。以文件名e:/write.txt为参数创建一个输出流,把客户端输入的文本写入该输出流中。程序结构:程序名:ex6_7.jsp程序算法:1.创建一个表单,包含一个文本框,文本框名是boy2.获取文本框数据,保存在字符串str中3.将str编码为字节数组:buffer4.以e:/write.txt为参数,创建一个输出流:wf5.将buffer写入到输出流wf中。关键代码:%Stringstr=request.getParameter(boy);if(str==null)str=;try{bytebuffer[]=str.getBytes(ISO-8859-1);FileOutputStreamwf=newFileOutputStream(e:/write.txt,true);wf.write(buffer);//将字节数组写入输出流指向的文件wf.close();//关闭输出流out.println(将数据存入到文件:e:/write.txt中);}catch(IOExceptionioe){System.out.println(FileWriteError!);}%6.4字节缓存流由于使用文件字节流读/写文件效率不高,在实际应用中,常常使用字节缓存流来读/写文件。字节缓存流有:字节缓存输入流(BufferedInputStream)和字节缓存输出流(BufferedOutputStream)。常用构造方法1.BufferedInputStream类的构造方法BufferedInputStream(InputStreamin)BufferedInputStream(InputStreamin,intsize)2.BufferedOutputStream类的构造方法BufferedOutputStream(OutputStreamout)BufferedOutputStream(OutputStreamout,intsize)其中,in是字节输入流对象,out是字节输出流对象,size是缓冲区大小。实际应用中,为了提高文件读写的效率,FileInputStream流经常和BufferedInputStream流配合使用,FileOutputStream流经常和BufferedOutputStream流配合使用。下面是构造字节缓存流的方法。1.构造字节缓存输入流的步骤假设需要使用字节缓存流读文件A.txt,则需要对文