教学课件第6章数据流的运用

上传人:桔**** 文档编号:568569379 上传时间:2024-07-25 格式:PPT 页数:47 大小:406.97KB
返回 下载 相关 举报
教学课件第6章数据流的运用_第1页
第1页 / 共47页
教学课件第6章数据流的运用_第2页
第2页 / 共47页
教学课件第6章数据流的运用_第3页
第3页 / 共47页
教学课件第6章数据流的运用_第4页
第4页 / 共47页
教学课件第6章数据流的运用_第5页
第5页 / 共47页
点击查看更多>>
资源描述

《教学课件第6章数据流的运用》由会员分享,可在线阅读,更多相关《教学课件第6章数据流的运用(47页珍藏版)》请在金锄头文库上搜索。

1、第6章 数据流的运用北京大学计算机系代亚非第第6章章 数据流的运用数据流的运用n6.1 输入输出方法输入输出方法n6.2 输入输出流的基类输入输出流的基类n6.3 File I/On6.4 数据输入输出流数据输入输出流n6.5 随机存取文件随机存取文件n6.6 文件的其它操作文件的其它操作n6.7 java中的中的unicoden6.8 管道流管道流n6.9 对象流对象流n6.10 流的分类流的分类n6.11 小结小结2文件文件程序程序终端终端文件文件程序程序网络端点网络端点数据流数据流起起点点终终点点 网络端点网络端点文件文件,字符串字符串存储区存储区6.1 输入输出方法输入输出方法n什么是

2、数据流什么是数据流 ?n数据流是指所有的数据通信通道数据流是指所有的数据通信通道n在在java中有关流的操作使用中有关流的操作使用java.io.*n出于安全的考虑出于安全的考虑,小应用不能实现文件小应用不能实现文件I/O流流36.1 输入输出方法输入输出方法nSystem类管理标准输入输出流和错误流类管理标准输入输出流和错误流 nSystem.out:n把输出送到缺省的显示把输出送到缺省的显示(通常是显示器通常是显示器)nSystem.inn从标准输入获取输入从标准输入获取输入(通常是键盘通常是键盘)n System.errn把错误信息送到缺省的显示把错误信息送到缺省的显示n每当每当main

3、方法被执行时方法被执行时,就自动生成上述三个就自动生成上述三个对象对象46.1 输入输出方法输入输出方法public class ReadHello public static void main(String args) char inchar; System.out.println(“Enter a character:”); try inChar=(char)System.in.read(); Syste.out.println(“ “+ inChar); catch(IOException e) Sytem.out.println(“Error reading from user”);

