Java第八章.docx
《Java第八章.docx》由会员分享,可在线阅读,更多相关《Java第八章.docx(34页珍藏版)》请在冰点文库上搜索。
Java第八章
第八章输入输出流
【课前思考】
1.字节流和字符流的基类各是什么?
2.什么是对象的串行化?
对象串行化的作用是什么?
【学习目标】
本讲主要讲述了java语言中的输入/输出的处理,通过本讲的学习,同学们可以编写更为完善的java程序。
【学习指南】
仔细阅读本章各知识点的内容,深刻理解java语言中输入/输出流的处理方法,掌握处理问题的方法,多练习,多上机。
【难重点】
●遇到实际问题时,要根据需要正确使用各种输入/输出流,特别是对中文使用适当的字符输入流。
●正确使用对象串行化的方法。
●处理字符流时,其构造方法的参数是一个字节流。
●对象串行化的概念。
【知识点】
●I/O流概述
●文件处理
●过滤流
●字符流的处理
●对象的串行化
●其它常用的流
【内容】
第一节数据流的基本概念
Ø理解数据流
流一般分为输入流(InputStream)和输出流(OutputStream)两类,但这种划分并不是绝对的。
比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。
当然,键盘只是一个数人流,而屏幕则只是一个输出流。
ØJava的标准数据流
标准输入输出指在字符方式下(如DOS),程序与系统进行交互的方式,分为三种:
标准输入studin,对象是键盘。
标准输出stdout,对象是屏幕。
标准错误输出stderr,对象也是屏幕。
例8.1从键盘输入字符。
本例用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,count保存实际读入的字节个数,再以整数和字符两种方式输出buffer中的值。
Read方法在java.io包中,而且要抛出IOException异常。
程序如下:
importjava.io.*;
publicclassInput1
{
publicstaticvoidmain(Stringargs[])throwsIOException
System.out.println("Input:
");
bytebuffer[]=newbyte[512];//输入缓冲区
intcount=System.in.read(buffer);//读取标准输入流
System.out.println("Output:
for(inti=0;i{System.out.print(""+buffer[i]);}System.out.println();for(inti=0;i{System.out.print((char)buffer[i]);}System.out.println("count="+count);//buffer实际长度}}程序中,main方法采用throws子句抛出IOException异常交由系统处理。ØJava.io包中的数据流及文件类字节流: 从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。●InputStream、OutputStream●◇FileInputStream、FileOutputStream●◇PipedInputStream、PipedOutputStream●◇ByteArrayInputStream、ByteArrayOutputStream●◇FilterInputStream、FilterOutputStream●◇DataInputStream、DataOutputStream●◇BufferedInputStream、BufferedOutputStream字符流: 从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位ØReader、WriterØ◇InputStreamReader、OutputStreamWriterØ◇FileReader、FileWriterØ◇CharArrayReader、CharArrayWriterØ◇PipedReader、PipedWriterØ◇FilterReader、FilterWriterØ◇BufferedReader、BufferedWriterØ◇StringReader、StringWriter第二节字节流初步InputStream和OutputStream●read():从流中读入数据●skip():跳过流中若干字节数●available():返回流中可用字节数●mark():在流中标记一个位置●reset():返回标记过得位置●markSupport():是否支持标记和复位操作●close():关闭流●intread()从输入流中读一个字节,形成一个0~255之间的整数返回(是一个抽象方法)。●intread(byteb[])读多个字节到数组中。●intread(byteb[],intoff,intlen)●write(intb)将一个整数输出到流中(只输出低位字节,抽象)●write(byteb[])将字节数组中的数据输出到流中●write(byteb[],intoff,intlen)将数组b中从off指定的位置开始,长度为len的数据输出到流中●flush():刷空输出流,并将缓冲区中的数据强制送出●close():关闭流从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取得字节数。进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。如:型FileNotFoundException,EOFException,IOException例8.2打开文件。本例以FileInputStream的read(buffer)方法,每次从源程序文件OpenFile.java中读取512个字节,存储在缓冲区buffer中,再将以buffer中的值构造的字符串newString(buffer)显示在屏幕上。程序如下:importjava.io.*;publicclassOpenFile{publicstaticvoidmain(Stringargs[])throwsIOException{try{//创建文件输入流对象FileInputStreamrf=newFileInputStream("OpenFile.java");intn=512;bytebuffer[]=newbyte[n];while((rf.read(buffer,0,n)!=-1)&&(n>0))//读取输入流{System.out.print(newString(buffer));}System.out.println();rf.close();//关闭输入流}catch(IOExceptionioe){System.out.println(ioe);}catch(Exceptione){System.out.println(e);}}}例8.3写入文件。本例用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,再以FileOutStream的write(buffer)方法,将buffer中内容写入文件Write1.txt中,程序如下:importjava.io.*;publicclassWrite1{publicstaticvoidmain(Stringargs[]){try{System.out.print("Input:");intcount,n=512;bytebuffer[]=newbyte[n];count=System.in.read(buffer);//读取标准输入流FileOutputStreamwf=newFileOutputStream("Write1.txt");//创建文件输出流对象wf.write(buffer,0,count);//写入输出流wf.close();//关闭输出流System.out.println("SavetoWrite1.txt!");}catch(IOExceptionioe){System.out.println(ioe);}catch(Exceptione){System.out.println(e);}}}第三节文件操作ØFile类File类声明如下:publicclassFileectendsObjectimplementsSerializable,Comparable构造方法:publicFile(Stringpathname)publicFile(Filepatent,Stringchile)publicFile(Stringpatent,Stringchild)文件名的处理ØStringgetName();//得到一个文件的名称(不包括路径)ØStringgetPath();//得到一个文件的路径名ØStringgetAbsolutePath();//得到一个文件的绝对路径名ØStringgetParent();//得到一个文件的上一级目录名ØStringrenameTo(FilenewName);//将当前文件名更名为给定文件的完整路径文件属性测试Øbooleanexists();//测试当前File对象所指示的文件是否存在ØbooleancanWrite();//测试当前文件是否可写ØbooleancanRead();//测试当前文件是否可读ØbooleanisFile();//测试当前文件是否是文件(不是目录)ØbooleanisDirectory();//测试当前文件是否是目录普通文件信息和工具ØlonglastModified();//得到文件最近一次修改的时间Ølonglength();//得到文件的长度,以字节为单位Øbooleandelete();//删除当前文件目录操作vbooleanmkdir();//根据当前对象生成一个由该对象指定的路径vStringlist();//列出当前目录下的文件例8.4自动更新文件。本例使用File类对象对指定文件进行自动更新的操作。程序如下:importjava.io.*;importjava.util.Date;importjava.text.SimpleDateFormat;publicclassUpdateFile{publicstaticvoidmain(Stringargs[])throwsIOException{Stringfname="Write1.txt";//待复制的文件名Stringchilddir="backup";//子目录名newUpdateFile().update(fname,childdir);}publicvoidupdate(Stringfname,Stringchilddir)throwsIOException{Filef1,f2,child;f1=newFile(fname);//当前目录中创建文件对象f1child=newFile(childdir);//当前目录中创建文件对象childif(f1.exists()){if(!child.exists())//child不存在时创建子目录child.mkdir();f2=newFile(child,fname);//在子目录child中创建文件f2if(!f2.exists()||//f2不存在时或存在但日期较早时f2.exists()&&(f1.lastModified()>f2.lastModified()))copy(f1,f2);//复制getinfo(f1);getinfo(child);}elseSystem.out.println(f1.getName()+"filenotfound!");}publicvoidcopy(Filef1,Filef2)throwsIOException{//创建文件输入流对象FileInputStreamrf=newFileInputStream(f1);FileOutputStreamwf=newFileOutputStream(f2);//创建文件输出流对象intcount,n=512;bytebuffer[]=newbyte[n];count=rf.read(buffer,0,n);//读取输入流while(count!=-1){wf.write(buffer,0,count);//写入输出流count=rf.read(buffer,0,n);}System.out.println("CopyFile"+f2.getName()+"!");rf.close();//关闭输入流wf.close();//关闭输出流}publicstaticvoidgetinfo(Filef1)throwsIOException{SimpleDateFormatsdf;sdf=newSimpleDateFormat("yyyy年MM月dd日hh时mm分");if(f1.isFile())System.out.println("\t"+f1.getAbsolutePath()+"\t"+f1.length()+"\t"+sdf.format(newDate(f1.lastModified())));else{System.out.println("\t"+f1.getAbsolutePath());File[]files=f1.listFiles();for(inti=0;igetinfo(files[i]);}}}f1.lastModified()返回一个表示日期的长整型,值为从1970年1月1日零时开始计算的毫秒数,并以此长整型构造一个日期对象,再按指定格式输出日期。程序运行结果如下:D:\myjava\Write1.txt62002年12月11日02时18分D:\myjava\backupD:\myjava\backup\Write1.txt62002年12月31日05时13分Ø文件过滤器类FilterInputStream和FilterOutputStream分别对其他输入/输出流进行特殊处理,它们在读/写数据的同时可以对数据进行特殊处理。另外还提供了同步机制,使得某一时刻只有一个线程可以访问一个输入/输出流类FilterInputStream和FilterOutputStream分别重写了父类InputStream和OutputStream的所有方法,同时,它们的子类也应该重写它们的方法以满足特定的需要•要使用过滤流,首先必须把它连接到某个输入/输出流上,通常在构造方法的参数中指定所要连接的流:–FilterInputStream(InputStreamin);–FilterOutputStream(OutputStreamout);这两个类是抽象类,构造方法也是保护方法类BufferedInputStream和BufferedOutputStream实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高读写效率•在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。缺省大小的缓冲区适合于通常的情形;最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间以及机器的配置等;一般缓冲区的大小为内存页或磁盘块等地整数倍,如8912字节或更小。–BufferedInputStream(InputStreamin[,intsize])–BufferedOutputStream(OutputStreamout[,intsize])例8.5列出当前目录中带过滤器的文件名清单。本例实现FilenameFilter接口中的accept方法,在当前目录中列出带过滤器的文件名。程序如下:importjava.io.*;publicclassDirFilterimplementsFilenameFilter{privateStringprefix="",suffix="";//文件名的前缀、后缀publicDirFilter(Stringfilterstr){filterstr=filterstr.toLowerCase();inti=filterstr.indexOf('*');intj=filterstr.indexOf('.');if(i>0)prefix=filterstr.substring(0,i);if(j>0)suffix=filterstr.substring(j+1);}publicstaticvoidmain(Stringargs[]){//创建带通配符的文件名过滤器对象FilenameFilterfilter=newDirFilter("w*abc.txt");Filef1=newFile("");Filecurdir=newFile(f1.getAbsolutePath(),"");//当前目录System.out.println(curdir.getAbsolutePath());String[]str=curdir.list(filter);//列出带过滤器的文件名清单for(inti=0;iSystem.out.println("\t"+str[i]);}publicbooleanaccept(Filedir,Stringfilename){booleanyes=true;try{filename=filename.toLowerCase();yes=(filename.startsWith(prefix))&(filename.endsWith(suffix));}catch(NullPointerExceptione){}returnyes;}}程序运行时,列出当前目录中符合过滤条件“w*.txt“的文件名清单。结果如下:D:\myjavaWrite1.txtWrite2.txtØ文件对话框Ø随机文件操作于InputStream和OutputStream来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。随机访问文件则允许对文件内容进行随机读/写。在java中,类RandomAccessFile提供了随机访问文件的方法。类RandomAccessFile的声明为:publicclassRandomAccessFileextendsObjectimplementsDataInput,DataOutputFile:以文件路径名的形式代表一个文件FileDescriptor:代表一个打开文件的文件描述FileFilter&FilenameFilter:用于列出满足条件的文件File.list(FilenameFilterfnf)File.listFiles(FileFilterff)FileDialog.setFilenameFilter(FilenameFilterfnf)•FileInputStream&FileReader:顺序读文件•FileOutputStream&FileWriter:顺序写文件•RandomAccessFile:提供对文件的随机访问支持类RandomAccessFile则允许对文件内容同时完成读和写操作,它直接继承Object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法ØDataInput和DataOutput中的方法•readInt(),writeDouble()…ØintskipBytes(intn):将指针乡下移动若干字节Ølength():返回文件长度ØlonggetFilePointer():返回指针当前位置Øvoidseek(longpos):将指针调到所需位置ØvoidsetLength(longnewLength):设定文件长度构造方法:RandomAccessFile(Filefile,Stringmode)RandomAccessFile(Stringname,Stringmode)mode的取值–“r”只读.任何写操作都将抛出IOException。–“rw”读写.文件不存在时会创建该文件,文件存在时,原文件内容不变,通过写操作改变文件内容。–“rws”同步读写.等同于读写,但是任何协操作的内容都被直接写入物理文件,包括文件内容和文件属性。–“rwd”数据同步读写.等同于读写,但任何内容写操作都直接写到物理文件,对文件属性内容的修改不是这样。例8.6随机文件操作。本例对一个二进制整数文件实现访问操作当以可读写方式“rw“打开一个文件”prinmes.bin“时,如果文件不存在,将创建一个新文件。先将2作为最小
System.out.print(""+buffer[i]);
}
System.out.println();
for(inti=0;i{System.out.print((char)buffer[i]);}System.out.println("count="+count);//buffer实际长度}}程序中,main方法采用throws子句抛出IOException异常交由系统处理。ØJava.io包中的数据流及文件类字节流: 从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。●InputStream、OutputStream●◇FileInputStream、FileOutputStream●◇PipedInputStream、PipedOutputStream●◇ByteArrayInputStream、ByteArrayOutputStream●◇FilterInputStream、FilterOutputStream●◇DataInputStream、DataOutputStream●◇BufferedInputStream、BufferedOutputStream字符流: 从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位ØReader、WriterØ◇InputStreamReader、OutputStreamWriterØ◇FileReader、FileWriterØ◇CharArrayReader、CharArrayWriterØ◇PipedReader、PipedWriterØ◇FilterReader、FilterWriterØ◇BufferedReader、BufferedWriterØ◇StringReader、StringWriter第二节字节流初步InputStream和OutputStream●read():从流中读入数据●skip():跳过流中若干字节数●available():返回流中可用字节数●mark():在流中标记一个位置●reset():返回标记过得位置●markSupport():是否支持标记和复位操作●close():关闭流●intread()从输入流中读一个字节,形成一个0~255之间的整数返回(是一个抽象方法)。●intread(byteb[])读多个字节到数组中。●intread(byteb[],intoff,intlen)●write(intb)将一个整数输出到流中(只输出低位字节,抽象)●write(byteb[])将字节数组中的数据输出到流中●write(byteb[],intoff,intlen)将数组b中从off指定的位置开始,长度为len的数据输出到流中●flush():刷空输出流,并将缓冲区中的数据强制送出●close():关闭流从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取得字节数。进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。如:型FileNotFoundException,EOFException,IOException例8.2打开文件。本例以FileInputStream的read(buffer)方法,每次从源程序文件OpenFile.java中读取512个字节,存储在缓冲区buffer中,再将以buffer中的值构造的字符串newString(buffer)显示在屏幕上。程序如下:importjava.io.*;publicclassOpenFile{publicstaticvoidmain(Stringargs[])throwsIOException{try{//创建文件输入流对象FileInputStreamrf=newFileInputStream("OpenFile.java");intn=512;bytebuffer[]=newbyte[n];while((rf.read(buffer,0,n)!=-1)&&(n>0))//读取输入流{System.out.print(newString(buffer));}System.out.println();rf.close();//关闭输入流}catch(IOExceptionioe){System.out.println(ioe);}catch(Exceptione){System.out.println(e);}}}例8.3写入文件。本例用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,再以FileOutStream的write(buffer)方法,将buffer中内容写入文件Write1.txt中,程序如下:importjava.io.*;publicclassWrite1{publicstaticvoidmain(Stringargs[]){try{System.out.print("Input:");intcount,n=512;bytebuffer[]=newbyte[n];count=System.in.read(buffer);//读取标准输入流FileOutputStreamwf=newFileOutputStream("Write1.txt");//创建文件输出流对象wf.write(buffer,0,count);//写入输出流wf.close();//关闭输出流System.out.println("SavetoWrite1.txt!");}catch(IOExceptionioe){System.out.println(ioe);}catch(Exceptione){System.out.println(e);}}}第三节文件操作ØFile类File类声明如下:publicclassFileectendsObjectimplementsSerializable,Comparable构造方法:publicFile(Stringpathname)publicFile(Filepatent,Stringchile)publicFile(Stringpatent,Stringchild)文件名的处理ØStringgetName();//得到一个文件的名称(不包括路径)ØStringgetPath();//得到一个文件的路径名ØStringgetAbsolutePath();//得到一个文件的绝对路径名ØStringgetParent();//得到一个文件的上一级目录名ØStringrenameTo(FilenewName);//将当前文件名更名为给定文件的完整路径文件属性测试Øbooleanexists();//测试当前File对象所指示的文件是否存在ØbooleancanWrite();//测试当前文件是否可写ØbooleancanRead();//测试当前文件是否可读ØbooleanisFile();//测试当前文件是否是文件(不是目录)ØbooleanisDirectory();//测试当前文件是否是目录普通文件信息和工具ØlonglastModified();//得到文件最近一次修改的时间Ølonglength();//得到文件的长度,以字节为单位Øbooleandelete();//删除当前文件目录操作vbooleanmkdir();//根据当前对象生成一个由该对象指定的路径vStringlist();//列出当前目录下的文件例8.4自动更新文件。本例使用File类对象对指定文件进行自动更新的操作。程序如下:importjava.io.*;importjava.util.Date;importjava.text.SimpleDateFormat;publicclassUpdateFile{publicstaticvoidmain(Stringargs[])throwsIOException{Stringfname="Write1.txt";//待复制的文件名Stringchilddir="backup";//子目录名newUpdateFile().update(fname,childdir);}publicvoidupdate(Stringfname,Stringchilddir)throwsIOException{Filef1,f2,child;f1=newFile(fname);//当前目录中创建文件对象f1child=newFile(childdir);//当前目录中创建文件对象childif(f1.exists()){if(!child.exists())//child不存在时创建子目录child.mkdir();f2=newFile(child,fname);//在子目录child中创建文件f2if(!f2.exists()||//f2不存在时或存在但日期较早时f2.exists()&&(f1.lastModified()>f2.lastModified()))copy(f1,f2);//复制getinfo(f1);getinfo(child);}elseSystem.out.println(f1.getName()+"filenotfound!");}publicvoidcopy(Filef1,Filef2)throwsIOException{//创建文件输入流对象FileInputStreamrf=newFileInputStream(f1);FileOutputStreamwf=newFileOutputStream(f2);//创建文件输出流对象intcount,n=512;bytebuffer[]=newbyte[n];count=rf.read(buffer,0,n);//读取输入流while(count!=-1){wf.write(buffer,0,count);//写入输出流count=rf.read(buffer,0,n);}System.out.println("CopyFile"+f2.getName()+"!");rf.close();//关闭输入流wf.close();//关闭输出流}publicstaticvoidgetinfo(Filef1)throwsIOException{SimpleDateFormatsdf;sdf=newSimpleDateFormat("yyyy年MM月dd日hh时mm分");if(f1.isFile())System.out.println("\t"+f1.getAbsolutePath()+"\t"+f1.length()+"\t"+sdf.format(newDate(f1.lastModified())));else{System.out.println("\t"+f1.getAbsolutePath());
System.out.print((char)buffer[i]);
System.out.println("count="+count);//buffer实际长度
程序中,main方法采用throws子句抛出IOException异常交由系统处理。
ØJava.io包中的数据流及文件类
字节流:
从InputStream和OutputStream派生出来的一系列类。
这类流以字节(byte)为基本处理单位。
●InputStream、OutputStream
●◇FileInputStream、FileOutputStream
●◇PipedInputStream、PipedOutputStream
●◇ByteArrayInputStream、ByteArrayOutputStream
●◇FilterInputStream、FilterOutputStream
●◇DataInputStream、DataOutputStream
●◇BufferedInputStream、BufferedOutputStream
字符流:
从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位
ØReader、Writer
Ø◇InputStreamReader、OutputStreamWriter
Ø◇FileReader、FileWriter
Ø◇CharArrayReader、CharArrayWriter
Ø◇PipedReader、PipedWriter
Ø◇FilterReader、FilterWriter
Ø◇BufferedReader、BufferedWriter
Ø◇StringReader、StringWriter
第二节字节流初步
InputStream和OutputStream
●read():
从流中读入数据
●skip():
跳过流中若干字节数
●available():
返回流中可用字节数
●mark():
在流中标记一个位置
●reset():
返回标记过得位置
●markSupport():
是否支持标记和复位操作
●close():
关闭流
●intread()
从输入流中读一个字节,形成一个0~255之间的整数返回(是一个抽象方法)。
●intread(byteb[])
读多个字节到数组中。
●intread(byteb[],intoff,intlen)
●write(intb)
将一个整数输出到流中(只输出低位字节,抽象)
●write(byteb[])
将字节数组中的数据输出到流中
●write(byteb[],intoff,intlen)
将数组b中从off指定的位置开始,长度为len的数据输出到流中
●flush():
刷空输出流,并将缓冲区中的数据强制送出
从输入流中读取长度为len的数据,写入数组b中从索引off开始的位置,并返回读取得字节数。
进行I/O操作时可能会产生I/O例外,属于非运行时例外,应该在程序中处理。
如:
型FileNotFoundException,EOFException,IOException
例8.2打开文件。
本例以FileInputStream的read(buffer)方法,每次从源程序文件OpenFile.java中读取512个字节,存储在缓冲区buffer中,再将以buffer中的值构造的字符串newString(buffer)显示在屏幕上。
publicclassOpenFile
try
{//创建文件输入流对象
FileInputStreamrf=newFileInputStream("OpenFile.java");
intn=512;
bytebuffer[]=newbyte[n];
while((rf.read(buffer,0,n)!
=-1)&&(n>0))//读取输入流
System.out.print(newString(buffer));
rf.close();//关闭输入流
catch(IOExceptionioe)
System.out.println(ioe);
catch(Exceptione)
System.out.println(e);
例8.3写入文件。
本例用System.in.read(buffer)从键盘输入一行字符,存储在缓冲区buffer中,再以FileOutStream的write(buffer)方法,将buffer中内容写入文件Write1.txt中,程序如下:
publicclassWrite1
publicstaticvoidmain(Stringargs[])
System.out.print("Input:
intcount,n=512;
count=System.in.read(buffer);//读取标准输入流
FileOutputStreamwf=newFileOutputStream("Write1.txt");
//创建文件输出流对象
wf.write(buffer,0,count);//写入输出流
wf.close();//关闭输出流
System.out.println("SavetoWrite1.txt!
第三节文件操作
ØFile类
File类声明如下:
publicclassFileectendsObjectimplementsSerializable,Comparable
构造方法:
publicFile(Stringpathname)
publicFile(Filepatent,Stringchile)
publicFile(Stringpatent,Stringchild)
文件名的处理
ØStringgetName();//得到一个文件的名称(不包括路径)
ØStringgetPath();//得到一个文件的路径名
ØStringgetAbsolutePath();//得到一个文件的绝对路径名
ØStringgetParent();//得到一个文件的上一级目录名
ØStringrenameTo(FilenewName);//将当前文件名更名为给定文件的完整路径
文件属性测试
Øbooleanexists();//测试当前File对象所指示的文件是否存在
ØbooleancanWrite();//测试当前文件是否可写
ØbooleancanRead();//测试当前文件是否可读
ØbooleanisFile();//测试当前文件是否是文件(不是目录)
ØbooleanisDirectory();//测试当前文件是否是目录
普通文件信息和工具
ØlonglastModified();//得到文件最近一次修改的时间
Ølonglength();//得到文件的长度,以字节为单位
Øbooleandelete();//删除当前文件
目录操作
vbooleanmkdir();//根据当前对象生成一个由该对象指定的路径
vStringlist();//列出当前目录下的文件
例8.4自动更新文件。
本例使用File类对象对指定文件进行自动更新的操作。
importjava.util.Date;
importjava.text.SimpleDateFormat;
publicclassUpdateFile
Stringfname="Write1.txt";//待复制的文件名
Stringchilddir="backup";//子目录名
newUpdateFile().update(fname,childdir);
publicvoidupdate(Stringfname,Stringchilddir)throwsIOException
Filef1,f2,child;
f1=newFile(fname);//当前目录中创建文件对象f1
child=newFile(childdir);//当前目录中创建文件对象child
if(f1.exists())
if(!
child.exists())//child不存在时创建子目录
child.mkdir();
f2=newFile(child,fname);//在子目录child中创建文件f2
f2.exists()||//f2不存在时或存在但日期较早时
f2.exists()&&(f1.lastModified()>f2.lastModified()))
copy(f1,f2);//复制
getinfo(f1);
getinfo(child);
else
System.out.println(f1.getName()+"filenotfound!
publicvoidcopy(Filef1,Filef2)throwsIOException
FileInputStreamrf=newFileInputStream(f1);
FileOutputStreamwf=newFileOutputStream(f2);
count=rf.read(buffer,0,n);//读取输入流
while(count!
=-1)
count=rf.read(buffer,0,n);
System.out.println("CopyFile"+f2.getName()+"!
publicstaticvoidgetinfo(Filef1)throwsIOException
SimpleDateFormatsdf;
sdf=newSimpleDateFormat("yyyy年MM月dd日hh时mm分");
if(f1.isFile())
System.out.println("\t"+f1.getAbsolutePath()+"\t"+
f1.length()+"\t"+sdf.format(newDate(f1.lastModified())));
System.out.println("
File[]files=f1.listFiles();
for(inti=0;igetinfo(files[i]);}}}f1.lastModified()返回一个表示日期的长整型,值为从1970年1月1日零时开始计算的毫秒数,并以此长整型构造一个日期对象,再按指定格式输出日期。程序运行结果如下:D:\myjava\Write1.txt62002年12月11日02时18分D:
getinfo(files[i]);
f1.lastModified()返回一个表示日期的长整型,值为从1970年1月1日零时开始计算的毫秒数,并以此长整型构造一个日期对象,再按指定格式输出日期。
程序运行结果如下:
D:
\myjava\Write1.txt62002年12月11日02时18分
\myjava\backup
\myjava\backup\Write1.txt62002年12月31日05时13分
Ø文件过滤器
类FilterInputStream和FilterOutputStream分别对其他输入/输出流进行特殊处理,它们在读/写数据的同时可以对数据进行特殊处理。
另外还提供了同步机制,使得某一时刻只有一个线程可以访问一个输入/输出流
类FilterInputStream和FilterOutputStream分别重写了父类InputStream和OutputStream的所有方法,同时,它们的子类也应该重写它们的方法以满足特定的需要
•要使用过滤流,首先必须把它连接到某个输入/输出流上,通常在构造方法的参数中指定所要连接的流:
–FilterInputStream(InputStreamin);
–FilterOutputStream(OutputStreamout);
这两个类是抽象类,构造方法也是保护方法
类BufferedInputStream和BufferedOutputStream实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高读写效率
•在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。
缺省大小的缓冲区适合于通常的情形;最优的缓冲区大小常依赖于主机操作系统、可使用的内存空间以及机器的配置等;一般缓冲区的大小为内存页或磁盘块等地整数倍,如8912字节或更小。
–BufferedInputStream(InputStreamin[,intsize])
–BufferedOutputStream(OutputStreamout[,intsize])
例8.5列出当前目录中带过滤器的文件名清单。
本例实现FilenameFilter接口中的accept方法,在当前目录中列出带过滤器的文件名。
publicclassDirFilterimplementsFilenameFilter
privateStringprefix="",suffix="";//文件名的前缀、后缀
publicDirFilter(Stringfilterstr)
filterstr=filterstr.toLowerCase();
inti=filterstr.indexOf('*');
intj=filterstr.indexOf('.');
if(i>0)
prefix=filterstr.substring(0,i);
if(j>0)
suffix=filterstr.substring(j+1);
{//创建带通配符的文件名过滤器对象
FilenameFilterfilter=newDirFilter("w*abc.txt");
Filef1=newFile("");
Filecurdir=newFile(f1.getAbsolutePath(),"");//当前目录
System.out.println(curdir.getAbsolutePath());
String[]str=curdir.list(filter);//列出带过滤器的文件名清单
for(inti=0;iSystem.out.println("\t"+str[i]);}publicbooleanaccept(Filedir,Stringfilename){booleanyes=true;try{filename=filename.toLowerCase();yes=(filename.startsWith(prefix))&(filename.endsWith(suffix));}catch(NullPointerExceptione){}returnyes;}}程序运行时,列出当前目录中符合过滤条件“w*.txt“的文件名清单。结果如下:D:\myjavaWrite1.txtWrite2.txtØ文件对话框Ø随机文件操作于InputStream和OutputStream来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。随机访问文件则允许对文件内容进行随机读/写。在java中,类RandomAccessFile提供了随机访问文件的方法。类RandomAccessFile的声明为:publicclassRandomAccessFileextendsObjectimplementsDataInput,DataOutputFile:以文件路径名的形式代表一个文件FileDescriptor:代表一个打开文件的文件描述FileFilter&FilenameFilter:用于列出满足条件的文件File.list(FilenameFilterfnf)File.listFiles(FileFilterff)FileDialog.setFilenameFilter(FilenameFilterfnf)•FileInputStream&FileReader:顺序读文件•FileOutputStream&FileWriter:顺序写文件•RandomAccessFile:提供对文件的随机访问支持类RandomAccessFile则允许对文件内容同时完成读和写操作,它直接继承Object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法ØDataInput和DataOutput中的方法•readInt(),writeDouble()…ØintskipBytes(intn):将指针乡下移动若干字节Ølength():返回文件长度ØlonggetFilePointer():返回指针当前位置Øvoidseek(longpos):将指针调到所需位置ØvoidsetLength(longnewLength):设定文件长度构造方法:RandomAccessFile(Filefile,Stringmode)RandomAccessFile(Stringname,Stringmode)mode的取值–“r”只读.任何写操作都将抛出IOException。–“rw”读写.文件不存在时会创建该文件,文件存在时,原文件内容不变,通过写操作改变文件内容。–“rws”同步读写.等同于读写,但是任何协操作的内容都被直接写入物理文件,包括文件内容和文件属性。–“rwd”数据同步读写.等同于读写,但任何内容写操作都直接写到物理文件,对文件属性内容的修改不是这样。例8.6随机文件操作。本例对一个二进制整数文件实现访问操作当以可读写方式“rw“打开一个文件”prinmes.bin“时,如果文件不存在,将创建一个新文件。先将2作为最小
System.out.println("\t"+str[i]);
publicbooleanaccept(Filedir,Stringfilename)
booleanyes=true;
filename=filename.toLowerCase();
yes=(filename.startsWith(prefix))&
(filename.endsWith(suffix));
catch(NullPointerExceptione)
returnyes;
程序运行时,列出当前目录中符合过滤条件“w*.txt“的文件名清单。
结果如下:
\myjava
Write1.txt
Write2.txt
Ø文件对话框
Ø随机文件操作
于InputStream和OutputStream来说,它们的实例都是顺序访问流,也就是说,只能对文件进行顺序地读/写。
随机访问文件则允许对文件内容进行随机读/写。
在java中,类RandomAccessFile提供了随机访问文件的方法。
类RandomAccessFile的声明为:
publicclassRandomAccessFileextendsObjectimplementsDataInput,DataOutput
File:
以文件路径名的形式代表一个文件
FileDescriptor:
代表一个打开文件的文件描述
FileFilter&FilenameFilter:
用于列出满足条件的文件
File.list(FilenameFilterfnf)
File.listFiles(FileFilterff)
FileDialog.setFilenameFilter(FilenameFilterfnf)
•FileInputStream&FileReader:
顺序读文件
•FileOutputStream&FileWriter:
顺序写文件
•RandomAccessFile:
提供对文件的随机访问支持
类RandomAccessFile则允许对文件内容同时完成读和写操作,它直接继承Object,并且同时实现了接口DataInput和DataOutput,提供了支持随机文件操作的方法
ØDataInput和DataOutput中的方法
•readInt(),writeDouble()…
ØintskipBytes(intn):
将指针乡下移动若干字节
Ølength():
返回文件长度
ØlonggetFilePointer():
返回指针当前位置
Øvoidseek(longpos):
将指针调到所需位置
ØvoidsetLength(longnewLength):
设定文件长度
RandomAccessFile(Filefile,Stringmode)
RandomAccessFile(Stringname,Stringmode)
mode的取值
–“r”只读.任何写操作都将抛出IOException。
–“rw”读写.文件不存在时会创建该文件,文件存在时,原文件内容不变,通过写操作改变文件内容。
–“rws”同步读写.等同于读写,但是任何协操作的内容都被直接写入物理文件,包括文件内容和文件属性。
–“rwd”数据同步读写.等同于读写,但任何内容写操作都直接写到物理文件,对文件属性内容的修改不是这样。
例8.6随机文件操作。
本例对一个二进制整数文件实现访问操作当以可读写方式“rw“打开一个文件”prinmes.bin“时,如果文件不存在,将创建一个新文件。
先将2作为最小
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2