您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > 第五章 输入输出及异常处理
第五章输入输出及异常处理一、流和文件二、常用流类三、文件处理四、文件处理实例五、Java异常处理一、流和文件流流是指按照顺序组织的、从起点到终点的数据的集合,是存在于信息源和目的地之间的一条通讯路径,面向对象程序设计语言中对数据输入/输出的处理技术均采用流输入/输出技术。在Java语言中输入/输出程序的设计是通过输入/输出流的方式实现的,Java基于数据流的输入/输出机制提供了一套简单、标准化的API,以便从不同的数据源读取和写入字符和字节数据,这些数据流表示字符或字节数据的流动序列。一、流和文件流序列中的数据可以是未经加工的原始二进制数据,也可以是经过编码处理后符合某种格式规定的特定数据。根据操作对象的数据特征即输入/输出的数据类型,Java中的输入/输出流可细分为字节流和字符流。字节流(bytestream)以字节为单位操作数据,为处理字节的输入和输出提供了方便的方法,例如对于二进制数据的读取或书写使用字节流。字符流(characterstream)则以字符为单位操作数据,为字符的输入和输出处理提供了方便的方法。这两种流采用了统一的编码标准,因而可以国际化。需要说明的是,在最底层所有的输入/输出都是字节形式的,基于字符的流只是为处理字符提供方便有效的方法。一、流和文件文件Java语言简单地把每个文件都视为一个顺序字节流,每个文件或者结束于一个文件结束标志,或者根据系统维护管理数据中所记录的具体字节数来终止。当一个文件打开时,一个对象就被创建,同时一个流和该对象关联。第1字节第2字节第3字节……第n-1字节文件结束符二、常用流类Java语言中InputStream和OutputStream类设计成字节流类,而Reader和Writer类为字符流设计。字节流类和字符流类形成分离的层次结构。一般说来,处理字符或字符串时应使用字符流类,处理字节或二进制对象时应使用字节流类。二、常用流类字节流字节流类为处理字节式输入/输出提供了丰富的环境,一个字节流可以和其他任何类型的对象并用,包括二进制数据。这样的多功能性使得字节流对很多类型的程序都很重要。由于字节流类以InputStream和OutputStream为顶层,每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件、网络连接、甚至是内存缓冲区。二、常用流类1.InputStream(输入流)InputStream是一个定义了Java流式字节输入模式的抽象类,该类的所有方法在出错条件下引发一个IOException异常。intavailable():返回当前可读的输入字节数。voidclose():关闭输入源。关闭之后的读取会产生IOException异常。voidmark(intnumBytes):在输入流的当前点放置一个标记。该流在读取numBytes个字节前都保持有效。booleanmarkSupported():如果调用的流支持mark()/reset()就返回true。intread():如果下一个字节可读则返回一个整型,遇到文件尾时返回-1。intread(bytebuffer[]):试图读取buffer.length个字节到buffer中,并返回实际成功读取的字节数,遇到文件尾时返回-1。intread(bytebuffer[],intoffset,intnumBytes):试图读取buffer中从buffer[offset]开始的numBytes个字节,返回实际读取的字节数,遇到文件尾时返回-1。voidreset():重新设置输入指针到先前设置的标志处。longskip(longnumBytes):忽略numBytes个输入字节,返回实际忽略的字节数。二、常用流类2.OutputStream(输出流)OutputStream是定义了流式字节输出模式的抽象类,该类的所有方法返回一个void值并且在出错情况下引发一个IOException异常。voidclose():关闭输出流,关闭后的写操作会产生IOException异常。voidflush():定制输出状态以使每个缓冲器都被清除,也就是刷新输出缓冲区。voidwrite(intb):向输出流写入单个字节,注意参数是一个整型数,它允许不必将参数转换成字节型就可以调用write()。voidwrite(bytebuffer[]):向一个输出流写一个完整的字节数组。voidwrite(bytebuffer[],intoffset,intnumBytes):写数组buffer以buffer[offset]为起点的numBytes个字节区域内的内容。二、常用流类3.FileInputStream(文件输入流)FileInputStream类创建一个能从文件读取字节的InputStream类,它的两个常用的构造函数如下:FileInputStream(Stringfilepath)FileInputStream(FilefileObj)它们都能引发FileNotFoundException异常。这里filepath是文件的全称路径,flleObj是描述该文件的File对象。下面例子创建了两个使用同样磁盘文件且各含一个上述构造函数的FilelnputStreams类。FileInputStreamf0=newFileInputStream(/autoexec.bat)Filef=newFile(/autoexec.bat);FileInputStreamf1=newFileInputStream(f);二、常用流类4.FileOutputStream(文件输出流)FileOutputStream创建了一个可以向文件写入字节的类OutputStream,它常用的构造函数如下:FileOutputStream(StringfilePath)FileOutputStream(FilefileObj)FileOutputStream(StringfilePath,booleanappend)它们可以引发IOException或SecurityException异常。这里filePath是文件的全称路径,fileObj是描述该文件的File对象。如果append为true,文件以设置搜索路径模式打开。FileOutputStream的创建不依赖于文件是否存在。在创建对象时FileOutputStream在打开输出文件之前创建它。这种情况下如果试图打开一个只读文件,将会引发一个IOException异常。二、常用流类5.RandomAccessFile(随机访问文件类)RandomAccessFile包装了一个随机访问的文件,注意它不是派生于InputStream和OutputStream,而是实现了基本输入/输出方法的Datalnput和DataOutput接口。它同样支持定位请求,也就是说可以在文件内部放置文件指针。它有两个构造函数:RandomAccessFile(FilefileObj,Stringaccess)throwsFileNotFoundExceptionRandomAccessFile(Stringfilename,Stringaccess)throwsFileNotFoundExceptionseek()方法,用来设置文件内部文件指针的当前位置:voidseek(longnewPos)throwsIOException通过指定的len设置正在调用的文件的长度:voidsetLength(longlen)throwsIOException二、常用流类6.ByteArrayInputStream(字节数组输入流)ByteArrayInputStream是把字节数组当成源的输入流。该类有两个构造函数,每个构造函数需要一个字节数组提供数据源。ByteArrayInputStream(bytearray[])ByteArrayInputStream(bytearray[],intstart,intnumBytes)这里array是输入源。第二个构造函数创建了一个InputStream类,该类从字节数组的子集生成,以start指定索引的字符为起点,长度由numBytes决定。二、常用流类7.ByteArrayOutputStream(字节数组输出流)ByteArrayOutputStream是一个把字节数组当作输出流的实现。ByteArrayOutputStream有两个构造函数,分别如下:ByteArrayOutputStream()ByteArrayOutputStream(intnumBytes)在第一种形式里一个32位字节的缓冲器被生成,第二个构造函数生成一个跟指定numbytes相同位数的缓冲器。缓冲器保存在ByteArrayOutputStream的受保护的buf成员里,缓冲器的大小在需要的情况下会自动增加,缓冲器保存的字节数是由ByteArrayOutputStream的受保护的count域保存的。二、常用流类8.过滤字节流过滤流(filteredstream)仅仅是底层透明地提供扩展功能的输入流(输出流)的包装。这些流一般由普通类的方法(即过滤流的一个超类)访问。典型的扩展是缓冲,字符转换和原始数据转换。这些过滤字节流是FilterInputStream和FilterOutputStream。它们的构造函数分别如下。FilterOutputStream(OutputStreamos)FilterInputStream(InputStreamis)这些类提供的方法和InputStream及OutputStream类的方法相同。二、常用流类9.缓冲字节流缓冲流(bufferedstream)是一种字节流,通过把内存缓冲器连到输入/输出流而扩展一个过滤流类。该缓冲器允许Java对多个字节同时进行输入/输出操作,提高了程序性能。因为缓冲器可用,所以可以跳过、标记和重新设置流。缓冲字节流类是BufferedInputStream和BufferedOutput-Stream,Pushback-InputStream也可实现缓冲流。(1)BufferedInputStream(缓冲输入流)缓冲输入/输出是一个非常普通的性能优化,Java的BufferedInput-Stream类允许把任何InputStream类包装成缓冲流并使它的性能提高。BufferedInputStream有两个构造函数,分别如下:BufferedInputStream(InputStreaminputStream)BufferedInputStream(InputStreaminputStream,intbufSize)二、常用流类(2)BufferedOutputStream(缓冲输出流)BufferedOutputStream与任何一个OutputStream相同,除了用一个另外的flush()方法来保证数据缓冲器被写入到实际的输出设备。因为BufferedOutputStream是通过减小系统写数据的时间而提高性能的,可以调用flush()方法生成缓冲器中待写的数据。不象缓冲输入那样,缓冲输出并不提供额外的功能,Java中输出缓冲器只是为了提高性能。其构造函数:BufferedOutputStream(OutputStreamoutputStream)BufferedOutputStream(OutputStreamoutputStream,intbufSize)第一种形式创建了一个使用512字节缓冲器的缓冲流,而第二种形式的缓冲器的大小由bufSize参数确定。二、常用流类10.PrintStream(打印流)PrintStream具有System.out所有的格式化性能,PrintStream有两个函数:PrintStream(OutputStreamoutputSream)PrintStream(OutputStreamoutputStream,booleanflushOnNewline)当
本文标题:第五章 输入输出及异常处理
链接地址:https://www.777doc.com/doc-4153113 .html