4、 56.1 输入输出方法输入输出方法import java.io.*;class IOTest public statics void main(String args) try byte bArray=new byte128; System.out.println(“Enter something:”); System.in.read(bArray); System.out.print(“You entered:”); System.out.println(bArray); catch(IOException ioe) System.out.println(ioe.toString(); 6

5、6.1 输入输出方法输入输出方法n为什么输入的是字符为什么输入的是字符,输出是乱码输出是乱码?n原因原因:System.out.println(bArray)输出的是输出的是数组的地址而不是字符数组的地址而不是字符n改进改进:将字符数组变换成字符串将字符数组变换成字符串n原来是原来是:System.out.println(bArray);n现在为现在为:String s=new String(bArray,0);n System.out.println(s);nSystem.in是属于是属于BufferedInputStream类型类型nSystem.out是属于是属于PrintStream类

6、型类型nSystem.err也是属于也是属于PrintStream类型类型76.2 输入输出流的基类输入输出流的基类nJava中每一种流的基本功能依赖于基本类中每一种流的基本功能依赖于基本类InputStream和和OutputStreamn它们是抽象类它们是抽象类,不能直接使用不能直接使用n属于属于InputStream类的方法有类的方法有:nread():从流中读入数据从流中读入数据nskip():跳过流中若干字节数跳过流中若干字节数navailable():返回流中可用字节数返回流中可用字节数nmark():在流中标记一个位置在流中标记一个位置nreset():返回标记过得位置返回标记过

7、得位置nmarkSupport():是否支持标记和复位操作是否支持标记和复位操作nclose():关闭流关闭流86.2 输入输出流的基类输入输出流的基类n方法方法read()提供了三种从流中读数据的方法提供了三种从流中读数据的方法.nint read():读一个整数读一个整数nint read(byte b):读多个字节到数组中读多个字节到数组中nint read(byte,int off,int len);n属于属于OutputStream类的方法有类的方法有:nwrite(int b):将一个整数输出到流中将一个整数输出到流中nwrite(byte b):将数组中的数据输出到流中将数组中的

8、数据输出到流中nwrite(byte b, int off,int len):将数组将数组b中从中从off指指定的位置开始定的位置开始len长度的数据输出到流中长度的数据输出到流中96.2 输入输出流的基类输入输出流的基类nflush():将缓冲区中的数据强制送出将缓冲区中的数据强制送出nclose():关闭流关闭流.nPrintStream类类nprintln()不属于不属于OutputStream类类,它是它是PrintStream类的子类类的子类,能提供复杂的输出能提供复杂的输出nPrintStream类的方法有类的方法有:nwrite, flush, checkError,print,

9、 println,close.n其中其中println可以输出多种形式的数据可以输出多种形式的数据.例如例如:n println(String s), println(char c)等等10输出文件输出文件输入文件输入文件readwrite6.3 File I/On文件对象的建立文件对象的建立nFile fp=new File(“tempfile.txt”);n对文件操作要定义文件流对文件操作要定义文件流nFileInputStream类用来打开一个输入文件类用来打开一个输入文件nFileOutputStream类用来打开一个输出文件类用来打开一个输出文件116.3 File I/On文件流的

10、建立文件流的建立nFileInputStream in=new FileInputStream(fp);nFileOutputStream out=new FileOutputStream(fp);n例例:文件拷贝文件拷贝(注意要捕获文件异常注意要捕获文件异常)n输入流的参数是用于输入的文件名输入流的参数是用于输入的文件名n输出流的参数是用于输出的文件名输出流的参数是用于输出的文件名file1.txtfile2.txt输入流输入流输出流输出流126.3 File I/O import java.io.*; class filestream public static void main(Str

11、ing args) try File inFile=new File(”file1.txt); File outFile=new File(”file2.txt); FileInputStream fis=new FileInputStream(inFile); FileOutputStream fos=new FileOutputStream(outFile); int c; while(c=fis.read()!=-1) fos.write(c); fis.close(); fos.close();catch(FileNotFoundException e) System.out.prin

12、tln(FileStreamsTest: +e);catch(IOException e) System.err.println(FileStreamsTest: +e);136.3 File I/On增加缓冲区流增加缓冲区流,减少访问硬盘的次数减少访问硬盘的次数,提高效率提高效率文件文件文件流文件流 缓冲区流缓冲区流 file1.txtfile2.txt输入流输入流输出流输出流输入缓冲区输入缓冲区输出缓冲区输出缓冲区146.3 File I/On缓冲区流缓冲区流:nBufferedInputStream和和 BufferedOutputStreamn将它们与文件流相接将它们与文件流相接nFi

13、leInputStream in=new n FileInputStream(“file1.txt”);nBufferedInputStream bin=n new BufferedInputStream(in,256) nint len; byte bArray=new byte256;nlen=bin.read(bArray);nlen中得到是长度中得到是长度, bArray中得到的是数据中得到的是数据156.3 File I/On只有缓冲区满时只有缓冲区满时,才会将数据送到输出流才会将数据送到输出流.nJava在输出数据流中在输出数据流中,当对方尚未将数据取走时当对方尚未将数据取走时,程

14、序就会被阻塞程序就会被阻塞.n有时要人为地将尚未填满的缓冲区中的数据送有时要人为地将尚未填满的缓冲区中的数据送出出,使用使用flush()方法方法.文件文件166.4 数据输入输出流数据输入输出流n什么时候需要数据输入输出流什么时候需要数据输入输出流?n文件流和缓冲区流的处理对象是字节或字节数文件流和缓冲区流的处理对象是字节或字节数组,利用数据输入输出流可以实现对文件的不组,利用数据输入输出流可以实现对文件的不同数据类型的读写同数据类型的读写.nDataInputStream、DataOutputStreamn一种较为高级的数据输入输出方式一种较为高级的数据输入输出方式,除了字节除了字节和字节

15、数组和字节数组,还可以处理还可以处理int,float,boolean等类等类型型.n还可以用还可以用readLine方法读取一行信息方法读取一行信息n可使用的方法可使用的方法:n write,writeBoolean,read,readByte等等176.4 数据输入输出流数据输入输出流n数据流的建立数据流的建立nFileOutputStream fos=n new FileOutputStream(”file2.txt);nDataInputStream dis=n new DataInputStream(fos)n数据输出流可以是一个已经建立好的输入数据数据输出流可以是一个已经建立好的输

16、入数据流对象流对象,例如网络的连结例如网络的连结,文件等文件等.n下面的例子显示如何利用数据输入输出流往文下面的例子显示如何利用数据输入输出流往文件中写不同类型的数据件中写不同类型的数据186.4 数据输入输出流数据输入输出流class datainput_output public static void main(String args) throws IOException FileOutputStream fos=new FileOutputStream(“a.txt”); DataOutputStream dos=new DataOutputStream (fos); try dos

17、.writeBoolean(true); dos.writeByte(byte)123); dos.writeChar(J); dos.writeDouble(3.141592654); dos.writeFloat(2.7182f); dos.writeInt(1234567890); dos.writeLong(998877665544332211L); dos.writeShort(short)11223); finally dos.close(); 19Streamdatainputandoutput-f5.bat6.4 数据输入输出流数据输入输出流DataInputStream di

