输入输出流Java程序设计及应用.ppt_第1页
输入输出流Java程序设计及应用.ppt_第2页
输入输出流Java程序设计及应用.ppt_第3页
输入输出流Java程序设计及应用.ppt_第4页
输入输出流Java程序设计及应用.ppt_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

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

文档简介

第7章 输入输出流 7.1 流概述 7.2 基本输入输出流 7.3 标准输入输出 7.4 文件处理 7.5 本章小结 输入输出流是Java中输入输出功能的基础,是最基本的 操作,许多程序需要读写数据都离不开I/O方法。本章主要 讲述了流、输入输出流、InputStream类、OutputStream类 、Reader类和Writer类,同时介绍了标准输入和输出和文件 处理。 Date 1第7章 输入输出流 7.1 流概述 流一般分为输入流(InputStream)和输出流(OutputStream)两类。 输入流将外部设备数据引入到计算机中,例如从网络中读取信息,从扫描仪 中读取图像信息等; 输出流将数据引导到外部设备(屏幕或文件),例如向网络中发布信息,在 屏幕上显示图像和文件内容等。 但这种划分并不是绝对的。比如一个文件,当向其中写数据时,它就是 一个输出流;当从其中读取数据时,它就是一个输入流。当然,键盘只 是一个数入流,而屏幕则只是一个输出流。 因此,可以将“流”看作数据从一种设备流向另一种设备的过程。它的 最大特点是数据的获取和发送均按数据序列顺序进行:每一个数据都必 须等待排在它前面的数据读入或送出之后才能被读写,而不能随意选择 输入输出的位置。磁带机是实现流式输入输出的较为典型的设备。 输入流(Input Stream)即数据从外部世界流向计算机。 输出流(Output Stream)即是数据从计算机流向外部世界。 Date 2第7章 输入输出流 7.1 流概述 基本输入输出流 基本的输入输出类是最简单的类,它用来处理普通的流。 其它的派生类是针对某些特定种类的输入或输出。这些类 都包含在java.io包中。 图7.1 输入输出流的操作 Date 3第7章 输入输出流 7.1 流概述 流的分类 Date 4第7章 输入输出流 7.1 流概述 字节流 从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 Date 5第7章 输入输出流 7.1 流概述 Java.io这个软件包包含的两个抽象类,InputStream和OutputStream。所有其 它字符数据流的输入/输出类都要扩展这两个基类。 java.io软件包提供了一些类和接口,它们在由InputStream和OuputStream类提 供的读写操作的顶端定义了一些有用的抽象。例如,ObjectInputStream类提供 了让你把输入/输出流中的数据当成对象来读取的方法,而ObjectOutputStream 类提供了让你能够把Java对象写入数据流中的方法。这两个类均为抽象类,也 就是说它们不能被实例化,必须子类化之后才能够实现一定的功能。 InputStream超类提供字符输入流的编程接口和具体实现。OuputStream定义写 字节或字节型数组的方法。与输入流InputStream类似,一个输出流在创建时就 自动打开,也可以用close()方法显示关闭一个输出流,或者在对象不再被引用 ,这个OuputStream要成为收集的垃圾时隐式地关闭。 java.io包包含若干个实现具体输入或输出的InputStream和OuputStream的子类 。例如:FileInputStream和FileOutStream就是在文件系统上进行操作的输入 输出流。图7.3和7.4分别表示java.io包中的字节输入流和字节输出流类层次。 Date 6第7章 输入输出流 7.1 流概述 java.io包中字节输入流的类层次 Date 7第7章 输入输出流 7.1 流概述 java.io包中字节输出流的类层次 Date 8第7章 输入输出流 7.1 流概述 包中字符输入流的类层次 Date 9第7章 输入输出流 7.1 流概述 java.io包中字符输出流的类层次 Date 10第7章 输入输出流 7.2 基本输入输出流 InputStream类 InputStream类是以字节为单位的输入流。数据来源可以 是键盘,也可以是诸如Internet这样的网络环境。 OutputStream类 OutputStream位于OutputStream类层次的最顶层,它是一 个抽象类,OutputStream是与InputStream相对应的输出流 类,它具有所有输出流的基本功能。 Date 11第7章 输入输出流 7.2.1 InputStream类 InputStream类是以字节为单位的输入流。数据来 源可以是键盘,也可以是诸如Internet这样的网络 环境。这个类可以作为许多输入类的基类。 InputStream类是一个抽象类,因此不能建立其实 例类,相反用户必须使用其子类。注意,大多数输 入方法都抛出了IOException例外。因此,如果程 序中调用拉这些输入方法,就必须捕获和处理 IOException例外。 类InputStream处于InputStream类层次的最顶层 Date 12第7章 输入输出流 7.2.1 InputStream类 read方法 read方法用于从指定的输入流读取以字节为单位的数据,第一次从流的开始位置开始读取 ,以后每次从上次的结束部位开始读取,即自动实现了位移。 read方法有以下三种形态 public int read(byte buff) throws IOException 该方法以一字节型数组作为参数,可用于一次读取多个字节,读入字节直接放入数组buff中,并 返回读取的字节数。使用该方法必须保证数组有足够的大小来保存所要读入的数据,否则Java就 会抛出一个IOException。(例7-1) public abstract int read() throws IOException 即不带参数,该方法每次一个字节从指定的输入流中读取数据。返回值也是int类型,但它并不代 表读取的字节数,而是从流中读取的数据的本身,因数据本身是byte类型的,所以一般要强制进 行转化;如果没有数据返回的值是-1。在Java中,不能直接把一个整数转换为字符,因为Java的整 数为32位,而字符则是为16位。还须注意,该方法一般是通过子类来实现的,所以通常通过 System.io.read()来调用。通过以下例题来说明该方法的使用。( 例7-2) public int read(byte buff ,int start, int len) 从指定流读取数据,从start开始,填充len个字节到buff中,返回值为实际的填充数,如果返回值 len,一般表示已将指定流中的数据读完。这个方法还可以用于防止数组越界,其用法是:把 start设置为0,len设成数组长度。这样,既可填充整个数组,又能保证不会越界。 Date 13第7章 输入输出流 7.2.1 InputStream类 available方法 格式:public int available( ) throws IOException 功能:返回当前流中可用字节数。 available方法用于计算指定流中当前有多少字节,如果指定的流是文件流,那 么就返回文件的大小。Available返回的值是int类型。有的输入流可能没有能 力返回字节数,如果对这些输入流使用avaiable方法,返回值为0。 close方法 格式:public viod close( ) throws IOException 功能:关闭当前流对象 对于打开的stream,Java可以自动回收,但是Java自动回收需要时间,所以最 好自己调用close方法来关闭stream,这样方便下一次重新指定的流。所以, I/O流在使用完后一定不要忘记关闭输入流,使用close( )方法执行关闭操作 。 Date 14第7章 输入输出流 7.2.1 InputStream类 skip方法 格式:public long skip(long n) throws IOException 功能:跳过指定的字节数。 skip方法类似于C语言中的lseek,都是用于 定位的。Skip方法定义:long skip(long n),该方法使指定流中的当 前位置移动n个字节,n的值可以是负值用于向前移,skip方法返回值为 实际移动的字节数,由于种种原因,如已到流尾或者其它原因返回的值 往往小于n。对于读取文件来说,小于n的原因最大的原因是读到了文件 尾。 InputStream类的几个常用方法还有: public Synchronized void mark(int readlimit):在流中标记一个位置。 public Synchronized void reset( ) throws IOException:返回流中放标 记的位置。 public Boolean markSupport( ):返回一个表示流是否支持标记和复位操 作的布尔值。 Date 15第7章 输入输出流 7.2.1 InputStream类 使用InputStream的注意点 当程序中调用InputStream进行请求,所调用的方法就处在等待状态,这种状态 就是“堵塞”。请分析下面一段程序: Try int.byt=System.in.read( ); catch(IOException e) System.out.println(e.toString( ); 当程序运行到System.in.read( )的时候就等待用户输入,直到用户输入一个回车键为止 。 InputStream类操作的是字节数据,不是字符。ASCII字符和字节数据对应8位数 据,Java的字符为16位数据,Unicode字符集对应16位字节数据, Java的整数 为32位。这样,利用InputStream类来接收键盘字符将收不到字符的高位信息。 流是通过-1来标记结束的。因此,必须用整数作为返回的输入值才可以捕捉到 流的结束。否则,如果使用的是相当于无符号整数的字符来保存,则无法确认 流何时结束。 从字节输入流InputStream类的层次结构图可以看出,InputStream是所有基于字 节的输入流类的超类。由于它本身是抽象类,不能用来直接创建对象,它提供 的方法通常是在其子类的对象中被使用的。 Date 16第7章 输入输出流 7.2.1 InputStream类 FileInputStream FileInputStream是从InputStream中继承下来的,称为文件字节输入流,是将 文件作为源端设备和目的端设备进行字节处理的I/O流,也就是说,文件字节输 入流读取对象是文件。该类的所有方法都是从InputStream类继承来的。 为了创建FileInputStream类的对象,可以使用构造方法: FileInputStream(string name)和FileInputStream(File file)。 格式如下: public FileInputStream(String name) throws FileNotFoundException public FileInputStream(File file) throws FileNotFoundException 读取方法: public int read() throws IOException public int read(byte b) throws IOException public int read(byte b, int start , int len) throws IOException 该组方法用于从文件中读取数据。其中,b是保存存取到的数据的字节数组, start是输入流的字节偏移量,len是将要读取的字节长度。可以一次一个字节 地读取,也可以按字节数组的容量或指定字节长度成批地读取。 Date 17第7章 输入输出流 7.2.1 InputStream类 FileInputStream流顺序地读取文件,只要不关闭流,每次 调用read()方法就顺序地读取文件中其余的内容,直到文件 的末尾或流被关闭。关闭方法格式如下: (例7_3) public void close() throws IOException PipedInputStream 管道流用于程序(或线程)之间的通讯。InputStream的派生 类PipedInputStream一般与PipedOutputStream一起用构成线程 之间 双向的通信管道。一个PipedInputStream必须连接一个 PipedOutputStream,而且一个PipedOutputStream也必须连接 一个PipedInputStream。PipedInputStream用于实现管道的输 入端,而PipedOutputStream用于实现管道的输出端。 Date 18第7章 输入输出流 7.2.1 InputStream类 PipedInputStream类用于从管道中读取数据,这个管道数据由 PipedOutputStream类写入。因此,在使用类PipedInputStream之前,必须将它 连接到类PipedOutputStream。可以在实例化PipedInputStream类时建立这个连 接,或者调用Connect( )方法建立连接。PipedInputStream中包括用于读数据 的底层方法,同时也提供了读数据的高层接口。PipedInputStream类创建的对 象称为一个输入管道。在里先不介绍PipedInputStream的具体用法。 FilterInputStream FilterInputStream也是从InputStream中继承下来,不过FilterInputStream类 基本上不能直接使用,一般上使用该类的派生类,如BufferedInputStream、 DataInputStream、LineNumberInputStream、PushbackInputStream。该类的最 大特点是,在定义时可以嵌套: InputStream s = getAnInputStreamFromSomewhere(); FilterInputStream s1 = new FilterInputStream(s); FilterInputStream s2 = new FilterInputStream(s1); FilterInputStream s3 = new FilterInputStream(s2); 所以该类的所有派生类都具有这个特性。各个派生类简单介绍如下: Date 19第7章 输入输出流 7.2.1 InputStream类 BufferedInputStream 它通过重写其超类FilterInputStream的方法,在其中提供了内部缓冲操作,内 部缓冲允许大量待读取的数据存入缓冲区内。即使重写了FilterInputStream的 方法,其过滤机器仍保留着。使用内部缓冲,使得实际数据可以按块读取,如 按照磁盘的块大小进行读取。其后的读请求由内部缓冲区来响应,这样访问速 度比磁盘的访问速度快。 使用下面的构造方法中的任何一个都可以建立BufferedInputStream对象: public BufferedInputStream(InputStream in); public BufferedInputStream(InputStream in, int size); 第一种形式使用一个缺省的缓冲区大小,而第二种形式用构造方法的第二个参 数指定缓冲区大小。 DataInputStream 有许多应用程序需要将处理的数据作为Java的一种基本类型(如布尔型,字节, 整数和浮点数)。这就要用到类DataInputStream和DataOutStream.。使用这些类 ,可以读或写Java基本数据类型组成的流。DataInputStream扩展了 FilterInputStream的类,并实现了DataInput接口: public class DataInputStream extends FilterInputStream Implements DataInput Date 20第7章 输入输出流 7.2.1 InputStream类 LineNumberInputStream LineNumberInputStream类用于记录输入流中的行号。行号在标记/重 置操作中 记录。可以用getLineNumber( )获得当前的行号,而setLineNumber( )可以用于 设置当前行的行号。改变某一行的行号后,其后的行就从这个新的行号开始重新 编号。类LineNumberInputStream是FilterInputStream类的子类。 PushbackInputStream PushbackInputStream类利用unread( )方法,可以将一个字节送回输入流 中。送 回InputStream中的这个字符可以在下一次调用read( )时被读出。 PushbackInputStream类可用于实现“先行”功能,它返回下一个要读出的字符。 编写用于输入分析的程序时,这个功能很有用。类PushbackInputStream是 FilterInputStream类的子类。 Date 21第7章 输入输出流 7.2.1 InputStream类 SequenceInputStream SequenceInputStream把多个输入流顺序接到一个输入流中,即将不同的InputStream按先 后顺序串在一起。使用这个类可以将两个独立的流合并为一个逻辑流,如将两个 InputStream串起来: InputStream s1 = new FileInputStream(“theFirstPart“); InputStream s2 = new FileInputStream(“theRest“); InputStream s = new SequenceInputStream(s1, s2); 以上只能实现两个输入流的串接,要实现两个以上输入流串接,需要用到Vector类,如下所示: Vector v = new Vector(3); Enumeration e; v.addElement(s1); v.addElement(s2); v.addElement(s2); e = v.elements(); InputStream s = new SequenceInputStream(e) ; 合并后的流中的数据按照在各个流中指定的顺序读出。第一个流结束时,使用无缝连接的 方式开始从第二个流中读数据。 StringBufferInputStream 允许程序将一个StringBuffer用作输入流,并使用ByteArrayInputStream从中读取数据。 String buffer = “Now is the time for all good men to come.“; InputStream s = new StringBufferInputStream(buffer); Date 22第7章 输入输出流 7.2.1 InputStream类 ObjectInputStream ObjectInputStream与ObjectOutputStream相对应,ObjectInputStream 类和ObjectOutputStream类分别是InputStream类和OutputStream类的 子类。ObjectInputStream类创建的对象被称为对象输入流。对象输入 流使用readObject( )从源中读取一个对象到程序中。 ObjectInputStream将对象的值及类的定义等从指定的输入流读入,以 便重新对象化: FileInputStream in = new FileInputStream(“tmp“); ObjectInputStream s = new ObjectInputStream(in); String today = (String)s.readObject(); Date date = (Date)s.readObject(); ObjectOutputStream和ObjectInputStream就可以实现对象的持久化,即要 先将对象序列化保存到介质中,在必要的时候重新恢复这些对象。 Date 23第7章 输入输出流 7.2.2 OutputStream类 OutputStream位于OutputStream类层次的最顶层,它是一个抽象类, OutputStream是与InputStream相对应的输出流类,它具有所有输出流的基本功 能。下面列出输出流类对应的方法。 write write方法与InputStream的read方法相对应,它有三个形态: public viod write(byte buff ) throws IOException: 向流中写入一个字节数组,即将指定buff数组中的数据输出到指定Stream; public void write(byte buff , int off, int len) throws IOException: 将指定buff数组中的数据从第二个参数开始,输出第三个参数指定的长度到指定的 Stream; public abstract void wirte(int buff) throws IOException;将一个int值输出到指定的Stream ; flush 格式:public void flush( ) throws IOException 功能:清空流并强制缓冲区中所有数据写入到流中。 Date 24第7章 输入输出流 7.2.2 OutputStream类 Close 格式:public void close( ) throws IOException 功能:Close用于关闭指定的输出流。 使用过程中要注意,OutputStream是抽象类,不能直接建立它的实例, 但可以使用如下语句建立输出流对象: OutputStream os=new FileOutStream(“test.dat”); 从字节输出流OutputStream类的层次结构图可以看出,OutputStream是 所有基于字节的输出流类的超类。由于它本身是抽象类,不能用来直接 创建对象,它提供的方法通常是在其子类的对象中被使用的。以下我们 具体介绍一下OutputStream的子类的用法 Date 25第7章 输入输出流 7.2.2 OutputStream类 FileOutputStream FileOutputStream与FileInputStream相对应,它提供了基本的文件写入能力,称为文件 字节输出流。文件字节输出流按字节将数据写入到文件中。 为了创建FileOutputStream类的对象,可以使用构造方法: FileOutputStream(string name)和FileOutputStream(File file)。 格式如下: public FileOutputStream(String name) throws FileNotFoundException public FileOutputStream(File file) throws FileNotFoundException 参数是可以用字符串表示的文件名,也可以是创建时与指定文件关联的文件对象出现异常 时将抛出FileNotFoundException异常。 构造方法参数指定的文件为输出流的目的地,输出流通过使用write()方法把数据写入输 出流到达目的地。write方法的格式如下: public viod write(int b) throws IOException public viod write (byte b) throws IOException public viod write (byte b, int start , int len) throws IOException 该组方法用于向指定文件中写入数据。其中,整型变量b是将要写入的字节的整数值,字 节数组b是将要写入的字节数组,start是输出流的字节偏移量,len是将要写入的字节长 度。可以一次一个字节地写入,也可以按字节数组的容量或指定字节长度成批地写入。 FileOutputStream流顺序地写文件,只要不关闭流,每次调用write( )方法就顺序地向文件 写入内容,直到流被关闭。如果输出流要写入数据的文件已经存在,该文件中的数据内容 就会被刷新;如果要写入数据的文件不存在,该文件就会被建立。(例7-4) Date 26第7章 输入输出流 7.2.2 OutputStream类 PipedOutputStream PipedInputStream类创建的对象称为一个输入管道,PipedOutputStream类创建 的对象称为一个输出管道。输出管道与输入管道连接就形成了一个传输数据的 通道。使用这样的管道,用户可以在不同线程之间实现数据共享。也就是说, 一个线程中的管道输入流应当指向另一个线程中的管道输出流;而一个线程中 的管道输出流应当指向另一个线程中的管道输入流,然后管道输入流就可以读 取写入管道输出流的数据了。相应地PipedOutputStream与PipedInputSteam相 互配合实现两个线程之间的通信,它们的定义如下: PipedInputStream sIn = PipedInputStream(); PipedOutputStream sOut = PipedOutputStream(sIn); (例7-5) 说明: 类ReadThread非常巧妙,它并没有指定输入输出流的具体类型 在MyPipe类中new ReadThread(“reader“, System.in, readOut ) 语句使得从标准 输入设备中接收数据,而从readOut输出,而readOut是PipedOutputSteam,所以它可 以被另一线程接收; new ReadThread(“writer“, writeIn, System.out ),从writeIn接收数据,writeIn是readOut 是成对的双向管道,它接收从readOut发送过来的数据。再从标准设备中输出。 Date 27第7章 输入输出流 7.2.2 OutputStream类 FilterOutputStream FilterOutputStream与FilterInputStream相对应,使用方法也相类似。 FilterOutputStream用于建立一个输出过滤器。FilterOutputStream类将另一 个输出流作为其类定义的一部分存储。所有FilterOutputStream的方法调用都 传递给它的内部输入流。当构造FilterOutputStream实例时,必须传给它一个 将在内部存储的输入流的实例。 FilterOutputStream类本身并不做任何处理,只是将方法调用传递给它的内部输入 流。如果希望它执行有用的处理,必须建立它的子类,并在其中提供必要的操 作。FilterOutputStream的标准子类是BufferedOutputStream、DataOutStream、 PrintStream。以下将分别介绍这几个子类的使用。 BufferedOutputStream BufferedOutputStream从FilterOutputStream中继承下来,它与 BufferedInputStream相对应,作用也相类似,它主要为输出流做缓冲, OutputStream s = new BufferedOutputStream(new FileOutputStream(“foo“); 由于BufferedOutputStream是缓冲数据的,所以必要时,需要使用flush方法强 制将缓冲中的数据真正写入输出流中。 Date 28第7章 输入输出流 7.2.2 OutputStream类 DataOutputStream DataOutputStream与DataInputStream相对应,它执行输入流中基本的Java数据类型的 数据输出。在继承OutputStream的同时,实现了DataOutput接口,实现DataOutput接 口格式如下:ublic class DataOutputStream extends FilterOutputStream implements DataOutput 因此它具有DataOutput接中所规定的方法,这些方法与DataInput所规定的方 法相反。 它还具有size方法,该方法返回向输出流写入的字节数。以下是实现复制功能的例 子: try while (true) aDO.writeByte(aDI.readByte(); finally aDI.close(); aDO.close(); 使用下面的低层方法可以建立DataOutputStream的一个实例: public DataOutputStream(OutputStream out); Date 29第7章 输入输出流 7.2.2 OutputStream类 PrintStream 为了在标准输出流中提供复杂的输出,提供PrintStream类派生出 输出流对象。PrintStream是一个格式化的输出流,是从 FilterOutputStream继承下来的。 PrintStream的构造函数: (1) PrintStream(boolean autoFlush, OutputStream out) (2) PrintStream(OutputStream out) (3) PrintStream(OutputStream out, boolean autoFlush) (4) PrintStream(OutputStream out, boolean autoFlush, String encoding) Date 30第7章 输入输出流 7.2.2 OutputStream类 ByteArrayOutputStream ByteArrayOutputStream类是将数据写入流的内部字节数组缓冲区,同时,流 内部维护一个写入字节的计数器,记录写入的字节数。实际执行时将一个输 出流指向一个Byte数组,但这个Byte数组是ByteArrayOutputStream内部内置 的,不需要我们来定义。该类有两个构造函数: (1) ByteArrayOutputStream():该构造函数会在内部创建一个长度为32的Byte 数组; (2) ByteArrayOutputStream(int n):在对象内部创建一个长度为n的Byte数组 。 ByteArrayOutputStream从OutputStream类继承下来,所以它具write、flush及 close等方法,同时它还具有以下几个特殊的方法: (1) toString():将对象内部的Byte数组转化成字符串(String(buf,0,count); (2) toString(int n):将对象对部的Byte数组转化成字符串,编码方式为n; (3) toString(String n):将对象对部的数组转化成字符串,编码方式为n; (4) toByteArray():返回对象内部的Byte数组; (5) writeTo(OutputStream):将内部Byte数组输出到指定的输出流; (6) reset():将对象内部Byte数组的长度设为0,count = 0; (7) size():返回Byte数组长度。 例7-6 Date 31第7章 输入输出流 7.2.2 OutputStream类 ObjectOutputStream ObjectOutputStream类是用于将原始数据类型以及整个对象写到一个流 中。ObjectOutputStream从OutputStream继承下来,并实现了 ObjectOutput, ObjectStreamConstants这两个接口。它负责将指定对 象输出到指定的输出流,可以将非static、非transient的属性及值、 对象的类定义输出到指定的输出流。该类有一个非常用的方法: writeObject (Object obj); 该方法将obj输出到指定的输出流,以下是该类的例子: FileOutputStream f = new FileOutputStream(“tmp“); ObjectOutput s = new ObjectOutputStream(f); s.writeObject(“Today“); s.writeObject(new Date(); s.flush(); 可以使用transient修饰符规定一些变量的值不被输出到指定的输出流. Date 32第7章 输入输出流 7.2.3 Reader类 在JDK1.1之前,java.io包中的流只有普通的字节流(以byte为基本处理单位的 流),这种流对于以16位的Unicode码表示的字符流处理很不方便。从JDK1.1开 始, java.io包中加入了专门用于字符流处理的类,它们是以Reader和Writer 为基础派生的一系列类。 除了字节数据外,字符数据也是一种软件经常使用的数据类型,如文本数据的 存取处理。Java提供了对字符类型的数据流操作,这就是字符流。与字节流不同 ,字符流的基本类是Reader类和Writer类。这两个类是所有基于字符的流类的超 类。与InputStream和OutPutStream相同,它们也是Object的子类,也是抽象类, 只提供了一系列用于字符流处理的接口,不能直接用来创建对象。它们的方法 与类InputStream和OutputStream类似,只不过其中的参数换成字符或字符数组 Date 33第7章 输入输出流 7.2.3 Reader类 Reader类是处理所有字符流输入类的父类,Reader类具有以下方法: 读取字符 public int read() throws IOException; /读取一个字符,返回值为读取的字 符 public int read(char cbuf ) throws IOException; /读取一系列字符到数组cbuf中,返回值为实际读取的字符的数量 public abstract int read(char cbuf ,int off,int len) throws IOException; /读取len个字符,从数组cbuf 的下标off处开始存放,返回值为实际读取的字符 数量,该方法必须由子类实现 标记流 public boolean markSupported(); /判断当前流是否支持做标记 public void mark(int readAheadLimit) throws IOException; /给当前流作标记,最多支持readAheadLimit个字符的回溯。 public void reset() throws IOException; /将当前流重置到做标记处 关闭流 public abstract void close() throws IOException; /关闭输入源。进一步的读取将会产生IOException异常 Date 34第7章 输入输出流 7.2.3 Reader类 以下将分别介绍Reader的各个子类的使用: FileReader FileReader类创建了一个可以读取文件内容的Reader类。它最常用的构造函数显示如下: FileReader(String filePath) throws FileNotFoundException FileReader(File fileObj) throws FileNotFoundException 每一个都能引发一个FileNotFoundException异常。这里,filePath是一个文件的完整路径 ,fileObj是描述该文件的File 对象。 FileReader类没有自己的实例方法,它的实例方法都是从InputStreamReader继承而来的, 读取方法格式如下: Public int read( ) throws IOException public int read(char cbuf, int off, int len) throws IOException 该组方法用于从文件中读取字符数据。其中,cbuf是保存读取到的数据的字符数组,off是 输入流的字符偏移量,len是将要读取的字符数。可以用read( )一次一个字符地读取,也 可以按字符数组的容量或指定的字符数成批地读取。 关闭方法: Public void close( ) throws IOException 其他方法: public String getEncoding() 该方法获得文件流当前使用的编码机制,返回值是代表编码名称的字符串。 (例7-7) Date 35第7章 输入输出流 7.2.3 Reader类 FilterReader 是过滤字符输入流的超类。其子类为PushbackReader,它允许将字符推回到流的字符流 reader。构 造方法如下: PushbackReader(Reader in):创建具有单字符推回缓冲区的新推回 reader。 PushbackReader(Reader in, int size):创建具有给定大小推回缓冲区的新推回 reader。 PushbackReader的方法主要有: void close() :关闭该流。 void mark(int readAheadLimit):标记流中的当前位置。 boolean markSupported():判断此流是否支持mark()操作(它一定 不支持)。 int read() :读取单个字符。 int read(char cbuf, int off, int len):将字符读入数组的某一部分。 boolean ready() :判断是否准备读取此流。 void reset() :重置该流。 long skip(long n) :跳过字符。 void unread(char cbuf) :推回一个字符数组,方法是将其复制到推回缓冲区前面。 void unread(char cbuf, int off, int len) :推回字符数组的某一部分,方法是将其复制到推回缓冲区 的前面。 void unread(int c) :推回单个字符。 (例7-8) Date 36第7章 输入输出流 7.2.3 Reader类 BufferedReader BufferedReader 类创建的对象称为缓冲输入流,该输入流的指向必须是一个 Reader流,称为BufferedReader流的底层流,底层流负责将数据读入缓冲区。 BufferedReader流的源就是这个缓冲区,缓冲输入流从缓冲区中读取数据。它 有两个构造函数: BufferedReader(Reader inputStream) BufferedReader(Reader inputStream, int bufSize) 第一种形式创建一个默认缓冲器长度的缓冲字符流。第二种形式,缓冲器长度 由bufSize传入。和字节流的情况相同,缓冲一个输入字符流同样提供支持可用 缓冲器中流内反向移动的基础。为支持这点, BufferedReader 实现了mark( ) 和reset( ) 方法, 并且BufferedReader.markSupported( ) 返回true.。 (例7-9) Date 37第7章 输入输出流 7.2.3 Reader类 PipedReaderr 管道I/O是专门用于线程通信。对于字节流Java提供了两个类, PipedInputStream类和PipedOutputStream类被线程用来读写字节数据。两 个管道I/O流对象可以连接起来,这样一个线程写的数据就可以被另一 个线程来读。对于字符流也有两个类,分别叫做PipedReader和 PipedWriter。由于字节流的PipedInputStream类和PipedOutputStream类和 字符流的PipedReader类和PipedWriter类在使用上非常相似,我们只详细 介绍字节流的管道I/O类,对于PipedReaderr类和PipedWriter类仅介绍其 构造方法和主要方法。 PipedReaderr类构造方法如下: public PipedReader(PipedWriter src) throws IOException;/ 创建连接到传送 writer src 的 PipedReader。写入 src 的数据稍 后将用作此流的输入。 参数src为要连接的流。 public PipedReader();/创建尚未连接的 PipedReader。必须在 使用之前将其连接到 PipedWriter。 Date 38第7章 输入输出流

温馨提示

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

评论

0/150

提交评论