《Java程序设计案例教程》第09章 输入与输出_第1页
《Java程序设计案例教程》第09章 输入与输出_第2页
《Java程序设计案例教程》第09章 输入与输出_第3页
《Java程序设计案例教程》第09章 输入与输出_第4页
《Java程序设计案例教程》第09章 输入与输出_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

程序设计第9章输入与输出目录2

9.1数据流的基本概念

9.2字节输入/输出流

9.3字符输入/输出流9.4文件处理

9.5对象串行化9.1数据流的基本概念I/O处理用流来表示3内存外设

(硬盘)流(管道)输入流(读入)输出流(写出)9.1.1输入/输出流输入输出流的分类按流的方向分类输入流输出流按流处理的数据单位不同分类字节流字符流按流的功能不同分类节点流处理流49.1.2输入/输出类输入输出流有关的类Java语言提供的与I/O流有关的类多达数十种,它们分为四大类字节输入流InputStream字节输出流OutputStream字符输入流Reader字符输出流Writer59.2字节输入/输出流以字节为单位对数据进行处理字节输入流从外设(硬盘)读取数据read()方法字节输出流将数据写出到外设(硬盘)write()方法适用于处理二进制文件可执行文件:*.exe、*.dll等图片图像文件:*.gif、*.jpg等特定格式的文件:*.doc、*.pdf等6FileInputStream类(1)FileInputStream类的构造方法通过文件file对象来创建一个FileInputStream对象publicFileInputStream(Filefile)throwsFileNotFoundException通过文件名为name的文件来创建一个FileInputStream对象publicFileInputStream(Stringname)throwsFileNotFoundException如果指定的文件不存在,或者因为其他原因无法进行文件读取,则会抛出FileNotFoundException的异常。7FileInputStream类(2)FileInputStream类的Read()方法从输入流中读取一个数据字节。如果已到达文件末尾,返回-1。publicintread()throwsIOException从输入流中将最多b.length个字节的数据读入到byte数组中。如果已到达文件末尾,返回-1。publicintread(byte[]b)throwsIOException对于这两个read()方法,如果读取文件时发生错误,则会抛出IOException的异常。8FileOutputStream类(1)FileOutputStream类的构造方法创建一个指向file文件中写入字节数据的FileOutputStream对象publicFileOutputStream(Filefile)throwsFileNotFoundException创建一个指向File文件中写入字节数据的FileOutputStream对象,且如果第2个参数为true,则将字节数据追加到文件末尾处,否则将字节数据写入文件开始处覆盖原有的文件publicFileOutputStream(Filefile,booleanappend)throwsFileNotFoundException创建一个向具体指定名称为name的文件中写入字节数据的FileOutputStream对象publicFileOutputStream(Stringname)throwsFileNotFoundException创建一个向具体指定名称为name的文件中写入字节数据的FileOutputStream对象,且如果第2个参数为true,则将字节数据追加到文件末尾处,否则将字节数据写入文件开始处覆盖原有的文件publicFileOutputStream(Stringname,booleanappend)throwsFileNotFoundException

对于这四个构造方法,如果指定的文件不存在,或者因为其他原因无法进行文件写入,则会抛出FileNotFoundException的异常。9FileOutputStream类(2)FileOutputStream类的Write()方法将指定字节写入文件输出流。write的常规协定是向输出流写入一个字节,要写入的字节是参数b的8个低位。publicvoidwrite(intb)throwsIOException将b.length个字节从byte数组写入文件输出流中。publicvoidwrite(byte[]b)throwsIOException对于这两个write()方法,如果写入文件时发生错误,则会抛出IOException的异常。10操作步骤11

FileInputStreamfis=null;//声明一个流。fis=newFileInputStream("E:/filename.txt");//打开文件intb;

b=fis.read();//读入一个字节

System.out.print((char)b);

//输出到屏幕上fis.close();System.out.println("\n文件读出完成.");【例9.1】在E盘中存在test.txt文件,通过字节流方式读取该文件中的数据,并输出到控制台。12public

classFileInput{public

static

voidmain(String[]args){

//读取E盘test.txt中的内容,显示输出FileInputStreamin=null;int

b;try{in=newFileInputStream("E:/test.txt");while((b=in.read())!=-1){System.out.print((char)b);}}catch(FileNotFoundExceptione){System.out.println("文件没找到");}catch(IOExceptione){System.out.println("输入输出异常");}finally{if(in!=null){try{in.close();}catch(IOExceptione){System.out.println("文件无法正常关闭");}}}}}【例9.2】通过字节流读取与写入的方式,实现文件复制的功能(从E:\source.jpg文件复制

到E:\target.jpg文件中)。public

