西南交大陈帆于2005Java2Java2程序设计程序设计西南交大陈帆于2005I/O流概述字节流字节流的基类文件流过滤流标准流字符流随机访问文件对象流管道流内存读写流顺序输入流第13章输入输出流西南交大陈帆于2005¾大部分程序都需要输入/输出处理,如从键盘读取数据、向屏幕输出数据、从文件中读或者向文件中写数据、在一个网络连接上进行读写操作等;¾在Java中,这些不同类型的输入、输出源抽象为流-Stream;¾输入或输出的数据则称为数据流(Stream),用统一的接口来表示,从而使程序设计简单明了;13.1数据流的基本概念西南交大陈帆于2005¾数据流:一组有顺序,有起点和终点的字节集合,是对输入/输出的抽象文件程序终端文件程序网络端点数据流起点终点网络端点文件,字符串存储区13.1数据流的基本概念西南交大陈帆于2005一.输入流与输出流¾流分为输入流(InputStream)和输出流(OutputStream)两类;¾输入流只能读不能写,输出流只能写不能读;¾程序通过输入流读入数据,输出流写数据;¾这种划分并不是绝对的。比如一个文件,当向其中写数据时,它就是一个输出流;当从其中读取数据时,它就是一个输入流;¾在Java开发环境中,主要是由包java.io中提供的一系列的类和接口来实现输入/输出处理;13.1.1输入/输出流的基本概念西南交大陈帆于2005二.缓冲流¾对数据流的每次操作是以字节为单位,向输出流写一个字节,或向输入读一个字节,这样的处理是低效的;¾为提高数据传输的效率,通常使用缓冲流,即为一个流分配一个缓冲区,专门用于传输数据的内存;¾当向一个输出流写入数据时,系统先把数据发送到缓冲区,而不是直接的外部设备,当缓冲区满时,系统将数据一次性全部发送到相应的输出设备;¾当从一个输入流读数据时,实际是系统从缓冲区读数据,当缓冲区空时,系统自动从输入流读取数据到缓冲区;13.1.1输入/输出流的基本概念西南交大陈帆于2005¾标准的输入是指在字符方式下(如dos),程序与系统交互的方式,共分三种:¾标准的输入设备:stdin,对象是键盘;¾标准的输出设备:stdout,对象是显示器;¾标准的错误输出:stderr,对象是显示器;¾Java通过java.langa包中的System类实现标准的输入输出;¾System类不能创建对象,但可以直接使用其三个成员:¾System.out:¾把输出送到缺省的显示(通常是显示器)¾System.in¾从标准输入获取输入(通常是键盘)¾System.err¾把错误信息送到缺省的显示;¾每当main方法被执行时,就自动生成上述三个对象13.1.2java标准数据流西南交大陈帆于20051.标准的输入System.in¾System.in作为InputStream类的一个对象实例来实现标准输入;¾Publicintread()throwsIOException¾返回输入的一个字节¾Publicintread(byteb[])throwsIOException¾读入多个字节到缓冲区b中,返回读入的字节数¾如果输入流结束返回-1;¾Publicintskip(longn)¾在输入中跳过n个字节¾发生IO错误,抛出IOException异常13.1.2java标准数据流西南交大陈帆于20052.标准的输出System.out¾System.out作为打印流类PrintStream类的一个对象实例来实现标准输出;print()和println()两个成员函数支持Java的任意基本类型作为参数,实现输入¾Publicvoidprint(…)¾在当前行输出¾Publicvoidprintln(…);¾输出时加一个换行,3.System.err¾把错误信息送到缺省的显示¾例13.1从键盘接收输入的字符13.1.2java标准数据流西南交大陈帆于2005importjava.io.*;publicclassInput1{publicstaticvoidmain(Stringargs[])throwsIOException{System.out.println(pleaseInput:);bytebuffer[]=newbyte[512];//输入缓冲区intcount=System.in.read(buffer);//从键盘读取标准输入流System.out.println(Output:);for(inti=0;icount;i++)//输出buffer元素值{System.out.print(+buffer[i]);}System.out.println();for(inti=0;icount;i++)//按字符方式输出buffer{System.out.print((char)buffer[i]);}System.out.println(count=+count);//buffer实际长度}}西南交大陈帆于20051.字节流¾两个面向字节的输入/输出流的超类¾InputStream¾OutputStream¾提供了实现输入/输出的多个方法2.字符流¾提供两个面向字符的输入/输出流的超类¾Reader¾Writer¾提供了实现输入/输出的多个方法,以Unicode字符为单位读写3.文件类¾File记录文件信息并以顺序方式读写;¾RandomAccessFile以随机方式读写13.1.3java.io包的数据流与文件类西南交大陈帆于2005一.字节流输入输出类1.字节输入流类--InputStream¾输入流类InputStream是各种面向字节的输入流类的超类,由它派生的类都以XXXInputStream方法命名;¾通过名字初步了解该类的含义。它派生的子类有:¾ByteArrayInputStream字节数组输入流¾StringBufferInputStream字符串输入流¾SequenceInputStream顺序输入流¾FilterInputStream过滤器输入流¾PipedInputStream管道输入流¾FileInputStream文件输入流¾ObjectInputStream对象输入流13.2字节流西南交大陈帆于20051.字节输入流类—InputStream的常用方法¾抽象方法abstrctintread()从流中读入一个字节(返回读入的字节值),读入失败时返回-1,另两个重载的方法用来读到字节数组中:¾intread(bytr[])¾intread(bytr[],offset,length)//指定放置数据的起始位置返回读入字节的个数。¾longskip(longn)//把指针(指向当前读取位置的变量long)后移n个字节¾voidclose()//关闭流¾voidmark(intreadlimit)//在当前位置设置一个标记¾voidreset()//返回文件头或上一个标记(如果设置了)¾InputStream的子类都继承这些方法,当然它们可以增加(或重载)自己的方法。13.2字节流西南交大陈帆于2005一.字节流输入输出类2.字节输出流类--OutputStream¾输出流类OutputStream是各种面向字节的输出流类的超类,由它派生的类都以XXXOutputStream方法命名;¾由OutputStream派生的子类有¾ByteArrayOutputStream字节数组输出流¾StringBufferOutputStream字符串输出流¾SequenceOutputStream顺序输出流¾FilterOutputStream过滤器输出流¾PipedOutputStream管道输出流¾FileOutputStream文件输出流¾ObjectOutputStream对象输出流13.2字节流西南交大陈帆于2005一.字节流输入输出类2.字节输出流类OutputStream常用的方法¾与read()方法相对应,OutputStream有三个write方法把字节或字节数组写入流中,还有一个close()和flush():¾abstractvoidwrite(int)¾voidwrite(byte[])¾voidwrite(byte[],offset,length)¾voidclose()关闭流¾voidflush()并将缓冲区中的数据强制送出流¾输入输出流中的方法都是public的,并且都带有异常规范throwsjava.io.IOException。在应用中必须使用try-catch结构13.2字节流西南交大陈帆于2005二.文件字节流类¾OutputStream与InputStream都是抽象类,不能实例化,在实际应用中使用的是它们的字类;¾文件流类在I/O处理中,最常见的就是对文件的操作,用来完成对文件的输入/输出,其数据源就是文件;¾java.io包中所提供的文件操作类包括:¾FileInputStream¾FileOutputStream13.2字节流西南交大陈帆于20051.文件输入流类FileInputStream:¾FileInputStream用于顺序访问本地文件,继承了read、close等方法对本地文件操作;¾FileInputStream类用来打开一个输入文件,若要打开的文件不存在,则会产生例外FileNotFoundException,必须捕获或声明抛弃¾构造方法¾FileInputStream(Filef)¾打开一个File类对象f描述的文件作为输入。¾FileInputStream(Stringname)¾打开一个文件路径名为name的文件作为输入¾输入流的参数是用于指定输入的文件名13.2.1文件字节流西南交大陈帆于20051.文件输入流类FileInputStream:¾读取字节的方法¾通过read方法,可以从文件中读入一/几个字节,甚至整个文件;¾关闭收入流¾Close方法,用来关闭输入流,由于java提供了垃圾自动回收机制,当一个流对象不再使用了,运行时系统会自动关闭;¾为了提高系统的安全性与稳定性,建议使用close方法关闭输入流例13.2打开文件13.2.1文件输入流西南交大陈帆于2005importjava.io.*;publicclassOpenFile{publicstaticvoidmain(Stringargs[])throwsIOException{try//创建文件输入流对象{FileInputStreamrf=newFileInputStream(OpenFile.java);intn=512;bytebuffer[]=newbyte[n];while((rf.read(buffer,0,n)!=-1)&&(n0))//读取输入流{System.out.print(newString(buffer));}System.out.println();rf.close();//关闭输入流}catch(IOExceptionioe){System.out.println(ioe);}catch(Exceptione){System.out.println(e);}}}西南交大陈帆于20052.文件输出流类FileOutputStream:¾FileOutputStream用于向一个文件写数据,继承了write、close等方法;¾构造方法¾FileOutputStream(Filef)¾打开一个以f描述的文件作为输入。¾FileOutputStream(Stringname)¾打开一个文件路径名为name的文件作为输入¾FileOutputStream(Stringname,boleanappend)¾Append为true时,以追加方式写入,默认值false;13.2.2文件输出流西南交大陈帆于2005¾FileOutputStream类写入字节的的方法:write(intb)将一个整数输出到流中,只输出低位字节;write(byteb[])将字节数组中的数据输出到流中w