第7章 Java的输入输出流.ppt
《第7章 Java的输入输出流.ppt》由会员分享,可在线阅读,更多相关《第7章 Java的输入输出流.ppt(102页珍藏版)》请在课桌文档上搜索。
1、第7章 Java的输入/输出流,7.1 Java语言I/O的类层次 7.2 Java中文件的操作 7.3 特殊的I/O处理流,7.1 Java语言I/O的类层次,Java输入/输出流封装在包java.io中,其常用的层次结构如图7.1、7.2所示。除了图中给出的类外,实际使用中,我们还会碰到File类,它用来描述某个文件的信息。输入/输出类中还有几个比较重要的接口,例如:DataInput、Data Output、File NameFilter。后面我们会作详细的介绍。,图 7.1,图 7.2,Java的流方法从结构上可以分为三大类:字节流、数据流和打印流。字节输入/输出流操作对象为字节(by
2、te);数据流的数据比较多,包含所有基本类型的二进制数据;打印流是机器能够识别的字符形式(包括ASCII码和Unicode码)。,7.2 Java中文件的操作,编写程序免不了要经常与文件打交道,文件的输入/输出需要用到图7.1中所列出的类FileInputStream、FileOutputStream及RandomAccessFile类。前两个类针对于顺序文件的存取,后一个类用于随机文件的读取。后面我们会有详细的介绍。,7.2.1 文件与目录的描述类File File类并不用来进行文件的读/写操作,它用来描述文件对象的属性,既可以表示文件,也可以表示目录。使用它提供的方法,我们可以得到所指对象
3、的描述信息,包括名称、存在否、读/写权限、路径等等。需要注意的是,当我们在Windows环境使用路径时,其分隔符不能是单一的“”符号,因为与C/C+相同,符号“”已经被转意了。例如:,c:jbuilder3javabin路径是非法的,系统不会识别,正确的应该为c:jbilder3javabin下面我们通过表7.1给出File类的一些方法及说明。,表7.1 File类的方法及变量,下面我们给出几个File类的应用实例。通过例题的使用,希望读者对File类有更清楚的认识。例7.1 import java.io.*;public class MyClass1 public static void m
4、ain(String args)Filef=new File(c:jbuilder3myprojectsuntitled5MyClass1.java);if(!f.exists(),Transcript.println(File MyClass1.java doesnt exist!);else Transcript.println(This file can read+f.canRead();Transcript.println(last modified+f.lastModified();Transcript.println(Parent is+f.getParent();Transcri
5、pt.println(File length is+f.length();public MyClass1(),该程序的运行结果如图7.3所示。此程序中,我们为了说明路径分隔符的使用方法,实例化文件对象的时候给出了全路径,其实由于我们已经在Java系统中设置好了源路径,只要给出文件名就行了。表7.1中,list方法用于列出一个目录中所有的文件或与某个模式相匹配的文件。下面我们给出两个例子来讨论带参数或不带参数的list方法的使用。,图 7.3,例7.2import java.io.*;public class MyClass2 public static void main(String arg
6、s)File f1=new File(c:jbuilder3myprojects);if(!f1.isDirectory()Transcript.println(Error:+f1+isnt a directory!);else String dirList=f1.list();for(int i=0;idirList.length;i+),Transcript.println(dirListi);public MyClass2()在该例中,我们并没有在调用File类的list方法中传递参数,这样,处在目录c:jbuilder3myprojects下的所有文件及目录将均被输出,结果如图7.4所
7、示。,图 7.3,图 7.4,程序设计中,往往会碰到根据某一匹配模式来查找目录下的文件的问题,这时就需使用File类带参数的list方法,即 public String list(FilenameFilter filter)其中,参数FilenameFilter是一个接口,只有一个方法的定义:boolean accept(File dir,String name);对于指定目录下的文件,我们可以调用该方法确定某个文件是否包含于其中。比如上例中,我们查找以“un”打头的文件或目录,程序如下:,例7.3import java.io.*;public class MyClass3 implement
8、s FilenameFilter File f;public static void main(String args)File f1=new File(c:jbuilder3myprojects);if(!f1.isDirectory()Transcript.println(Error:+f1+isnt a directory!);else MyClass3 m=new MyClass3(f1);,String dirList=f1.list(m);for(int i=0;idirList.length;i+)Transcript.println(dirListi);public MyCla
9、ss3(File f)this.f=f;public boolean accept(File dir,String name)return name.startsWith(un);,7.2.2 文件I/O处理 1Byte流(字节流)文件的读取 该类的结构如图7.1所示,我们主要用其中的FileOutputStream和FileInputStream类,它们的父类为InputStream和OutputStream。主要的方法有:InputStream int read()int read(byte buf)int read(byte buf,int offset,int length)close
10、(),OutputStreamint write(int c)int write(byte buf)int write(byte buf,int offset,int length)close()下面给出一个应用实例7.4。,图 7.5,例7.4 import java.io.*;public class FileCopy public static void main(String args)throws IOException FileInputStream f1;FileOutputStream f2;f1=new FileInputStream(FileCopy.java);f2=ne
11、w FileOutputStream(acopy_of_java_file);,int temp;while(temp=f1.read()!=-1)f2.write(temp);f1.close();f1.close();public FileCopy()在该例中,我们利用字节流将本程序拷贝至另一个文件acopy_of_java_file中,如果指定的文件不存在,则创建一个新文件,否则原文件的内容会被新写入的内容覆盖。当程序运行后,将生成一个与原程序相同的副本。,2Character流(字符流)文件的读取 该类如图7.2所示,输入/输出类的父类为Reader、Writer,其基本的方法有:Re
12、ader int read()int read(char buf)int read(char buf,int offset,int length)close(),Writer int write(int c)int write(char buf)int write(char buf,int offset,int length)close()读者可与字节流进行比较,注意二者方法的区别。下面我们用字符流来改写例7.4:,例7.5 import java.io.*;public class FileCopy public static void main(String args)throws IOE
13、xception FileReader f1;FileWriter f2;f1=new FileReader(FileCopy.java);f2=new FileWriter(acopy_of_java_file);,int temp;while(temp=f1.read()!=-1)f2.write(temp);f1.close();f2.close();public FileCopy(),例7.6import java.io.*;public class ReadFile public static void main(String args)throws IOException File
14、Reader fr=new FileReader(ReadFile.java);BufferedReader br=new BufferedReader(fr);String line=br.readLine();while(line!=null),Transcript.println(line);line=br.readLine();br.close();本程序中,我们通过类BufferedReader对文件实现按行读取,达到一行一行输出的目的,结果如图7.6所示。,图 7.6,3二进制数据流的文件读取 如果要读取与机器无关的基本数据类型的数据,如整型或浮点型的二进制数,就要用到二进制数据文
15、件流DataInputStream、DataOutputStream。实际使用中,类DataInputStream和DataOutputStream必须和一个输入类(InputStream)或输出类(OutputStream)联接起来,不能直接用文件名或文件对象(File)对其直接初始化,例如:,例7.7import java.io.*;public class DatastreamDemo public static void main(String args)throws IOException FileOutputStream f2=new FileOutputStream(data);
16、DataOutputStream dfo=new DataOutputStream(f2);dfo.writeBoolean(true);,dfo.writeInt(100);dfo.writeFloat(200.2f);f2.close();dfo.close();FileInputStream f1=new FileInputStream(data);DataInputStream dfi=new DataInputStream(f1);boolean b=dfi.readBoolean();int i=dfi.readInt();float f=dfi.readFloat();f1.cl
17、ose();dfi.close();Transcript.println(The value is:);,Transcript.println(+b);Transcript.println(+i);Transcript.println(+f);public DatastreamDemo(),该例中,我们首先利用类DataOutputStream生成一个二进制文件data,并对它写入三个不同类型的数据:布尔型、整型、浮点型。然后利用DataInputStream读入刚刚输入的数据并显示出来,结果如图7.7所示。可以看出,输出结果与我们的输入是一一对应的。,图 7.7,4随机访问文件的读取 对于I
18、nputStream/OutputStream、Reader/Writer类来说,它们都是顺序访问流,只能进行顺序读写。而所谓随机读写,是指读写完上一个字节后,不只能读写其后继的字节,还可以读写文件中任意的字节,就好象文件中有一个随意移动的指针一样。Java语言提供了类RandomAccessFile来进行随机文件的读取。在生成一个RandomAccessFile对象时,不仅要说明文件对象或文件名,同时还需指明访问模式,即“只读方式”(r)或“读写方式”(rw),这类似于C/C+中的fopen()函数。,RandomAccessFile类的功能类似于DataOutputStream类和Data
19、InputStream类的功能合并,即实现了在一个流中进行读、写两种功能。其常用的方法如表7.2所示。,表7.2 RandomAccessFile类的常用方法,例7.8的功能与例7.7一样,只不过是用RandomAccessFile来实现的。例7.8import java.io.*;public class RandomDemo public static void main(String args)throws IOException RandomAccessFilefa=new RandomAccessFile(data,rw);,fa.writeBoolean(true);fa.writ
20、eInt(100);fa.writeFloat(200.2f);fa.seek(0);boolean b=fa.readBoolean();int i=fa.readInt();float f=fa.readFloat();Transcript.println(The value read from a random file is:);Transcript.println(+b);Transcript.println(+i);Transcript.println(+f);,fa.close();public RandomDemo()程序运行结果如图7.8所示。,图 7.8,7.3 特殊的I/
21、O处理流,除了前面我们介绍的一些常用的输入/输出流之外,java.io包中提供了很多特殊的输入/输出流,我们可描述如表7.3所示。,表7.3 java.io包中的特殊输入/输出流,表7.3 java.io包中的特殊输入/输出流,7.3.1 管道流 管道流(PipedStream)可用来把一个程序、线程或代码段的输出直接连接到另一个程序、线程或代码段的输入。Java中管道的类有PipedReader、PipedWriter、PipedInputStream及PipedOutputStream。使用过程中,管道输入流作为一个通信管道的接收端进行数据的读取,管道输出流作为发送端进行数据的传送。下面我
22、们先看一个实例:,例7.9import java.io.*;public class PipedDemo public static void main(String args)throws IOException PipedWriter pw=new PipedWriter();PipedReader pr=new PipedReader(pw);new Read(pw,ReadFile.txt).start();new Write(pr,WriteFile.txt).start();,public PipedDemo()import java.io.*;public class Write
23、 extends Thread PipedReader pr;File f;Write(PipedReader pr,String f)this.pr=pr;this.f=new File(f);public void run()try FileWriter fw=new FileWriter(f);,int data;while(data=pr.read()!=-1)fw.write(data);fw.close();catch(IOException e)public Write()import java.io.*;public class Read extends Thread Pipe
24、dWriter pw;File f;,Read(PipedWriter pw,String f)this.pw=pw;this.f=new File(f);public void run()try FileReader fr=new FileReader(f);int data;while(data=fr.read()!=-1)pw.write(data);pw.close();catch(IOException e),在本例中,我们通过定义两个线程进行管道PipedReader、PipedWriter的连接。线程的概念读者可参考后面章节的内容,这里只要把其理解为可以同时工作的两段程序就可以了
25、。程序运行后,WriteFile.txt的内容就从文件ReadFile.txt中完全拷贝过来。在管道流的初始化过程中,可以给出对应的管道输入/输出流作为参数进行连接,如本例:PipedReader pr=new PipedReader(PipedWriter pw);,或PipedWriter pw=new PipedWriter(PipedReader pr);在Java中,管道输入/输出流还可以通过方法connect()进行连接,如把本例中的程序改为PipedWriter pw=new PipedWriter();PipedReader pr=new PipedReader();pr.co
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 Java的输入输出流 Java 输入输出
链接地址:https://www.desk33.com/p-758766.html