18、s=new DataInputStream( new FileInputStream(”a.txt);try System.out.println(t +dis.readBoolean(); System.out.println(t +dis.readByte(); System.out.println(t +dis.readChar(); System.out.println(t +dis.readDouble(); System.out.println(t +dis.readFloat(); System.out.println(t +dis.readInt(); System.out.p

19、rintln(t +dis.readLong(); System.out.println(t +dis.readShort();finallydis.close();206.4 数据输入输出流数据输入输出流nDateLine(InputStream in)(计算字符和行数计算字符和行数)n DataInputStream data=new n DataInputStream(in);n String currentLine;n int lineCount=0; int charCount=0;n while(currentLine=dataIn.readLine()!=null)n +line

20、Count;n charCount+=currentLine.length();n n return (charCount/(float)lineCount);n21文件目录文件目录zip文件文件6.5 随机存取文件随机存取文件n类类RandomAccessFilen zip文件需要用随机方法处理文件需要用随机方法处理n文件目录给出个文件的入口文件目录给出个文件的入口,可以随机读取可以随机读取.n创建一个随机文件创建一个随机文件nnew RandomAccessFile(“file1.txt”, “r”);nnew RandomAccessFile(“file2.txt”, “rw”);n随机

21、文件可以同时完成读和写操作随机文件可以同时完成读和写操作.22pos6.5 随机存取文件随机存取文件n支持随机文件操作的方法支持随机文件操作的方法:nreadXXX()或或writeXXX()nskipBytes();将指针乡下移动若干字节将指针乡下移动若干字节nseek():将指针调到所需位置将指针调到所需位置ngetFilePointer():返回指针当前位置返回指针当前位置nlength():返回文件长度返回文件长度n利用利用seek(long pos)方法查找随机文件中的信息方法查找随机文件中的信息n例例:把若干个把若干个32位的整数写到一个名为位的整数写到一个名为 “temp.dat

22、”的文件中的文件中,然后利用然后利用seek方法方法,以以相反的顺序再读取这些数据相反的顺序再读取这些数据236.5 随机存取文件随机存取文件public class random_file public static void main(String args) int data_arr=12,31,56,23,27,1,43,65,4,99; try RandomAccessFile randf=new RandomAccessFile(“temp.dat”); for (int i=0;idata_arr.length;i+) randf.writeInt(data_arri); for

23、(int i=data_arr.length-1;i=0;i-) randf.seek(i*4); System.out.println(randf.readInt(); randf.close(); catch (IOException e) System.out.println(“File access error: “+e); 246.6 文件的其它操作文件的其它操作n使用文件类获取文件的路径信息使用文件类获取文件的路径信息n设设f是一个文件对象是一个文件对象nFile f=new File(“data”,temp.dat”);nf.getName():返回文件名返回文件名 temp.d

24、atnf.getParent():返回文件所在目录名返回文件所在目录名 datanf.getPath():返回文件路径返回文件路径 datatemp.datnf.getAbsolutePath():返回绝对路返回绝对路 c:myprogdatatemp.dat256.6 文件的其它操作文件的其它操作n例例: 获取当前目录下所有文件名和文件的尺寸获取当前目录下所有文件名和文件的尺寸: nimport java.io.*;npublic class file_sizen public static void main(String args)n File files=new File(“.”);n

25、 String file_list=files.list();n for(int i=0;ifile_list.length;i+)n File current_file=new File(file_listi);n System.out.println(file_listi+n current_file.length();n n 26n在在java中用中用unicode 表示字符和字符串表示字符和字符串nDatainputStream的的readLine方法方法, 以字节形式以字节形式读入读入, 以以unicode形式输出形式输出zDataInputStream不适合输入是不适合输入是uni

26、code的形式的形式z处理字符用处理字符用InputStreamReader 类和类和BufferedReader 类类(jdk1.1)byteUnicode16bit8 bit+ 000000006.7 java 中的中的unicode276.7 java 中的中的unicodeimport java.io;(从键盘上读一个字符串从键盘上读一个字符串)public class CharInput public static void main(String args) String s; throws IOException InputStreamReader ir; BufferedRea

27、der in; ir=new InputStreamReader(System.in); in=new BufferedReader(ir); String s=in.readLine(); int i=Integer.parseInt(s); i=i*2; System.out.println(“the result is” +i); 可以将字符串可以将字符串转换成整数加转换成整数加以运算以运算123286.7 java 中的中的unicoden问题问题:n如果字符流不是来自本地如果字符流不是来自本地,有可能编码不一样有可能编码不一样,直接读取会读出不正确字符直接读取会读出不正确字符n处理方

28、法处理方法:nir=new InputStreamReader(is,”8859_1”);n采用的是采用的是iso8859_1编码方式编码方式,在不同平台之间在不同平台之间正确转换字符正确转换字符.296.7 java 中的中的unicodeimport java.io.*;class filetounicode public static void main(String args) try FileInputStream fis=new FileInputStream(toyamei.txt); InputStreamReader dis=new InputStreamReader(fis

29、); BufferedReader reader=new String s; BufferedReader(dis); while(s=reader.readLine()!=null) System.out.println(read: +s); dis.close(); catch(IOException e) 306.8 使用管道流使用管道流nPipedInputStream和和PipedOutputStreamn创建管道流创建管道流:nPipedInputStream pis=new PipedInputStream();nPipedOutputStream pos=new PipedOu

30、tputStream(pis);n或或:nPipedOutputStream pos=new PipedOutputStream();nPipedInputStream pis=new PipedInputStream(pos);输出流输出流输入流输入流316.8 使用管道流使用管道流n管道流一定是输入输出并用管道流一定是输入输出并用n例例:将数据从输出管道进将数据从输出管道进,从输入管道出从输入管道出nimport java.io.*; nclass pipedstream n public static void main(String args) throwsn IOExceptionn

31、 byte aByteData1=123, aByteData2=111;n PipedInputStream pis=n new PipedInputStream();n PipedOutputStream pos=n new PipedOutputStream(pis);n System.out.println(PipedInputStream);32ntry n pos.write(aByteData);npos.write(aByteData2);nSystem.out.println(byte)pis.read();nSystem.out.println(byte)pis.read(

32、);n finally n pis.close();n pos.close();n6.8 使用管道流使用管道流336.9 对象流对象流n在在java.iojava.io包中包中什么是对象的持续性什么是对象的持续性?n能够纪录自己的状态一边将来再生的能力能够纪录自己的状态一边将来再生的能力,叫叫对象的持续性对象的持续性n什么是串行化什么是串行化? ?n对象通过写出描述自己状态的的数值来记录自对象通过写出描述自己状态的的数值来记录自己的过程叫串行化己的过程叫串行化. .n什么是对象流什么是对象流? ?n能够输入输出对象的流能够输入输出对象的流. .n两者什么关系两者什么关系? ?n将串行化的对象通

33、过对象输入输出流写入文件将串行化的对象通过对象输入输出流写入文件或传送到其它地方或传送到其它地方. .346.9 对象流对象流n一个相关的例子一个相关的例子:从一个源读入一个简单的对象从一个源读入一个简单的对象nimport ;import java.ionpublic class GetStringn public String getStringFromUrl(URL inURL)n InputStream in;n try in =inURL.openStream();n catch(IOException ioe)n System.out.printlin(“URL error;”+i

34、oe);n return null; n return getString(in);n 通过通过url得到一个字符串得到一个字符串356.9 对象流对象流npublic String getStringFromSocket(Socket inSocket)n inputStream in;n try in=inSocket.getInputStreamSream();n catch(IOEception ioe)n System.out.println(“Socket error:”+ioe);n return null; n return getString(in);n 通过通过socket

35、得到一个字符串得到一个字符串366.9 对象流对象流public String getString(inputStream inStream) String readString = new String(); DataInputStream in =new DataInputSream(inStream); char inChar; try while(true) inChar=in.readByte(); readString=readString+inChar; catch(EOFException eof) System.out.println(readString); catch(I

36、OException ioe) System.out.println(“error:”+ieo); return readString; 376.9 对象流对象流n下面的对象能读吗下面的对象能读吗?nClass testObjectn int x; int y;n float angle;n String name;n public testObject(int x,int y,float angle,n String name);n this.x=x;this.y;this.angle;this.name=name;n n这仍然是一个简单的对象这仍然是一个简单的对象386.9 对象流对象流对

37、象流是怎样工作的对象流是怎样工作的?允许可串行化的对象在流中传输允许可串行化的对象在流中传输1.只有实现只有实现serializable接口的类才能被串行化接口的类才能被串行化public class Student implements Serializable int id;String name; int age; String department; public Student(int id, String name,int age, String department) this.id=id; this.name=name; this.age=age; this.departmen

38、t =departmernt; 396.9 对象流对象流n2. 构造对象的输入输出流构造对象的输入输出流(将对象保存到文件将对象保存到文件中中,或者通过网络传送到其他地方或者通过网络传送到其他地方)n相应的类相应的类:ObjectInputn对象的输出对象的输出: ObjectOutputStreamn相应的方法相应的方法:writeObject()n对象的输入对象的输入:ObjectInputStreamn相应的方法相应的方法:readObject()n注注:jdk1.1以上版本支持对象流操作以上版本支持对象流操作406.9 对象流对象流对象流举例对象流举例:将将Student类的一个实例写

39、到文件中类的一个实例写到文件中import java.io.FileOutputStream;import java.io.ObjectOutputStream;public class Objectserpublic static void main(String args) Student stu=new Student(981036,“Li Ming”,16,“CSD”);try FileOutputStream fo=new FileOutputStream(“date.ser”); ObjectOutputStream so=new ObjectOutputStream(fo); o

40、s.writeObject(stu);so.close(); catch(Exception e) ; 416.9 对象流对象流import java.io.Fileimport java.io.FileInputInputStream;Stream;import java.io.Objectimport java.io.ObjectInputInputStream;Stream;public class ObjectRecovpublic class ObjectRecov public static void main(String args) public static void mai

41、n(String args) Student stu; Student stu; try FileInputStream fi=new try FileInputStream fi=new FileInputStream(“date.ser”); FileInputStream(“date.ser”); ObjectInputStream si=new ObjectInputStream si=new ObjectInputStream(fi); ObjectInputStream(fi); stu=(Student)si.readObject();si.close(); stu=(Stude

42、nt)si.readObject();si.close(); catch(Exception e) System.out.println(e); catch(Exception e) System.out.println(e); System.out.println(“ID: ”+stu.id+“name:”+ System.out.println(“ID: ”+stu.id+“name:”+ stu.name+“age:”+age+“dept.:”+stu.departmentstu.name+“age:”+age+“dept.:”+stu.department);); 426.10 流的分

43、类流的分类nInputStream和和OutputStream是所有输入输出是所有输入输出流的祖先流的祖先,它们是一个抽象类它们是一个抽象类.System.in和和System.out是它们的子类是它们的子类InputStreamFileInputStreamPipedIntputStreamFilterInputStreamByteArrayInputStreamDataInputStreamBufferedInputStreamLineNumberInputStreamSequencedInputStreamStringBufferInputStreamPushbackInputStrea

44、m436.10 流的分类流的分类nInputStream中的基本方法包括中的基本方法包括: nread, available, mark, skip, reset, markSuppposed, closenOutputStream中的基本方法包括中的基本方法包括: write, flush, closeOutputStreamFileOutputStreamPipeOutputStreamFilterOutputStreamByteArrayOutputStreamDataOutputStreamBufferedOutputStreamPrintStream446.11 小结小结n在在Jav

45、a中有数据传输的地方都用到中有数据传输的地方都用到I/O流流n (通常是文件通常是文件,网络网络,内存和标准输入输出等内存和标准输入输出等)nInputStream 和和OutputStream是所有是所有I/O流的祖流的祖先先(只有只有RandomAccessFile类是一个例外类是一个例外),read和和write是它们最基本的方法是它们最基本的方法,读写单位读写单位是字节是字节.n在众多的流对象中在众多的流对象中,并不是每一种都单独使用并不是每一种都单独使用,其中过滤流的子类在数据送出去之前做必要的其中过滤流的子类在数据送出去之前做必要的处理处理.文件文件文件输入流文件输入流缓冲输入流缓

46、冲输入流行号输入流行号输入流数据输入流数据输入流目目的的456.11 小结小结nFile, File(Input/Output)Stream, RandomAccessFile是处理本地文件的类是处理本地文件的类nData(Input/Output)Stream是一个过滤流的子是一个过滤流的子类类,借此可以读写各种基本数据借此可以读写各种基本数据, 在文件和网络在文件和网络中经常使用中经常使用.如如: readByte, writeBoolean等等.nBuffered(Input/Output)Stream的作用是在数据的作用是在数据送到目的之前先缓存送到目的之前先缓存,达到一定数量时再送到达到一定数量时再送到目的目的,已减少阻塞次数已减少阻塞次数.nPiped(Input/Output)Stream适合与一个处理的适合与一个处理的输出作为另一个处理的输入的情况输出作为另一个处理的输入的情况46作业作业作业作业: 将键盘上输入的一串字符写到文本文件中将键盘上输入的一串字符写到文本文件中47

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号