《输入输出数据流.ppt》由会员分享,可在线阅读,更多相关《输入输出数据流.ppt(33页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第第12讲讲 输入输出数据流输入输出数据流o流的概念o流的分类o流的使用(以字节流为例)n标准输入/输出流n文件输入/输出流n过滤流o字符流的使用1本讲学习任务之一:o问题:如何编程从键盘输入数据?o任务:编写一个猜数游戏程序,程序生成一个10以内的整数,用户从键盘输入猜测的数,直到猜对为止。两个人轮流猜,每人猜3次,累计猜测次数少的胜。2流(流(Stream)的概念)的概念p流流是从是从源源到到目的地目的地的的有序字节序列有序字节序列,具有,具有先进先出先进先出的特征。的特征。p根据流与程序的关系将流分为根据流与程序的关系将流分为输入流输入流和和输出流输出流两类。两类。p程序从输入流程序从输
2、入流读取读取数据;向输出流数据;向输出流写出写出数据。数据。3流的概念o源n输入流的源可以是文件、标准输入(键盘)、其他外部输入设备或者其他输入流。o目的地n输出流的目的地可以是文件、标准输出(显示器)、其他外部输出设备或者其他输出流。oJava中输入输出是通过流来实现的。相关的类都在java.io包中。4流的分类o输入流/输出流n按流与程序的关系分。如前所述。o字节流/字符流n按流中处理的数据是以字节(8位)为单位还是以字符(16位)为单位分为字节流和字符流。nJava中字节流和字符流分属两个不同的体系。o节点流/过滤流n按流与原始数据载体(文件,设备)的关系分为节点流和过滤流。5流的分类(
3、续)o节点流(NodeStream):直接与原始数据存在的特定介质(如磁盘文件或其他外部设备、内存某区域或其他程序)打交道的流,在流的序列中离程序最远。o过滤流(FilterStream):使用其它的流作为输入源或输出目的地,对流中的数据提供进一步处理的流。其他的流可以是节点流,也可以是另一种过滤流。过滤流不能单独使用。o一个输入流链或输出流链中一定有且只有一个节点流;可以没有,也可以有多个过滤流。6字节流的层次结构过滤流结点流抽象类7字符流(读写器)的类层次结构CharArrayReaderStringReaderPipedReaderInputStreamReaderBufferedRea
4、derFilterReaderFileReaderLineNumberReaderPushbackReaderReaderCharArrayWriterStringWriterPipedWriterOutputStreamWriterBufferedWriterFilterWriterFileWriterWriterObjectPrinterWriter8InputStream类的常用方法o读一个字节,并返回该字节。未读到返回-1npublicintread()throwsIOExceptiono关闭流npublicvoidclose()throwsIOExceptiono将数据读入字节数组b
5、,返回所读的字节数nintread(byteb)throwsIOExceptiono将数据读入字节数组b,返回所读的字节数,offset和length指示byte中存放读入字节的位置。nintread(byteb,intoffset,intlength)throwsIOException9OutputStream的常用方法o写一个字节nvoidwrite(int)throwsIOExceptiono关闭输出流nvoidclose()throwsIOExceptiono强行将缓冲区的数据写到目的地。nvoidflush()throwsIOExceptiono写一个字节数组nvoidwrite(b
6、yteb)throwsIOExceptionnvoidwrite(byteb,intoffset,intlength)throwsIOException10标准输入输出流和错误流oSystem.out:n把输出送到缺省的显示(通常是显示器)oSystem.inn从标准输入获取输入(通常是键盘)oSystem.errn把错误信息送到缺省的显示oSystem是final类,in,out,err是System的静态成员变量,因此可以用System.in等形式直接使用。out的用法大家已熟知了,err的用法与out一样。11标准输入System.ino在System中,in的完整定义是:npublic
7、staticfinalInputStreamin;oin的主要方法:npublicintread()throwsIOExceptionnpublicintread(byteb)throwsIOExceptiono使用注意事项:n前者返回读入的一字节的数据,但返回的是int整型值,取值范围是0-255。n后者返回读入的字节数,读入的各字节保存在作为参数的字节型数组对象中。n执行read时,程序会等待用户的输入。输入完成后再接着执行后面的语句。12流的使用过程o输入/输出流的使用过程:n实例化一个输入/输出流对象n使用该输入/输出流对象的方法读入/写出数据n关闭该输入/输出流对象o注意事项输入/输
8、出流的方法会抛出异常,因此必须进行异常处理。标准输入/输出/错误流对象System.in,System.out、System.err始终存在,不需要实例化,也不需要关闭。13例:使用System.in实现键盘数据输入1.importjava.io.*;2.publicclassTestInput3.publicstaticvoidmain(Stringargs)4.5.try6.7.bytebArray=newbyte128;8.System.out.println(请输入一些东西:);9.System.in.read(bArray);10.Strings=newString(bArray,0
9、,bArray.length).trim();11.System.out.println(你输入的是:+s);12.13.catch(IOExceptionioe)14.System.out.println(ioe.toString();15.16.14本讲学习任务之二:o学会如何对文件进行读写操作o任务:编写一个程序,统计一个磁盘文本文件中的单词数。15从文件读数据:FileInputStreamoInputStream是抽象类,不能直接用newInputStream()构造实例。FileInputStream是InputStream的子类,可以生成实例。FileInputStream有三个
10、构造方法,最常用的构造方法如下:PublicFileInputStream(StringfileName)throwsFileNotFoundExceptionPublicFileInputStream(Filefile)throwsFileNotFoundExceptionofileName用来指定输入文件名及其路径,file是一个File对象16例:读出一个文本文件的内容并显示import java.io.*;class ReadFromFile public static void main(String args)InputStream in;/FileInputStream in;这
11、样声明也可以这样声明也可以tryin=new FileInputStream(test.txt);int aByte;aByte=in.read();while(aByte!=-1)System.out.print(char)aByte);aByte=in.read();in.close();catch(FileNotFoundException e)System.out.println(当前目录下文当前目录下文件件test.txt不存在!不存在!);catch(IOException e)System.out.println(发生输入输出错误!发生输入输出错误!);17向文件写数据:File
12、OutputStreamoOutputStream是抽象类,不能直接用newOutputStream()构造实例。FileOutputStream是OutputStream的子类,可以生成实例。FileOutputStream有5个构造方法,最常用的构造方法如下:PublicFileOutputStream(Stringname)throwsFileNotFoundException和PublicFileOutputStream(Stringname,booleanappend)throwsFileNotFoundExceptionoName用来指定输入文件名及其路径,append为true时
13、数据将添加到文件已有内容的末尾。18例题:使用FileOutputStream实现文件复制。import java.io.*;class CopyAFile public static void main(String args)InputStream in;OutputStream out;tryin=new FileInputStream(test.txt);out=new FileOutputStream(copyResult.txt);/out=new FileOutputStream(copyResult.txt,true);int aByte;aByte=in.read();whi
14、le(aByte!=-1)out.write(aByte);aByte=in.read();in.close();out.close();System.out.println(文件复制完毕。文件复制完毕。test.txt已经复制到已经复制到copyResult.txt中。中。);catch(FileNotFoundException e)System.out.println(当前目录下文件当前目录下文件test.txt不存在!不存在!);catch(IOException e)System.out.println(发生输入输出错误!发生输入输出错误!);19本讲学习任务之三:o学会使用过滤流(
15、缓冲流,数据流等)o任务:n使用缓冲流(BufferedInputStream和BufferedOutputStream)改写前面的文件读写程序。n编写一个程序,将10个整型数据写入文件,再读出来求和。20BufferedInputStreamo是过滤流。数据流从原始流成块读入数据,放在一个内部字节数组中。通过减少IO次数提高效率。o构造方法nBufferedInputStream(InputStreamin)nBufferedInputStream(InputStreamin,intbuffersize)o基本方法:nintread()throwsIOExceptionnintread(by
16、te,intoffset,intlength)throwsIOExceptionnvoidclose()throwsIOException21BufferedOutputStreamo是过滤流。将数据积累到一个大数据块后再成批输出。通过减少IO次数提高效率。o构造方法:nBufferedOutputStream(OutputStreamout)nBufferedOutputStream(OutputStreamout,intbuffersize)o基本方法:nvoidwrite(intc)throwsIOExceptionnvoidwrite(byte,intoffset,intlength)
17、throwsIOExceptionnvoidflush()throwsIOExceptionnvoidclose()throwsIOException22输入/输出流的套接o通过流的套接,可以利用各种流的特性共同处理数据。o如:数据源程序FileInpuStream读入BufferedInputStream提高效率DataInputStream读取基本数据类型数据源程序FileOutpuStream写出BufferedOutputStream提高效率DataOutputStream写出基本数据类型注意:直接对数据源读写的是节点流,不能是过滤流。过滤流通常必须套接节点流。23流的套接举例:Fil
18、eInputStream套接BufferedInputStream1.importjava.io.*;2.classTestBufferedInput3.4.publicstaticvoidmain(Stringargs)throwsIOException5.6.InputStreamin;7.in=newBufferedInputStream(newFileInputStream(test.txt);8.intaByte;9.aByte=in.read();10.while(aByte!=-1)11.12.System.out.print(char)aByte);13.aByte=in.re
19、ad();14.15.in.close();16.17.24 属过滤流。能按属过滤流。能按java的基本数据类型读写流中的数据:的基本数据类型读写流中的数据:DataInputStream方法方法 byte readByte()boolean readBoolean()long readLong()char readChar()double readDouble()float readFloat()short readshort()int readInt()String readUTF()/读取以读取以UTF格式保存的字符串格式保存的字符串DataOutputStream 方法方法 void
20、writeByte(byte)void writeBoolean(boolean)void writeLong(long)void writeChar(char)void writeDouble(double)void writeFloat(float)void writeshort(short)void writeInt(int)void writeBytes(String)void writeChars(String)void WriteUTF(String str)/将字符串以将字符串以UTF格式写出格式写出DataInputStream/DataOutputStream25过滤流示例过
21、滤流示例/使用使用DataOutputStreamDataOutputStream将一些数据写入文件,再用将一些数据写入文件,再用DataInputStreamDataInputStream读入读入/DataIOTeat.javaDataIOTeat.javaimport import java.iojava.io.*;.*;public class public class DataIOTestDataIOTest public static void main(String public static void main(String argsargs)throws)throws IOEx
22、ceptionIOException /注意也套接了节点流注意也套接了节点流FileOutputStream DataOutputStreamDataOutputStream out=new out=new DataOutputStream(newDataOutputStream(new FileOutputStream(invoice1.txt);FileOutputStream(invoice1.txt);double prices=19.99,9.99,15.99,3.99,4.99;double prices=19.99,9.99,15.99,3.99,4.99;intint unit
23、s=12,8,13,29,50;units=12,8,13,29,50;String String descsdescs=Java T-shirt,=Java T-shirt,Java Mug,Java Mug,Duke Juggling Dolls,Duke Juggling Dolls,Java Pin,Java Pin,Java Key Chain;Java Key Chain;26过滤流示例过滤流示例o过滤流示例过滤流示例/使用使用DataOutputStreamDataOutputStream将一些数据写入文件,再用将一些数据写入文件,再用DataInputStreamDataInp
24、utStream读入读入/DataIOTeat.javaDataIOTeat.javaimport import java.iojava.io.*;.*;public class public class DataIOTestDataIOTest public static void main(String public static void main(String argsargs)throws)throws IOExceptionIOException /注意也套接了节点流注意也套接了节点流FileOutputStream DataOutputStreamDataOutputStream
25、 out=new out=new DataOutputStream(newDataOutputStream(new FileOutputStream(invoice1.txt);FileOutputStream(invoice1.txt);double prices=19.99,9.99,15.99,3.99,4.99;double prices=19.99,9.99,15.99,3.99,4.99;intint units=12,8,13,29,50;units=12,8,13,29,50;String String descsdescs=Java T-shirt,=Java T-shirt
26、,Java Mug,Java Mug,Duke Juggling Dolls,Duke Juggling Dolls,Java Pin,Java Pin,Java Key Chain;Java Key Chain;27 for(for(intint i=0;i prices.length;i+)i=0;i prices.length;i+)out.writeDouble(pricesiout.writeDouble(pricesi););out.writeChar(tout.writeChar(t););out.writeInt(unitsiout.writeInt(unitsi););out
27、.writeChar(tout.writeChar(t););out.writeChars(descsiout.writeChars(descsi););out.writeChar(nout.writeChar(n););out.close();out.close();/read it in again /read it in again DataInputStreamDataInputStream in=new in=new DataInputStream(newDataInputStream(new FileInputStream(invoice1.txt);FileInputStream
28、(invoice1.txt);double price;double price;intint unit;unit;String String descdesc;double total=0.0;double total=0.0;28for(inti=0;iprices.length;i+)price=in.readDouble();in.readChar();/读入tab键unit=in.readInt();in.readChar();/读入tab键desc=in.readUTF();in.readChar();/读入tab键System.out.println(Youveordered+u
29、nit+unitsof+desc+at$+price);total=total+unit*price;System.out.println(ForaTOTALof:$+total);in.close();29字符流字符流 Reader和和Writer是两个字符流的顶层抽是两个字符流的顶层抽象类。定义了读写象类。定义了读写16位字符的通用位字符的通用API。能够处理能够处理Unicode的所有字符。的所有字符。Reader和和Writer 类实现字节和字符间的自类实现字节和字符间的自动转换。如果是读写文本类的数据使用字动转换。如果是读写文本类的数据使用字符流更佳。符流更佳。30字符流的常用类o输
30、入流nBufferedReaderopublicStringreadLine()throwsIOExceptionnInputStreamReadernFileReadero输出流nBufferedWriternOutputStreamWriternFileWriter31使用字符输入流从键盘输入importjava.io.*;publicclassStandardIOpublicstaticvoidmain(Stringargs)Strings;BufferedReaderin=newBufferedReader(newInputStreamReader(System.in);System.out.println(Pleaseinput:);trys=in.readLine();while(!s.equals(exit)System.out.println(read:+s);s=in.readLine();System.out.println(EndofInputing.);in.close();catch(IOExceptione)e.printStackTrace();32作业o完成本讲内的任务。33