classFileCopy{public

static

voidmain(String[]args){//读取E盘source.jpg中的内容,复制到target.jpgFileInputStreamfis=null;FileOutputStreamfos=null;byte[]b=new

byte[1024];try{fis=newFileInputStream("E:/source.jpg");fos=newFileOutputStream("E:/target.jpg");while((fis.read(b))!=-1){fos.write(b);}fos.flush();}catch(FileNotFoundExceptione){System.out.println("文件没找到");}catch(IOExceptione){System.out.println("输入输出异常");}finally{

13if(fis!=null){try{fis.close();}catch(IOExceptione){System.out.println("文件无法正常关闭");}}if(fos!=null){try{fos.close();}catch(IOExceptione){System.out.println("文件无法正常关闭");}}}System.out.println("操作完毕");}}

9.2.2过滤流需要进行特殊数据的输入/输出:过滤流DataInputStream类和DataOutputStream类可以读/写各种JAVA语言的数据类型【例9.3】通过过滤流读取与写入的方式,实现包含中文字符的文件的读写功能。fos=newFileOutputStream("E:/test.txt");dos=newDataOutputStream(fos);dos.writeInt(100);dos.writeBoolean(true);dos.writeFloat(3.14F);dos.writeDouble(5.12);dos.writeUTF("您好");dos.flush();fis=newFileInputStream("E:/test.txt");dis=newDataInputStream(fis);System.out.println(dis.readInt());System.out.println(dis.readBoolean());System.out.println(dis.readFloat());System.out.println(dis.readDouble());System.out.println(dis.readUTF());15缓冲流缓冲流是一种过滤流可以写成一行输入流输出流16内存外设

(硬盘)过滤流FileInputStreamBufferedInputStream

FileInputStreamfis;fis=newFileInputStream("filename");

BufferedInputStreambis;bis=newBufferedInputStream(fis);

BufferedInputStreambis=newBufferedInputStream(newFileInputStream("filename"));BufferedOutputStreambos=newBufferedOutputStream(newFileOutputStream("filename"));缓冲流BufferedInputStream类和BufferedOutputStream类直接处理大文件时,效率是非常低的使用缓冲技术可以提高效率17

intb=0;FileInputStreamfis;fis=newFileInputStream("filename");BufferedInputStreambis;bis=newBufferedInputStream(fis);while((b=bis.read())!=-1){System.out.print((char)b);}bis.close();

