输入输出流Java程序设计及应用.ppt
《输入输出流Java程序设计及应用.ppt》由会员分享,可在线阅读,更多相关《输入输出流Java程序设计及应用.ppt(64页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第第7章章 输入输出流输入输出流 7.1 流概述流概述7.2 基本输入输出流基本输入输出流7.3 标准输入输出标准输入输出7.4 文件处理文件处理7.5 本章小结本章小结 输输入入输输出出流流是是Java中中输输入入输输出出功功能能的的基基础础,是是最最基基本本的的操操作作,许许多多程程序序需需要要读读写写数数据据都都离离不不开开I/O方方法法。本本章章主主要要讲讲述述了了流流、输输入入输输出出流流、InputStream类类、OutputStream类类、Reader类类和和Writer类类,同同时时介介绍绍了了标标准准输输入入和和输输出出和和文文件件处处理。理。5/28/20231第第7章
2、章 输入输出流输入输出流 7.1 流概述流概述流一般分为输入流(InputStream)和输出流(OutputStream)两类。输入流将外部设备数据引入到计算机中,例如从网络中读取信息,从扫描仪中读取图像信息等;输出流将数据引导到外部设备(屏幕或文件),例如向网络中发布信息,在屏幕上显示图像和文件内容等。但这种划分并不是绝对的。比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流。当然,键盘只是一个数入流,而屏幕则只是一个输出流。因此,可以将“流”看作数据从一种设备流向另一种设备的过程。它的最大特点是数据的获取和发送均按数据序列顺序进行:每一个数据都必须等待
3、排在它前面的数据读入或送出之后才能被读写,而不能随意选择输入输出的位置。磁带机是实现流式输入输出的较为典型的设备。输入流(Input Stream)即数据从外部世界流向计算机。输出流(Output Stream)即是数据从计算机流向外部世界。5/28/20232第第7章章 输入输出流输入输出流 7.1 流概述流概述基本输入输出流基本的输入输出类是最简单的类,它用来处理普通的流。其它的派生类是针对某些特定种类的输入或输出。这些类都包含在java.io包中。图7.1 输入输出流的操作 5/28/20233第第7章章 输入输出流输入输出流 7.1 流概述流概述流的分类5/28/20234第第7章章
4、输入输出流输入输出流 7.1 流概述流概述字节流字节流从InputStream和OutputStream派生出来的一系列类。这类流以字节(byte)为基本处理单位。InputStream、OutputStream FileInputStream、FileOutputStream PipedInputStream、PipedOutputStream ByteArrayInputStream、ByteArrayOutputStream FilterInputStream、FilterOutputStream DataInputStream、DataOutputStream BufferedInpu
5、tStream、BufferedOutputStream字符流字符流从Reader和Writer派生出的一系列类,这类流以16位的Unicode码表示的字符为基本处理单位。Reader、Writer InputStreamReader、OutputStreamWriter FileReader、FileWriter CharArrayReader、CharArrayWriter PipedReader、PipedWriter FilterReader、FilterWriter BufferedReader、BufferedWriter StringReader、StringWriter 5/2
6、8/20235第第7章章 输入输出流输入输出流 7.1 流概述流概述Java.io这个软件包包含的两个抽象类,InputStream和OutputStream。所有其它字符数据流的输入/输出类都要扩展这两个基类。java.io软件包提供了一些类和接口,它们在由InputStream和OuputStream类提供的读写操作的顶端定义了一些有用的抽象。例如,ObjectInputStream类提供了让你把输入/输出流中的数据当成对象来读取的方法,而ObjectOutputStream类提供了让你能够把Java对象写入数据流中的方法。这两个类均为抽象类,也就是说它们不能被实例化,必须子类化之后才能够
7、实现一定的功能。InputStream超类提供字符输入流的编程接口和具体实现。OuputStream定义写字节或字节型数组的方法。与输入流InputStream类似,一个输出流在创建时就自动打开,也可以用close()方法显示关闭一个输出流,或者在对象不再被引用,这个OuputStream要成为收集的垃圾时隐式地关闭。java.io包包含若干个实现具体输入或输出的InputStream和OuputStream的子类。例如:FileInputStream和FileOutStream就是在文件系统上进行操作的输入输出流。图7.3和7.4分别表示java.io包中的字节输入流和字节输出流类层次。5/
8、28/20236第第7章章 输入输出流输入输出流 7.1 流概述流概述java.io包中字节输入流的类层次 5/28/20237第第7章章 输入输出流输入输出流 7.1 流概述流概述java.io包中字节输出流的类层次 5/28/20238第第7章章 输入输出流输入输出流 7.1 流概述流概述包中字符输入流的类层次 5/28/20239第第7章章 输入输出流输入输出流 7.1 流概述流概述java.io包中字符输出流的类层次5/28/202310第第7章章 输入输出流输入输出流 7.2 基本输入输出流基本输入输出流InputStream类InputStream类是以字节为单位的输入流。数据来源
9、可以是键盘,也可以是诸如Internet这样的网络环境。OutputStream类OutputStream位于OutputStream类层次的最顶层,它是一个抽象类,OutputStream是与InputStream相对应的输出流类,它具有所有输出流的基本功能。5/28/202311第第7章章 输入输出流输入输出流 7.2.1 InputStream类类 InputStreamInputStream类类是是以以字字节节为为单单位位的的输输入入流流。数数据据来来源源可可以以是是键键盘盘,也也可可以以是是诸诸如如InternetInternet这这样样的的网网络络环环境境。这这个个类类可可以以作作
10、为为许许多多输输入入类类的的基基类类。InputStreamInputStream类类是是一一个个抽抽象象类类,因因此此不不能能建建立立其其实实例例类类,相相反反用用户户必必须须使使用用其其子子类类。注注意意,大大多多数数输输入入方方法法都都抛抛出出了了IOExceptionIOException例例外外。因因此此,如如果果程程序序中中调调用用拉拉这这些些输输入入方方法法,就就必必须须捕捕获获和和处处理理IOExceptionIOException例外。例外。类类InputStream处于处于InputStream类层次的最顶层类层次的最顶层5/28/202312第第7章章 输入输出流输入输出
11、流 7.2.1 InputStream类类 readread方法方法 read方法用于从指定的输入流读取以字节为单位的数据,第一次从流的开始位置开始读取,以后每次从上次的结束部位开始读取,即自动实现了位移。read方法有以下三种形态public int read(byte buff)throws IOException该方法以一字节型数组作为参数,可用于一次读取多个字节,读入字节直接放入数组buff中,并返回读取的字节数。使用该方法必须保证数组有足够的大小来保存所要读入的数据,否则Java就会抛出一个IOException。(例7-1)public abstract int read()thr
12、ows IOExceptionpublic abstract int read()throws IOException 即不带参数,该方法每次一个字节从指定的输入流中读取数据。返回值也是int类型,但它并不代表读取的字节数,而是从流中读取的数据的本身,因数据本身是byte类型的,所以一般要强制进行转化;如果没有数据返回的值是-1。在Java中,不能直接把一个整数转换为字符,因为Java的整数为32位,而字符则是为16位。还须注意,该方法一般是通过子类来实现的,所以通常通过System.io.read()来调用。通过以下例题来说明该方法的使用。(例7-2)public int read(byte
13、 buff,int start,int len)public int read(byte buff,int start,int len)从指定流读取数据,从start开始,填充len个字节到buff中,返回值为实际的填充数,如果返回值len,一般表示已将指定流中的数据读完。这个方法还可以用于防止数组越界,其用法是:把start设置为0,len设成数组长度。这样,既可填充整个数组,又能保证不会越界。5/28/202313第第7章章 输入输出流输入输出流 7.2.1 InputStream类类availableavailable方法方法格式:public int available()throws
14、 IOException功能:返回当前流中可用字节数。available方法用于计算指定流中当前有多少字节,如果指定的流是文件流,那么就返回文件的大小。Available返回的值是int类型。有的输入流可能没有能力返回字节数,如果对这些输入流使用avaiable方法,返回值为0。closeclose方法方法格式:public viod close()throws IOException功能:关闭当前流对象 对于打开的stream,Java可以自动回收,但是Java自动回收需要时间,所以最好自己调用close方法来关闭stream,这样方便下一次重新指定的流。所以,I/O流在使用完后一定不要忘记
15、关闭输入流,使用close()方法执行关闭操作。5/28/202314第第7章章 输入输出流输入输出流 7.2.1 InputStream类类skipskip方法方法格式:public long skip(long n)throws IOException功能:跳过指定的字节数。skip方法类似于C语言中的lseek,都是用于定位的。Skip方法定义:long skip(long n),该方法使指定流中的当前位置移动n个字节,n的值可以是负值用于向前移,skip方法返回值为实际移动的字节数,由于种种原因,如已到流尾或者其它原因返回的值往往小于n。对于读取文件来说,小于n的原因最大的原因是读到了
16、文件尾。InputStreamInputStream类的几个常用方法还有:类的几个常用方法还有:public Synchronized void mark(int readlimit):在流中标记一个位置。public Synchronized void reset()throws IOException:返回流中放标记的位置。public Boolean markSupport():返回一个表示流是否支持标记和复位操作的布尔值。5/28/202315第第7章章 输入输出流输入输出流 7.2.1 InputStream类类使用InputStream的注意点当程序中调用InputStream进行
17、请求,所调用的方法就处在等待状态,这种状态就是“堵塞”。请分析下面一段程序: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来
18、标记结束的。因此,必须用整数作为返回的输入值才可以捕捉到流的结束。否则,如果使用的是相当于无符号整数的字符来保存,则无法确认流何时结束。从字节输入流InputStream类的层次结构图可以看出,InputStream是所有基于字节的输入流类的超类。由于它本身是抽象类,不能用来直接创建对象,它提供的方法通常是在其子类的对象中被使用的。5/28/202316第第7章章 输入输出流输入输出流 7.2.1 InputStream类类FileInputStreamFileInputStream FileInputStream是从InputStream中继承下来的,称为文件字节输入流,是将文件作为源端设备
19、和目的端设备进行字节处理的I/O流,也就是说,文件字节输入流读取对象是文件。该类的所有方法都是从InputStream类继承来的。为了创建FileInputStream类的对象,可以使用构造方法:FileInputStream(string name)和FileInputStream(File file)。格式如下:public FileInputStream(String name)throws FileNotFoundExceptionpublic FileInputStream(File file)throws FileNotFoundException 读取方法:public int
20、read()throws IOExceptionpublic int read(byte b)throws IOExceptionpublic int read(byte b,int start,int len)throws IOException该组方法用于从文件中读取数据。其中,b是保存存取到的数据的字节数组,start是输入流的字节偏移量,len是将要读取的字节长度。可以一次一个字节地读取,也可以按字节数组的容量或指定字节长度成批地读取。5/28/202317第第7章章 输入输出流输入输出流 7.2.1 InputStream类类 FileInputStream流顺序地读取文件,只要不关
21、闭流,每次调用read()方法就顺序地读取文件中其余的内容,直到文件的末尾或流被关闭。关闭方法格式如下:(例7_3)public void close()throws IOExceptionPipedInputStreamPipedInputStream管道流用于程序(或线程)之间的通讯。InputStream的派生类PipedInputStream一般与PipedOutputStream一起用构成线程之间双向的通信管道。一个PipedInputStream必须连接一个PipedOutputStream,而且一个PipedOutputStream也必须连接一个PipedInputStream。
22、PipedInputStream用于实现管道的输入端,而PipedOutputStream用于实现管道的输出端。5/28/202318第第7章章 输入输出流输入输出流 7.2.1 InputStream类类PipedInputStream类 用 于 从 管 道 中 读 取 数 据,这 个 管 道 数 据 由PipedOutputStream类写入。因此,在使用类PipedInputStream之前,必须将它连接到类PipedOutputStream。可以在实例化PipedInputStream类时建立这个连接,或者调用Connect()方法建立连接。PipedInputStream中包括用于读
23、数据的底层方法,同时也提供了读数据的高层接口。PipedInputStream类创建的对象称为一个输入管道。在里先不介绍PipedInputStream的具体用法。FilterInputStreamFilterInputStreamFilterInputStream也是从InputStream中继承下来,不过FilterInputStream类基本上不能直接使用,一般上使用该类的派生类,如BufferedInputStream、DataInputStream、LineNumberInputStream、PushbackInputStream。该类的最大特点是,在定义时可以嵌套:InputStr
24、eam s=getAnInputStreamFromSomewhere();FilterInputStream s1=new FilterInputStream(s);FilterInputStream s2=new FilterInputStream(s1);FilterInputStream s3=new FilterInputStream(s2);所以该类的所有派生类都具有这个特性。各个派生类简单介绍如下:5/28/202319第第7章章 输入输出流输入输出流 7.2.1 InputStream类类BufferedInputStreamBufferedInputStream它通过重写其超
25、类FilterInputStream的方法,在其中提供了内部缓冲操作,内部缓冲允许大量待读取的数据存入缓冲区内。即使重写了FilterInputStream的方法,其过滤机器仍保留着。使用内部缓冲,使得实际数据可以按块读取,如按照磁盘的块大小进行读取。其后的读请求由内部缓冲区来响应,这样访问速度比磁盘的访问速度快。使用下面的构造方法中的任何一个都可以建立BufferedInputStream对象:public BufferedInputStream(InputStream in);public BufferedInputStream(InputStream in,int size);第一种形式
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 输入输出 Java 程序设计 应用
限制150内