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