intb=0;FileInputStreamfis;fis=newFileInputStream("filename");while((b=fis.read())!=-1){//每次读入一个字节,返回-1表示没有内容可读System.out.print((char)b);//输出到屏幕上}fis.close();【例9.4】通过BufferedInputStream类和BufferedOutputStream类对【例9.2】进行改进。 FileInputStreamfis=null; //声明字节输入流 FileOutputStreamfos=null;//声明字节输出流 BufferedInputStreambis=null; //声明缓冲输入流 BufferedOutputStreambos=null; //声明缓冲输出流 try{

bis=newBufferedInputStream(newFileInputStream(("d:/mytest.jpg"))); bos=newBufferedOutputStream(newFileOutputStream(("e:/mycopy.jpg"))); intb; while((b=bis.read())!=-1){ //其余代码不需改变,只是改为缓冲流 bos.write((byte)b); } }catch(FileNotFoundExceptione){

。。。。。189.3字符输入/输出流以字符为单位对数据进行处理字符输入流从外设(硬盘)读取数据read()方法字符输出流将数据写出到外设(硬盘)write()方法适合处理文本文件,特别是含有Unicode码(中文)的源代码文件*.xml文件、*.html文件某些配置文件(*.properties、*.ini等)脚本文件等19字符流的有关方法字符输入流FileReader类字符输出流FileWriter类20操作步骤21

FileReaderfis=null;

//声明一个流。fis=newFileReader("E:/filename.txt");

//打开文件intb;b=fis.read();

//读入一个字符System.out.print(b);

//输出到屏幕上fis.close();System.out.println("\n文件读出完成.");比较一下(字节流)

FileInputStreamfis=null;

//声明一个流。fis=newFileInputStream("E:/filename.txt");//打开文件intb;

b=fis.read();//读入一个字节

System.out.print((char)b);

//输出到屏幕上fis.close();System.out.println("\n文件读出完成.");变量b都是int类型的,但一个用了其中的8位,一个用了其中的16位【例9.5】通过字符流读取与写入的方式,实现文件复制的功能。22public

classCopyCharFile{public

static

voidmain(String[]args){FileReaderfr=null;//声明字符输入流FileWriterfw=null;//声明字符输出流try{fr=newFileReader("D:/mytest.txt");fw=newFileWriter("E:/mycopy.txt");int

b;while((b=fr.read())!=-1){

fw.write(b);//写出}//复制完成}catch(FileNotFoundExceptione){System.out.println("文件不存在!");}catch(IOExceptione){System.out.println("输入输出异常!");}finally{//即使不捕获异常,也必须使用try...finallyif(fr!=null){try{fr.close();//关闭字符输入流}catch(IOExceptione){System.out.println("输入输出异常!");}}if(fw!=null){try{fw.close();//关闭字符输出流}catch(IOExceptione){System.out.println("输入输出异常!");}}}System.out.println("\n文件复制完成.");}}缓冲字符流常用方法缓冲型字符输入流缓冲型字符输出流23

BufferedReader

in=newBufferedReader(newFileReader(fileName));

BufferedWriterout=newBufferedWriter(newFileWriter(fileName));【例9.6】将从键盘读取的数据写入到指定的文件中去(直到输入字符“n”时结束)。24public

classBufferedTest{public

static

voidmain(String[]args){InputStreamReaderin;FileWriterout;BufferedReaderbr;try{in=newInputStreamReader(System.in);br=newBufferedReader(in);out=newFileWriter("d:/test.txt");Stringstr=br.readLine();while(!str.equals("n")){System.out.println("str="+str);out.write(str+"\r\n");str=br.readLine();}out.flush();in.close();br.close();}catch(Exceptione){e.printStackTrace();}}}注意事项结束时要关闭流,并且关闭的代码应该放在finally语句块中。使用缓冲流可以大幅度提高性能。使用各种过滤流来完成特定的功能,如加密和解密。259.4文件处理9.1.1文件处理概述文件处理文件操作目录操作:是一种特殊的文件File类平台无关性对Linux和Windows平台,使用相同的File类26Windows文件系统Linux文件系统文件类的使用File类描述了文件对象的属性和提供了对文件对象的操作。27一些常用的操作获得文件或目录的信息判断文件或目录是否存在28

Filefile=newFile("D:/eclipse/eclipse.exe");System.out.println(file.exists());//true,文件存在System.out.println(file.length());//57344System.out.println(file.getPath());//D:\eclipse\eclipse.exeSystem.out.println(file.getParent());//D:\eclipseSystem.out.println(file.getName());//eclipse.exeSystem.out.println(file.isDirectory());//falseSystem.out.println(file.isFile());

//true

if(!newFile("D:/eclipse/eclipse.exe").exists()){System.out.println("文件eclipse.exe找不到.");}一些常用的操作(二)删除文件或目录删除失败的可能原因有:要删除的文件或目录不存在。要删除的是一个目录,而该目录下还有文件或目录。没有权限进行删除操作。创建目录29

if(newFile("D:/doc/myfile.txt").delete()){System.out.println("删除成功.");}else{System.out.println("删除失败.");}newFile(“D:/docs/mydoc”).mkdir();//如果目录docs不存在,则创建失败newFile("D:/docs/mydoc").mkdirs();//如果目录docs不存在也将被创建列出一个目录下的所有文件使用listFiles()方法返回的是File数组使用list()方法返回的是String数组30

Filefile=newFile("c:/windows");String[]fileName=file.list();System.out.println("共有"+fileName.length+"个文件和目录。");for(inti=0;i<fileName.length;i++){System.out.println(fileName[i]);}

Filefile=newFile("c:/windows");File[]files=file.listFiles();System.out.println("共有"+files.length+"个文件和目录。");for(inti=0;i<files.length;i++){System.out.println(files[i].getName());}列出一个目录及其子目录下的所有文件通过递归调用实现31

publicstaticvoidmain(String[]args){Stringpath=System.getProperty("user.dir");//取得当前目录Filefile=newFile(path);listAll(file);}

publicstaticvoidlistAll(Filedir){//递归列出目录和文件if(dir.isDirectory()){System.out.println("==目录:"+dir.getName());}else{System.out.println("文件名:"+dir.getName());}if(dir.isDirectory()){//如果是目录,列出子目录的内容String[]children=dir.list();for(inti=0;i<children.length;i++){

listAll(newFile(dir,children[i]));//直接递归调用}}}文件名过滤器listFiles()方法和list()方法有一个重载,可以指定文件名过滤器文件名过滤器需要自定义,它必须实现FilenameFilter接口32classFilterimplementsFilenameFilter{//实现文件名过滤器StringextName;

//扩展名Filter(Stringextent){

//构造方法初始化扩展名的设置this.extName=extent;}publicbooleanaccept(Filedir,Stringname){returnname.endsWith("."+extName);//满足扩展名要求,则返回true}}Filterfilter=newFilter("exe");

Stringfiles[]=dir.list(filter);9.5对象的串行化串行化(序列化)作用是将对象的状态保存下来因此也称为持续性(持久性)串行化的用途:将对象保存到文件中,需要时再读取出来。程序运行时通过网络传输对象。33声明可串行化的类只有实现了java.io的Serializable接口,一个类的实例才是可串行化的importjava.io.Serializable;//实现Serializable接口,声明这个类是可串行化的public

classRectangleimplementsSerializable{private

static

final

long

serialVersionUID=1L;//串行化版本号//以下部分与普通类完全相同private

int

length;private

int

width;public

intgetLength(){return

length;}public

voidsetLength(int

length){this.length=length;}……}34串行化串行化是将对象写到文件中(或其它流中)public

static

voidwriteRectangle(Rectanglerec,Stri

温馨提示

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

评论

0/150

提交评论