第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的流方法从结构上可以分为三大类:字节流、数据流和打印流。字节输入/输出流操作对象为字节(b
2、yte);数据流的数据比较多,包含所有基本类型的二进制数据;打印流是机器能够识别的字符形式(包括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
4、void main(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
5、“+f.getParent(); Transcript.println(“File length is “+f.length(); public MyClass1() ,该程序的运行结果如图7.3所示。 此程序中,我们为了说明路径分隔符的使用方法,实例化文件对象的时候给出了全路径,其实由于我们已经在Java系统中设置好了源路径,只要给出文件名就行了。 表7.1中,list方法用于列出一个目录中所有的文件或与某个模式相匹配的文件。下面我们给出两个例子来讨论带参数或不带参数的list方法的使用。,图 7.3,例7.2 import java.io.*; public class MyClass2
6、public static void main(String args) 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方法中传递参数,这样,
7、处在目录c:jbuilder3myprojects下的所有文件及目录将均被输出,结果如图7.4所示。,图 7.3,图 7.4,程序设计中,往往会碰到根据某一匹配模式来查找目录下的文件的问题,这时就需使用File类带参数的list方法,即 public String list(FilenameFilter filter) 其中,参数FilenameFilter是一个接口,只有一个方法的定义: boolean accept(File dir, String name); 对于指定目录下的文件,我们可以调用该方法确定某个文件是否包含于其中。比如上例中,我们查找以“un”打头的文件或目录,程序如下:,
8、例7.3 import java.io.*; public class MyClass3 implements 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(i
9、nt i=0;idirList.length;i+) Transcript.println(dirListi); public MyClass3(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。主要的方法有: InputStr
10、eam int read() int read(byte buf) int read(byte buf,int offset, int length) close(), OutputStream int 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 IOExc
11、eption FileInputStream f1; FileOutputStream f2; f1=new FileInputStream(“FileCopy.java“); f2=new 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中,如果指定的文件不存在,则创建一个新文件,否则原文件的
12、内容会被新写入的内容覆盖。当程序运行后,将生成一个与原程序相同的副本。,2Character流(字符流)文件的读取 该类如图7.2所示,输入/输出类的父类为Reader、Writer,其基本的方法有: Reader 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() 读者可与字节流进行比较,注意二者方法
13、的区别。下面我们用字符流来改写例7.4:,例7.5 import java.io.*; public class FileCopy public static void main(String args) throws IOException 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.clos
14、e(); public FileCopy() ,例7.6 import java.io.*; public class ReadFile public static void main (String args) throws IOException FileReader fr = new FileReader(“ReadFile.java“); BufferedReader br = new BufferedReader(fr); String line = br.readLine( ); while (line != null) ,Transcript.println(line); lin
15、e = br.readLine( ); br.close( ); 本程序中,我们通过类BufferedReader对文件实现按行读取,达到一行一行输出的目的,结果如图7.6所示。,图 7.6,3二进制数据流的文件读取 如果要读取与机器无关的基本数据类型的数据,如整型或浮点型的二进制数,就要用到二进制数据文件流DataInputStream、DataOutputStream。实际使用中,类DataInputStream和DataOutputStream必须和一个输入类(InputStream)或输出类(OutputStream)联接起来,不能直接用文件名或文件对象(File)对其直接初始化,例如
16、:,例7.7 import java.io.*; public class DatastreamDemo public static void main(String args) throws IOException FileOutputStream f2=new FileOutputStream(“data“); DataOutputStream dfo=new DataOutputStream(f2); dfo.writeBoolean(true);,dfo.writeInt(100); dfo.writeFloat(200.2f); f2.close(); dfo.close(); Fi
17、leInputStream f1=new FileInputStream(“data“); DataInputStream dfi= new DataInputStream(f1); boolean b=dfi.readBoolean(); int i=dfi.readInt(); float f=dfi.readFloat(); f1.close(); dfi.close(); Transcript.println(“The value is: “);,Transcript.println(“ “+b); Transcript.println(“ “+i); Transcript.print
18、ln(“ “+f); public DatastreamDemo() ,该例中,我们首先利用类DataOutputStream生成一个二进制文件data,并对它写入三个不同类型的数据:布尔型、整型、浮点型。然后利用DataInputStream读入刚刚输入的数据并显示出来,结果如图7.7所示。可以看出,输出结果与我们的输入是一一对应的。,图 7.7,4随机访问文件的读取 对于InputStream/OutputStream、Reader/Writer类来说,它们都是顺序访问流,只能进行顺序读写。而所谓随机读写,是指读写完上一个字节后,不只能读写其后继的字节,还可以读写文件中任意的字节,就好象文
19、件中有一个随意移动的指针一样。 Java语言提供了类RandomAccessFile来进行随机文件的读取。在生成一个RandomAccessFile对象时,不仅要说明文件对象或文件名,同时还需指明访问模式,即“只读方式”(r)或“读写方式”(rw),这类似于C/C+中的fopen() 函数。,RandomAccessFile类的功能类似于DataOutputStream类和DataInputStream类的功能合并,即实现了在一个流中进行读、写两种功能。其常用的方法如表7.2所示。,表7.2 RandomAccessFile类的常用方法,例7.8的功能与例7.7一样,只不过是用RandomAc
20、cessFile来实现的。 例7.8 import java.io.*; public class RandomDemo public static void main(String args) throws IOException RandomAccessFilefa=new RandomAccessFile(“data“,“rw“);,fa.writeBoolean(true); fa.writeInt(100); fa.writeFloat(200.2f); fa.seek(0); boolean b=fa.readBoolean(); int i=fa.readInt(); float
21、 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/O处理流,除了前面我们介绍的一些常用的输入/输出流之外,java.io包中提供了很多特殊的输入/输出流,我们可描述如表7.3所示。,表7.3 java
22、.io包中的特殊输入/输出流,表7.3 java.io包中的特殊输入/输出流,7.3.1 管道流 管道流(PipedStream)可用来把一个程序、线程或代码段的输出直接连接到另一个程序、线程或代码段的输入。Java中管道的类有PipedReader、PipedWriter、PipedInputStream及PipedOutputStream。使用过程中,管道输入流作为一个通信管道的接收端进行数据的读取,管道输出流作为发送端进行数据的传送。下面我们先看一个实例:,例7.9 import java.io.*; public class PipedDemo public static void m
23、ain(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 extends Thread PipedReader pr; File f; Write(PipedReader pr
24、,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 PipedWriter pw; File f;,Read(PipedWriter pw,String
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第7章 Java的输入_输出流 Java 输入 输出
链接地址:https://www.31doc.com/p-5030293.html