《输入输出数据流.ppt》由会员分享,可在线阅读,更多相关《输入输出数据流.ppt(33页珍藏版)》请在三一办公上搜索。
1、1,第12讲 输入输出数据流,流的概念流的分类流的使用(以字节流为例)标准输入/输出流文件输入/输出流过滤流字符流的使用,2,本讲学习任务之一:,问题:如何编程从键盘输入数据?任务:编写一个猜数游戏程序,程序生成一个10以内的整数,用户从键盘输入猜测的数,直到猜对为止。两个人轮流猜,每人猜3次,累计猜测次数少的胜。,3,流(Stream)的概念,流是从源到目的地的有序字节序列,具有先进先出的特征。根据流与程序的关系将流分为输入流和输出流两类。程序从输入流读取数据;向输出流写出数据。,4,流的概念,源输入流的源可以是文件、标准输入(键盘)、其他外部输入设备或者其他输入流。目的地输出流的目的地可以
2、是文件、标准输出(显示器)、其他外部输出设备或者其他输出流。Java中输入输出是通过流来实现的。相关的类都在java.io包中。,5,流的分类,输入流/输出流按流与程序的关系分。如前所述。字节流/字符流按流中处理的数据是以字节(8位)为单位还是以字符(16位)为单位分为字节流和字符流。Java中字节流和字符流分属两个不同的体系。节点流/过滤流按流与原始数据载体(文件,设备)的关系分为节点流和过滤流。,6,流的分类(续),节点流(Node Stream):直接与原始数据存在的特定介质(如磁盘文件或其他外部设备、内存某区域或其他程序)打交道的流,在流的序列中离程序最远。过滤流(Filter Str
3、eam):使用其它的流作为输入源或输出目的地,对流中的数据提供进一步处理的流。其他的流可以是节点流,也可以是另一种过滤流。过滤流不能单独使用。一个输入流链或输出流链中一定有且只有一个节点流;可以没有,也可以有多个过滤流。,7,字节流的层次结构,过滤流,结点流,抽象类,8,字符流(读写器)的类层次结构,9,InputStream 类的常用方法,读一个字节,并返回该字节。未读到返回-1public int read()throws IOException关闭流public void close()throws IOException将数据读入字节数组b,返回所读的字节数int read(byte
4、b)throws IOException 将数据读入字节数组b,返回所读的字节数,offset和length指示byte中存放读入字节的位置。int read(byte b,int offset,int length)throws IOException,10,OutputStream的常用方法,写一个字节void write(int)throws IOException 关闭输出流void close()throws IOException 强行将缓冲区的数据写到目的地。void flush()throws IOException 写一个字节数组void write(byte b)throw
5、s IOException void write(byte b,int offset,int length)throws IOException,11,标准输入输出流和错误流,System.out:把输出送到缺省的显示(通常是显示器)System.in从标准输入获取输入(通常是键盘)System.err把错误信息送到缺省的显示System是final类,in,out,err是System的静态成员变量,因此可以用System.in等形式直接使用。out的用法大家已熟知了,err的用法与out一样。,12,标准输入 System.in,在System中,in的完整定义是:public stati
6、c final InputStream in;in的主要方法:public int read()throws IOExceptionpublic int read(byte b)throws IOException使用注意事项:前者返回读入的一字节的数据,但返回的是int整型值,取值范围是0-255。后者返回读入的字节数,读入的各字节保存在作为参数的字节型数组对象中。执行read时,程序会等待用户的输入。输入完成后再接着执行后面的语句。,13,流的使用过程,输入/输出流的使用过程:实例化一个输入/输出流对象使用该输入/输出流对象的方法读入/写出数据关闭该输入/输出流对象注意事项输入/输出流的方
7、法会抛出异常,因此必须进行异常处理。标准输入/输出/错误流对象System.in,System.out、System.err始终存在,不需要实例化,也不需要关闭。,14,例:使用System.in实现键盘数据输入,import java.io.*;public class TestInput public static void main(String args)try byte bArray=new byte128;(请输入一些东西:);System.in.read(bArray);String s=new String(bArray,0,bArray.length).trim();(你输入
8、的是:+s);catch(IOException ioe)System.out.println(ioe.toString();,15,本讲学习任务之二:,学会如何对文件进行读写操作任务:编写一个程序,统计一个磁盘文本文件中的单词数。,16,从文件读数据:FileInputStream,InputStream是抽象类,不能直接用new InputStream()构造实例。FileInputStream是InputStream的子类,可以生成实例。FileInputStream有三个构造方法,最常用的构造方法如下:Public FileInputStream(String fileName)thr
9、ows FileNotFoundExceptionPublic FileInputStream(File file)throws FileNotFoundExceptionfileName用来指定输入文件名及其路径,file是一个File对象,17,例:读出一个文本文件的内容并显示,import java.io.*;class ReadFromFile public static void main(String args)InputStream in;/FileInputStream in;这样声明也可以tryin=new FileInputStream(test.txt);int aByt
10、e;aByte=in.read();while(aByte!=-1)System.out.print(char)aByte);aByte=in.read();in.close();catch(FileNotFoundException(当前目录下文件test.txt不存在!);catch(IOException(发生输入输出错误!);,18,向文件写数据:FileOutputStream,OutputStream是抽象类,不能直接用new OutputStream()构造实例。FileOutputStream是OutputStream的子类,可以生成实例。FileOutputStream有5个
11、构造方法,最常用的构造方法如下:Public FileOutputStream(String name)throws FileNotFoundException和Public FileOutputStream(String name,boolean append)throws FileNotFoundExceptionName用来指定输入文件名及其路径,append为true时数据将添加到文件已有内容的末尾。,19,例题:使用FileOutputStream实现文件复制。,import java.io.*;class CopyAFile public static void main(Stri
12、ng 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();while(aByte!=-1)out.write(aByte);aByte=in.read();in.close();out.close();(文件复制完毕。test.txt已经复制到copyResult.txt中。)
13、;catch(FileNotFoundException e)(当前目录下文件test.txt不存在!);catch(IOException e)(发生输入输出错误!);,20,本讲学习任务之三:,学会使用过滤流(缓冲流,数据流等)任务:使用缓冲流(BufferedInputStream和BufferedOutputStream)改写前面的文件读写程序。编写一个程序,将10个整型数据写入文件,再读出来求和。,21,BufferedInputStream,是过滤流。数据流从原始流成块读入数据,放在一个内部字节数组中。通过减少IO次数提高效率。构造方法BufferedInputStream(Inp
14、utStreamin)BufferedInputStream(InputStreamin,intbuffersize)基本方法:int read()throws IOExceptionint read(byte,int offset,int length)throws IOExceptionvoid close()throws IOException,22,BufferedOutputStream,是过滤流。将数据积累到一个大数据块后再成批输出。通过减少IO次数提高效率。构造方法:BufferedOutputStream(OutputStreamout)BufferedOutputStream
15、(OutputStreamout,intbuffersize)基本方法:void write(int c)throws IOExceptionvoid write(byte,int offset,int length)throws IOExceptionvoid flush()throws IOExceptionvoid close()throws IOException,23,输入/输出流的套接,通过流的套接,可以利用各种流的特性共同处理数据。如:,数据源,程序,数据源,程序,注意:直接对数据源读写的是节点流,不能是过滤流。过滤流通常必须套接节点流。,24,流的套接举例:FileInputS
16、tream套接BufferedInputStream,import java.io.*;class TestBufferedInput public static void main(String args)throws IOExceptionInputStream in;in=new BufferedInputStream(new FileInputStream(test.txt);int aByte;aByte=in.read();while(aByte!=-1)System.out.print(char)aByte);aByte=in.read();in.close();,25,属过滤流
17、。能按java的基本数据类型读写流中的数据:DataInputStream方法 byte readByte()boolean readBoolean()long readLong()char readChar()double readDouble()float readFloat()short readshort()int readInt()String readUTF()/读取以UTF格式保存的字符串DataOutputStream 方法 void writeByte(byte)void writeBoolean(boolean)void writeLong(long)void writeC
18、har(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/DataOutputStream,26,过滤流示例,/使用DataOutputStream将一些数据写入文件,再用DataInputStream读入/DataIOTeat.javaimport java.io
19、.*;public class DataIOTest public static void main(String args)throws IOException/注意也套接了节点流FileOutputStream DataOutputStream out=new DataOutputStream(new FileOutputStream(invoice1.txt);double prices=19.99,9.99,15.99,3.99,4.99;int units=12,8,13,29,50;String descs=Java T-shirt,Java Mug,Duke Juggling D
20、olls,Java Pin,Java Key Chain;,27,过滤流示例,过滤流示例,/使用DataOutputStream将一些数据写入文件,再用DataInputStream读入/DataIOTeat.javaimport java.io.*;public class DataIOTest public static void main(String args)throws IOException/注意也套接了节点流FileOutputStream DataOutputStream out=new DataOutputStream(new FileOutputStream(invoic
21、e1.txt);double prices=19.99,9.99,15.99,3.99,4.99;int units=12,8,13,29,50;String descs=Java T-shirt,Java Mug,Duke Juggling Dolls,Java Pin,Java Key Chain;,28,for(int i=0;i prices.length;i+)out.writeDouble(pricesi);out.writeChar(t);out.writeInt(unitsi);out.writeChar(t);out.writeChars(descsi);out.writeC
22、har(n);out.close();/read it in again DataInputStream in=new DataInputStream(new FileInputStream(invoice1.txt);double price;int unit;String desc;double total=0.0;,29,for(int i=0;i prices.length;i+)price=in.readDouble();in.readChar();/读入tab键 unit=in.readInt();in.readChar();/读入tab键 desc=in.readUTF();in
23、.readChar();/读入tab键 System.out.println(Youve ordered+unit+units of+desc+at$+price);total=total+unit*price;System.out.println(For a TOTAL of:$+total);in.close();,30,字符流,Reader和Writer是两个字符流的顶层抽象类。定义了读写16位字符的通用API。能够处理Unicode的所有字符。Reader和Writer 类实现字节和字符间的自动转换。如果是读写文本类的数据使用字符流更佳。,31,字符流的常用类,输入流BufferedR
24、eaderpublic String readLine()throws IOExceptionInputStreamReaderFileReader输出流BufferedWriterOutputStreamWriterFileWriter,32,使用字符输入流从键盘输入,import java.io.*;public class StandardIOpublic static void main(String args)String s;BufferedReader in=new BufferedReader(new InputStreamReader(System.in);System.out.println(Please input:);trys=in.readLine();while(!s.equals(exit)(read:+s);s=in.readLine();System.out.println(End of Inputing.);in.close();catch(IOException e)e.printStackTrace();,33,作业,完成本讲内的任务。,