




已阅读5页,还剩79页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Java程序设计,JavaProgrammingFall,2010,2/84,JavaI/O,Java输入输出简介java.ioFileClassRandomAccessFileClassInputStream,5/84,流的类结构,流的实现是在java.io包的类层次结构上。以四个顶层抽象类为基础,衍生出系列具体的类,来完成各种输入/输出。InputStream,OutputStream:用于字节的读/写。Reader,Writer:用于文本(字符)的读/写。实际使用的是它们的子类的对象。,6/84,FileClass,Fundamentalclass:FileRepresentseitherafile(文件)oradir(文件夹)locationinafilesystemThroughitspathnameApathnameUnix:/usr/java/bin/javacWindows:c:javabinjavac,7/84,Java文件路径的表示:Java约定是用UNIX和URL风格的斜线(/)来作路径分隔符;如果用Windows/DOS所使用的反斜线()的约定,则需要在字符串内使用它的转义序列()。,8/84,importjava.io.*;publicclassProvapublicstaticvoidmain(Stringarg)System.out.println(File.separator+-+File.separatorChar+-+File.pathSeparator+-+File.pathSeparatorChar);Output(inWindows)-;-;Output(inUnix):/-/-:-:,Testing-separator,9/84,File类,java.io包中的File类提供了获得文件基本信息及文件操作的方法。通过File类,可以建立与磁盘文件的联系;可以用来获取或设置文件或目录的属性,但不支持从文件里读取数据或者往文件里写数据。构造方法File(Stringfilename);File(StringdirectoryPath,Stringfilename);File(Filef,Stringfilename);,10/84,File类的常用方法,文件的属性publicbooleancanRead():判断文件是否是可读的。publicbooleancanWrite():判断文件是否可被写入。publicbooleanexits():判断文件是否存在。publicbooleanisFile():判断文件是否是一个正常文件,而不是目录。publicbooleanisDirectroy():判断文件是否是一个目录。,11/84,File类的常用方法,获取文件的名称、路径publicStringgetName():获取文件的名字。publicStringgetPath():得到文件的路径名。publicStringgetAbsolutePath():得到文件的绝对路径名。publicStringgetParent():得到文件的上一级目录名。,12/84,File类的常用方法,获取文件处理信息publiclonglength():获取文件的长度(单位是字节)。publiclonglastModified():获取文件最后修改时间。publicbooleandelete():删除文件。,13/84,File类的常用方法,目录操作创建一个名为File的目录:publicbooleanmkdir()列出目录中的文件publicStringlist()publicFilelistFiles()在目录中创建文件publicbooleancreateNewFile(),14/84,/创建文件夹和文件Filefile2=newFile(e:/java);Filefile1=newFile(file2,test.txt);file2.mkdir();file1.createNewFile();,Filefiles=file2.listFiles();for(inti=0;i从输入流中读取字节3关闭流常用构造方法publicFileInputStream(Stringname)throwsFileNotFoundExceptionpublicFileInputStream(Filefile)throwsFileNotFoundException均会抛出FileNotFoundException异常构造方法参数指定的文件称作输入流的源FileInputStreamfin=newFileInputStream(“c:javatest.java”);,49/84,FileInputStream:文件字节流的读取,read方法给程序提供从输入流中读取数据的基本方法。read方法的格式publicintread()throwsIOException从输入流中顺序读取单个字节的数据,如果已到达文件末尾,则返回-1。publicintread(byteb)throwsIOExceptionpublicintread(byteb,intoff,intlen)throwsIOException把多个字节读到一个字节数组中,返回实际所读的字节数。read方法将顺序读取流,直到流的末尾或流被关闭(close()方法)。,50/84,ExamplewithFileInputStream,/*classexampleFileIn.java*/importjava.io.*;publicclassFileInpublicstaticvoidmain(Stringargs)tryFileInputStreamfin=newFileInputStream(“c:javatest.java”);intinput;while(input=fin.read()!=-1)System.out.print(char)input);fin.close();catch(IOExceptionie)System.out.println(e);,51/84,FileOutputStream类,从OutputStream中派生出来,其所有方法都从OutputStream类继承来的。基本操作步骤:1建立文件的输出流对象2向输出流中写字节3关闭流常用构造方法publicFileOutputStream(Stringname)publicFileOutputStream(Filefile)FileOutputStreamfout=newFileOutputStream(“c:javatest.java”);,52/84,FileOutputStream类:文件字节流的输出,write方法把字节发送给输出流write方法的格式:publicvoidwrite(byteb)throwsIOExceptionpublicvoidwrite(byteb,intoff,intlen)throwsIOExceptionwrite方法将顺序地写文件,直到流的末尾或流被关闭(close()方法)如果输出流要写入数据的文件已经存在,该文件中的数据内容就会被刷新;如果要写入数据的文件不存在,该文件就会被建立。,53/84,/*例:编写程序,接收用户从键盘输入的数据,回车后保存到文件test.txt中。若用户输入符号#,则退出程序。*/importjava.io.*;publicclassWriteFilepublicstaticvoidmain(Stringargs)bytebuffer=newbyte128;System.out.println(请输入数据,回车后保存到文件test.txt);System.out.println(输入#则退出!);tryFileOutputStreamf=newFileOutputStream(test.txt);while(true)intn=System.in.read(buffer);if(buffer0=#)break;f.write(buffer,0,n);f.write(n);f.close();catch(IOExceptione)System.out.println(e.toString();,54/84,上例程序运行结果如图所示,55/84,例:使用FileInputStream类与FileOutputStream类复制文件。,/*classexampleFileIn_Out.java*/*assumeseachcharisasinglebyte*/importjava.io.*;publicclassFileIn_Outpublicstaticvoidmain(Stringargs)tryFileInputStreamfin=newFileInputStream(“c:javafile1.java”);FileOutputStreamfout=newFileOutputStream(“c:javafile2.java”);byteb=newbyte512;while(fin.read(b,0,512)!=-1)fout.write(b);fin.close();fout.close();catch(IOExceptionie)System.out.println(ie);catch(Exceptione)System.out.println(e);,56/84,7.3FileI/O,/FileandFileStream-FileStream.javaimportjava.io.*;classfilestreampublicstaticvoidmain(Stringargs)tryFileinFile=newFile(”file1.txt);FileoutFile=newFile(”file2.txt);FileInputStreamfis=newFileInputStream(inFile);FileOutputStreamfos=newFileOutputStream(outFile);intc;while(c=fis.read()!=-1)fos.write(c);fis.close();fos.close();catch(FileNotFoundExceptione)System.out.println(FileStreamsTest:+e);catch(IOExceptione)System.err.println(FileStreamsTest:+e);,57/84,文件I/OFileReaderclassFileInpublicstaticvoidmain(Stringargs)throwsIOExceptioninti;FileReaderfr;tryfr=newFileReader(D:workspacetestFileIn.java);while(i=fr.read()!=-1)System.out.print(char)i);fr.close();catch(FileNotFoundExceptione)System.out.println(FileNotFound);catch(ArrayIndexOutOfBoundsExceptione)System.out.println(Usage:ShowFileFile);,61/84,/FileReaderSample.javaimportjava.io.*;publicclassFileReaderSamplepublicstaticvoidmain(Stringargs)throwsIOException/建立可容纳1024个字符的数组chardata=newchar100;/建立对象frFileReaderfr=newFileReader(D:workspacetestcopy.txt);/将数据读入字符列表data内intnum=fr.read(data);/输出在控制台System.out.println(Charactersread=+num);for(inti=0;i建立文件的输出流对象2向输出流中写字符3关闭字符流常用构造方法publicFileWriter(Stringname)publicFileWriter(Filefile)均会抛出FileNotFoundException异常,63/84,FileWriter类:文件字符流的输出,write方法给程序提供把字符数据写入到输出流的基本方法。write方法的格式publicvoidwrite(charb)throwsIOExceptionpublicintwrite(charb,intoff,intlen)throwsIOExceptionpublicintwrite(Stringstr)throwsIOExceptionpublicintwrite(Stringstr,intoffset,intlen)throwsIOException,64/84,BufferedStream缓冲流,BufferedReader和BufferedWriter类被用来从基于字符的输入和输出流中读取和写入文本。BufferdReader类缓存字符以更高效的读取字符串,数组和文本行。BufferedWriter类缓存字符以更高效的写入字符串,数组和文本行,65/84,增加缓冲区流,减少访问硬盘的次数,提高效率,file1.txt,file2.txt,输入流,输出流,输入缓冲区,输出缓冲区,处理,AddBufferedStreamtoimproveperformance,BufferedStream缓冲流,66/84,缓冲流-BufferedReader类,Reader类的直接子类构造方法publicBufferedReader(Readerin,intsz)/sz为缓冲区的大小publicBufferedReader(Readerin)BufferedReader对象的创建先创建一个Reader子类的对象,然后使用这个对象来创建缓冲流对象。,FileReaderinOne=newFileReader(Student.txt);BufferedReaderinTwo=newBufferedReader(inOne);,任何Reader流都可以用来包装成缓冲流,67/84,缓冲流的读取publicintread()throwsIOException读取一个字符publicintreadLn()throwsIOException读取一行文本,读取完毕后,最好调用close()方法关闭流。,从缓冲区读取,缓冲流-BufferedReader类,68/84,BufferedWriter类,Writer类的直接子类构造方法publicBufferedWriter(Writerin,intsz)publicBufferedWriter(Readerin)BufferedWriter对象的创建先创建一个Writer子类的对象,然后使用这个对象来创建缓冲流对象。,FileWriteroutOne=newFileWriter(Student.txt);BufferedWriteroutTwo=newBufferedWriter(outOne);,69/84,BufferedWriter类,缓冲流的写入publicvoidwrite(Stringstr)throwsIOException向缓冲区写入一个字符串。publicintwriteLn(Stringstr,intoff,intlen)throwsIOException向缓冲区写入一个字符串的一部分。输出完毕后,最好调用close()方法关闭流。,70/84,/*ReadWriteFile.java-读出1.txt中的内容,写入2.txt中*/importjava.io.*;publicclassReadWriteFilepublicstaticvoidmain(Stringargs)tryFileread=newFile(“c:1.txt”);Filewrite=newFile(“c:2.txt”);BufferedReaderbr=newBufferedReader(newFileReader(read);BufferedWriterbw=newBufferedWriter(newFileWriter(write);Stringtemp=null;temp=br.readLine();while(temp!=null)/写文件bw.write(temp+“rn”);/只适用Windows系统temp=br.readLine();/继续读文件bw.close();br.close();catch(FileNotFoundExceptione)/文件未找到异常System.out.println(e);catch(IOExceptione)System.out.println(e);,71/84,/BufferedStream.javaimportjava.io.*;publicclassBufferedStreampublicstaticvoidmain(Stringargs)tryBufferedWriterout=newBufferedWriter(newFileWriter(D:test.txt);BufferedReaderin=newBufferedReader(newFileReader(D:test.txt);out.write(Hello,World);out.close();Strings;s=in.readLine();System.out.println(s);in.close();catch(Exceptione)System.out.println(error);,72/84,对象的寿命通常随着生成该对象的程序的终止而终止。某些时候,需要将对象的状态保存下来,将来需要的时候可以恢复。把对象的这种能记录自己的状态以便将来再生的能力,叫做对象的持续性(persistence)。对象通过写出描述自己状态的数值来记录自己的过程,叫做对象的串行化(Serialization)。串行化的主要任务是写出对象实例变量的数值。如果变量是另一对象的一引用,则引用的对象也要串行化。这个过程是递归的。对象串行化机制就是将程序中对象的状态转化为一个字节流,存储在文件中,作为这个对象的一个副本,之后再从文件中把对象读取出来重新建立。,串行化,73/84,Serializable接口,在java.io包中,接口Serializable用来作为实现对象串行化的工具,只有实现了Serializable的类的对象才可以被串行化。Serializable接口中不含有任何的方法声明,是个空接口。其定义如下:publicinterfaceSerializable实现Serializable接口,不需要编写任何的实现代码。这个接口只是一个特殊的标记,用来表示一个类可以被串行化。如果一个类可以串行化,它的所有子类都可以串行化。不参与串行化的数据可以用关键字transient来修饰。比如,通常出于安全性的考虑,某些不宜公开的数据(如用户的密码)用transient来修饰,能够使其不被串行化。用static修饰的静态成员变量与类对象无关,串行化过程也与之无关。有些对象,如Thread、FileInputStream、FileOutputStream等对象,其对象状态也是瞬时的,也不能进行串行化。,74/84,/Example:Serializable接口importjava.io.Serializable;publicclassStudentimplementsSerializableintid;Stringname;intage;Stringdepartment;publicStudent()publicStudent(intid,Stringname,intage,Stringdepartment)this.id=id;=name;this.age=age;this.department=department;,75/84,读写对象流ObjectInputStream和ObjectOutputStream,对象串行化(serialization)通过对象输出流将对象状态保存下来(将对象保存到文件中,或者通过网络传送到其他地方),反串行化(deserialization)再通过对象输入流将对象状态恢复。java.io包中,提供了ObjectInputStream和ObjectOutputStream,可读写对象。在ObjectInputStream中用readObject()方法可以直接读取一个对象,ObjectOutputStream中用writeObject()方法可以直接将对象保存到输出流中。,76/84,读写对象流,writeObject()用于对象的串行化。写出了重构一个类对象所需要的信息:对象的类、类的标记和非transient的对象成员,如果对象包含其他对象的引用,则这些对象也会被串行化。readObject()方法从字节流中反串行化对象,也就是将对象恢复过来。每次调用readObject()方法都返回流中下一个对象;对象的字节流并不包含类的字节码,只是包含类名及其签名,当readObject()读取对象时,Java虚拟机需要装载指定的类(恢复的对象的类),如果找不到这个类,则此方法会抛出ClassNotFoundException异常。,77/84,对象的串行化保存对象状态,Studentstu=newStudent(981036,”LiuMing”,18,“CSD”);FileOutputStreamfo=newFileOutputStream(data.ser);ObjectOutputStreamso=newObjectOutputStream(fo);tryso.writeObject(stu);so.close();catch(IOExceptione)System.out.println(e);,78/84,反串行化恢复对象状态,FileInputStreamfi=newFileInputStream(data.ser);ObjectInputStreamsi=newObjectInputStream(fi);trystu=(Student)si.readObject();si.close();catch(IOExceptione)System.out.println(e);,79/84,串行化的注意事项,串行化能保存的元素只能保存对象的非静态成员变量,不能保存任何的成员方法和静态的成员变量,而且串行化保存的只是变量的值,对于变量的任何修饰符,都不能保存。,80/84,importjava.io.*;publicclasstestpublicstaticvoidmain(Stringargs)throwsIOException,ClassNotFoundException/串行化Students1=newStudent(1,Mar,20,Computer_Science);Students3=newStudent(2,Cathy,21,Software_Engineering);FileOutputStreamfos=newFileOutputStream(D:serializationStudent.txt);ObjectOutputStreamoos=newObjectOutputStream(fos);oos.writeObject(s1);oos.writeObject(s3);Students2,s4;/反串行化FileInputStreamfis=newFileInputStream(D:serializationStudent.txt);ObjectInputStreamois=newObjectInputStream(fis);s2=(Student)ois.readObject();s4=(Student)ois.readObject();System.out.println(StudentInformation:);System.out.println(s2.id+“”++“+s2.age+“+s2.department);System.out.print(s4.id+“++“+s4.age+“+s4.department);oos.close();ois.close();,81/84,定制串行化,默认的串行化机制,对象串行化首先写入类数据和类字段的信息,然后按照名称的上升排列顺序写入其数值。如果想自己明确地控制这些数值的写入顺序和写入种类,必须定义自己的读取数据流的方式。就是在类的定义中重写writeObject()和readObject()方法。例如:在一个可以串行化的类中有一个不可串行化的对象,但又想保存该对象的状态信息该如何是好?例:ObjectSerialization.java,82/84,importjava.io.*;/Student类实现Serializable接口publicclassStudentimplementsSerializableintid;Stringname;intage;Stringdepartment;publicStudent(intid,Stringname,intage,Stringdepartment)this.id=id;=name;this.age=age;this.department=department;/一般可不重写,定制串行化时需要重写writeObject()方法privatevoidwriteObject(ObjectOutputStreamout)throwsIOExceptionout.writeInt(id);out.writeInt(age);out.writeUTF(name);out.writeUTF(department);/一般可不重写,定制串行化时需要重写r
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 东营分局考试题及答案
- 电子式考试题及答案
- 电梯安装考试题及答案
- 阅读之路上的风景11篇
- 等车侦探考试题及答案
- (正式版)DB15∕T 3273-2023 《紫苏种子生产技术规程》
- (正式版)DB15∕T 3253.8-2023 《食品生产加工小作坊生产规范 第8部分:酱腌菜制品》
- 成语的溯源及其在现代汉语中的应用教案
- 销售合同管理标准化模板及条款
- 企业采购审批流程与合规管理模板
- 法律援助法普法活动方案
- 食管恶性肿瘤护理查房
- 发热病人的护理课件
- 智能装备产业行动计划
- 新生儿湿疹护理与防治要点
- 高效农贸市场管理与运营合作协议
- 诸暨市家政服务员(母婴护理员)职业技能大赛技术文件
- CJ/T 81-2015机械搅拌澄清池搅拌机
- T/SHPTA 082-2024光伏组件封装用共挤EPE胶膜
- 企业合规经营及纳税证明书(5篇)
- 深圳入户委托协议书
评论
0/150
提交评论