《9_2java输入输出.ppt》由会员分享,可在线阅读,更多相关《9_2java输入输出.ppt(39页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、java.io packagepart2Java的输入输出主要内容主要内容n nJava的基本输入输出n n面向Byten n面向Charactern n节点流与处理流n nIO流的类层次n n简单IO流n n过滤流JAVA的输入的输入/输出输出n n程序经常需要从外部获取数据或者向外部输出数据。程序经常需要从外部获取数据或者向外部输出数据。n n位置:磁盘、网络、内存、另一个程序位置:磁盘、网络、内存、另一个程序n n形式:对象、字符、文本文件、声音、图形形式:对象、字符、文本文件、声音、图形n nJavaJava中,输入与输出(中,输入与输出(I/OI/O)是通过)是通过流流进行的。它的特
2、进行的。它的特点是数据的发送和获取都是沿点是数据的发送和获取都是沿数据顺序数据顺序进行的。进行的。n n流模型建立在从某个流模型建立在从某个数据源数据源到到数据池数据池的数据传输基础的数据传输基础上上(fromsourcetosink)(fromsourcetosink),也就是说把不同的输入,也就是说把不同的输入/输出输出源(键盘,文件,网络连接)等抽象表示为源(键盘,文件,网络连接)等抽象表示为“流流”。n n两类基本的流:两类基本的流:输出流输出流,只能向其写出数据,而不能从中读取数据。,只能向其写出数据,而不能从中读取数据。输入流输入流,只能从中读取数据,而不能向其写出数据,只能从中读
3、取数据,而不能向其写出数据流编程基础流编程基础n n按流的数据单位大小分字符流和字节流。n n流是单向的,流提供数据是输入流,向流中写数据是输出流。n n见下图流模型中四个抽象类,它们是流模型的父类。InputStreamn n字节输入流InputStream是抽象类,定义了字节输入流的框架。n n它的最重要的三个方法(输入流提供数据输入):intread()intread(bytebuffer)intread(bytebuffer,intoffset,intlength)n n大部分子类的命名是XxxInputStream,例如FileInputStream,DataInputStreamO
4、utputStreamn n字节输出流OutputStream是抽象类,定义了字节输出流的功能框架。n n它的最重要的三个方法(提供数据输出):voidwrite(intc)voidwrite(bytebuffer)voidwrite(bytebuffer,intoffset,intlength)close()n n大部分子类的命名是XxxOutputStream,例如FileOutputStream,DataOutputStreamInputStream类层次类层次OutputStream类层次类层次Java1.1的的I/O:Reader与与Writern n与1.0.2相比的优越性n n国
5、际化国际化引入了引入了字符流字符流(CharacterStreamCharacterStream)处理处理1616位的位的UnicodeUnicode码,而码,而1.0.21.0.2中的中的字节流字节流(ByteStreamByteStream)仅处理仅处理8 8位字节。新引入的位字节。新引入的ReaderReader及及WriterWriter类均类均支持支持UnicodeUnicode码。码。n n性能性能新的新的APIAPI的速度优于的速度优于1.0.21.0.2的类库的类库举例:举例:ReadFile2.javaReadFile2.javaJava1.1的的I/O:工作原理:工作原理n
6、 nJava使用unicode字符集,用其来表示字符和字符串,所有的字符都是16位的。n nReader能够将采用其他字符编码的输入流中的数据转化为Unicode字符;Writer再把Unicode字符转化为指定字符,写到输出中。比如:英语国家的缺省字符编码是ISO8859-1。n n当读写文本数据的时候必须指定编码,否则可能会出现乱码。Reader&Writern nReader和Writer类是一切字符流的超类。它们封装的功能大致和InputStream,OutputStream一样,子类命名常为XxxReader,XxxWriter。以下为二类的主要API方法:n n intintrea
7、d()read()intintread(charread(charcbufcbuf)n n intintread(charread(charcbufcbuf,intintoffset,offset,intintlength)length)n nvoidvoidwrite(intwrite(intc)c)voidwrite(charvoidwrite(charcbufcbuf)n nvoidwrite(charvoidwrite(charcbufcbuf,intintoffset,offset,intintlength)length)n nvoidwrite(Strings)voidwrite(
8、Strings)n nvoidwrite(Strings,voidwrite(Strings,intintoffset,offset,intintlength)length)Reader类层次类层次Writer类层次类层次节点流和处理流节点流和处理流n n节点流(nodestream):n n传输未经处理数据传输未经处理数据n n可以从可以从/向一个特定的地方向一个特定的地方(节点节点)读写数据,例读写数据,例如磁盘或者一块内存。如磁盘或者一块内存。n n处理流(processingstream):n n传输经处理数据传输经处理数据n n是对一个已存在的流的连接和封装,通过所封是对一个已存在的
9、流的连接和封装,通过所封装的流的功能调用实现数据读装的流的功能调用实现数据读/写功能写功能n n二者的区分大致可以从构造器参数中或类名称中看出来。常见节点流列表常见节点流列表常见处理流列表常见处理流列表I/O链链n n在java中,并不是用一个单一的类来创建流对象,通过叠加多个对象提供所期望的功能创建一个目的单一的结果流,却需要创建多个流的对象。n n输出流与输入流之间不能建立连接。I/O链链n n直接与数据源或者数据目的连接的流一般没有缓冲区,可直接与数据源或者数据目的连接的流一般没有缓冲区,可以串联到另一流的流一般有缓冲区,比如以串联到另一流的流一般有缓冲区,比如BufferedOutpu
10、tStreamBufferedOutputStream。n n如果流带有缓冲区,数据不会直接到达通道另一端,会暂如果流带有缓冲区,数据不会直接到达通道另一端,会暂时保存在缓存区当中,当数据超过缓冲区,才会到达通道时保存在缓存区当中,当数据超过缓冲区,才会到达通道另一端。或者使用另一端。或者使用flush()flush()方法,强迫数据通过流通道。方法,强迫数据通过流通道。n n流的串联是堆栈方式的,显示地调用栈顶流的流的串联是堆栈方式的,显示地调用栈顶流的flush()flush()方法,方法,程序会依次调用所有串联流的程序会依次调用所有串联流的flush()flush()方法。调用方法。调用
11、close()close()方方法关闭流,显示地关闭栈顶流即可。法关闭流,显示地关闭栈顶流即可。对于输出流,对于输出流,close()close()方法会自动调用方法会自动调用flush()flush()方法方法。n n举例:举例:I/O Stream ChainingProxy&Decorator Patternsn nFilterInputStream和FilterOutputStream使用了代理(Proxy)模式,代理模式是代理对象对被代理对象的一个功能不变的封装。n nDecorator模式也是某个对象对另外一个对象的功能包装,某些方法它直接转给包含对象,而某些方法则由包装对象来提供
12、,这样新包装对象可以提供扩展的功能。n n处理流大部分采用了Decorator模式,处理流就是对其它节点流或处理流进一步的功能包装。简单的简单的IO流(流(1)n nFileInput/OutputStreamn n代表一个在本地文件系统中的文件的IO流,可通过文件名或文件对象创建。FileInputStreamfis=newFileInputStream(“.in.txt”);FileOutputStreamfos=newFileOutputStream(newFile(“.out.txt”);intc;while(c=fis.read()!=-1)fos.write(c);fis.clos
13、e();fos.close();Example:Example:ReadFile1.javaReadFile1.java简单的简单的IO流(流(2)n nSequenceInputStreamSequenceInputStreamSequenceInputStream(InputStreamSequenceInputStream(InputStream,InputStreamInputStream)把两个把两个InputStreamInputStream连接为一个连接为一个InputStreamInputStreamn nByteArrayInput/OutputStreamByteArray
14、Input/OutputStreamn n从字节数组读取从字节数组读取/向字节数组写入向字节数组写入8 8位数据位数据n nStringBufferInputStream(StringStringBufferInputStream(Strings)s)n n把一个把一个StringString转换为转换为InputStreamInputStreamn nObjectInputStream/ObjectOutputStreamObjectInputStream/ObjectOutputStream举例:举例:ObjectExample.javaObjectExample.java 和和 MySe
15、rver.javaMyServer.java MyClient.javaMyClient.java简单的简单的IO流流(3)n nFilterInput/OutputStream过滤流n n作用:给朴素的作用:给朴素的Input/OutputStreamInput/OutputStream加上一些修加上一些修饰饰某些有用的格式某些有用的格式n n来源:来源:Input/OutputStreamInput/OutputStreamn n种类:种类:n nDataInput/OutputStreamDataInput/OutputStreamn nBufferedInput/OutputStrea
16、mBufferedInput/OutputStreamn nPrintStreamPrintStream/提供了提供了printprint和和printlnprintlnn n其他其他简单的简单的IO流流(4)n nDataInput/OutputStreamn n对于基本数据类型进行有格式的读写对于基本数据类型进行有格式的读写n nDataInputStreamDataInputStream实现了实现了DataInputDataInput接口接口readIntreadInt/Float/Char/Boolean/Long/Double()/Float/Char/Boolean/Long/Do
17、uble()n nDataOutputStreamDataOutputStream实现了实现了DataOutputDataOutput接口接口writeIntwriteInt/Float/Char/Boolean/Long/Double()/Float/Char/Boolean/Long/Double()简单的简单的IO流:举例流:举例 DataInOut.javaDataInOut.javainti=20;floatd=(float)20.22;Strings=“Hello测试;tryDataOutputStreamdout=newDataOutputStream(newFileOutput
18、Stream(“test.txt”);/dout可格式输出DataInputStreamdin=newDataInputStream(newFileInputStream(“test.txt”);/din可格式输入/利用DataOutputStreamdout写出数据dout.writeInt(i);dout.writeFloat(d);dout.writeUTF(s);System.out.println(writesuccessfully!);/利用DataInputStreamdin读入数据System.out.println(readingout:);System.out.printl
19、n(din.readInt();System.out.println(din.readFloat();System.out.println(din.readUTF();catch(Exceptione)简单的简单的IO流流(5)n nBufferedInput/OutputStreamn n自动利用内存缓冲,避免每次想要数据时都进自动利用内存缓冲,避免每次想要数据时都进行物理性的读取行物理性的读取 BufferedInputStream(InputStreamin)BufferedInputStream(InputStreamin)BufferedInputStream(InputStream
20、in,BufferedInputStream(InputStreamin,intintsize)size)n n 还可在其外面再加包装还可在其外面再加包装newnewDataInputStream(newDataInputStream(new BufferedInputStreamBufferedInputStream(newFileInputStream(“File1.txt”);newFileInputStream(“File1.txt”);简单的简单的IO流流(5)n nPrintStream类是FilterOutputStreamPrintStream(PrintStream(Outp
21、utStreamOutputStreamout,out,booleanboolean autoFlushautoFlush)n n自动刷新,这意味着可在写入字节数组之后自动调用flush方法,可调用其中一个println方法,或写入一个新行字符或字节(n)。System的标准输入与标准输出的标准输入与标准输出n nSystem.in,System.out是由JVM自动创建的对象,System.in是InputStream的子类,System.out是PrintStream的子类。n nSystem.in.read()/返回一个16位整型为了方便,经常进行封装处理BufferedReaderbr
22、=newBufferedReader(InputStreamReader(System.in);br.readLine();桥梁类桥梁类n n桥梁:InputStreamReader类和OutputStreamWriter类InputStreamInputStreamReaderReaderOutputStreamOutputStreamWriterWriterInput/OutputStreamReadern n从该类的构造器可以看出(以输入为例):从该类的构造器可以看出(以输入为例):public public InputStreamReader(InputStreamInputStrea
23、mReader(InputStream in)in)public public InputStreamReader(InputStreamInputStreamReader(InputStream in,String in,String charsetcharset)/)/指定字符编码方式指定字符编码方式 例如:文件Hello.txt采用了UTF8编码方式new new InputStreamReaderInputStreamReader (new(new FileInputStreamFileInputStream (“(“Hello.txtHello.txt”),”UTF8”);”),”U
24、TF8”);为了提高效率,一般把inputStreamReader封装在BufferReader里面。FileReader与与FileWritern n用于从文件中读取字符数据,该类只能使用用于从文件中读取字符数据,该类只能使用平台平台默认的字符编码默认的字符编码方式,不能指定其它方式。存在方式,不能指定其它方式。存在跨平台的风险。跨平台的风险。n n构造方法构造方法 FileReader(Filefile)FileReader(Filefile)FileReader(StringFileReader(StringfileNamefileName)FileWriter(Filefile)Fil
25、eWriter(Filefile)FileWriter(Filefile,FileWriter(Filefile,booleanbooleanappend)append)FileWriter(StringFileWriter(String fileNamefileName)FileWriter(StringFileWriter(String fileNamefileName,booleanbooleanappend)append)BufferReader与与PrintWritern nBufferReader提高效率,可直接读入一行字符串readLine().n nPrintWriter的构造
26、方法:PrintWriterPrintWriter(OutputStreamOutputStream/Writer/Writer)PrintWriterPrintWriter(OutputStreamOutputStream/Writer,/Writer,booleanboolean autoFlushautoFlush)提供了提供了print()print()和和printlnprintln()()方法方法练习练习n n编写一段javaApplication程序,从一个文件in.txt中读取内容,再将它写到文件out.txt中。in.txt采用本地平台默认的字符编码,而out.txt采用和本
27、地平台不同的字符编码UTF8。n nMyReaderWriter.javaMyReaderWriter.javaRandomAccessFile类类(1)n n随机访问文件:RandomAccessFile类n n不属于不属于Input/OutputStreamInput/OutputStreamn n用于访问本地文件用于访问本地文件n n可读可写可读可写n n同时实现了同时实现了DataInputDataInput和和DataOutputDataOutput接口,可同时进行有接口,可同时进行有格式的读写格式的读写n n创建时指定对应某一文件完成读或写操作创建时指定对应某一文件完成读或写操作R
28、andomAccessFileRandomAccessFiles1=news1=newRandomAccessFile(“a.txt”,”RandomAccessFile(“a.txt”,”r r”);”);Filef1=newFilef1=newFile(“a.txtFile(“a.txt”);”);RandomAccessFileRandomAccessFiles2=newRandomAccessFile(f1,”s2=newRandomAccessFile(f1,”rwrw”);”);/”r”/”r”和和“rwrw”是是javajava中文件访问权限的两种中文件访问权限的两种modemo
29、de练习练习n n如何打开一个文件(例如a.dat),读其内容?(请选择1个选项)n na)newRandomAccessFile(newFileInputStream(a.dat)n nb)newFileInputStream(newRandomAccessFile(a.dat,r)n nc)newRandomAccessFile(a.dat,rw)n nd)newRandomAccessFile(a.dat)RandomAccessFile类类(2)n n随机文件读写随机文件读写n nreadXx(),writeXxreadXx(),writeXx():():实现实现DataInputDa
30、taInput/Output/Output接口接口 readIntreadInt/Float/Char/Boolean/Long/Double()/Float/Char/Boolean/Long/Double()writeIntwriteInt/Float/Char/Boolean/Long/Double()/Float/Char/Boolean/Long/Double()readLinereadLine()()n n读写位置:文件指针及其操作函数读写位置:文件指针及其操作函数publiclongpubliclonggetFilePointergetFilePointer();/();/相当于
31、开头部分的指针的位置相当于开头部分的指针的位置publicvoidpublicvoidseek(longseek(longn);n);publicpublicintint skipBytes(intskipBytes(intn);n);n n所有的方法都可能产生异常,要使用所有的方法都可能产生异常,要使用trytry和和catchcatchRandomAccessFile类类 举例举例/第一次操作,依次写出10个数据RandomAccessFilerf=/读写模式newRandomAccessFile(rtest.dat,rw);for(inti=0;i10;i+)rf.writeDouble
32、(i*1.414);rf.close();/第二次操作,随机输出修改一个数值rf=newRandomAccessFile(“rtest.dat”,“rw”);/读写模式rf.seek(8);rf.writeDouble(47.0001);rf.close();/第三次操作,依次读入10个数据rf=newRandomAccessFile(“rtest.dat”,“r”);/读模式for(inti=0;i10;i+)System.out.println(Value+i+:+rf.readDouble();rf.close();A tipn n并不是所有的java程序都可以处理文件并执行文件操作。n
33、 n由于javaApplet程序通常是从网络上下载到本地运行的,不可知也不可控,因此,java的安全机制禁止javaApplet访问和存取本地文件,以避免对本地硬盘的潜在攻击。n n如果试图在javaApplet程序中使用文件操作,则将引发java的安全异常。作业作业1P230-71P230-7:首先获得在某一路径下的:首先获得在某一路径下的“.java”.java”结尾结尾的所有文件;去掉空行及注释,创建一组新文件的所有文件;去掉空行及注释,创建一组新文件(可以指定到某一新路径下),也是(可以指定到某一新路径下),也是“.java”.java”结结尾,保存处理过的文件。尾,保存处理过的文件。2 2使用使用RandomAccessFileRandomAccessFile类实现英文单词统计器。对类实现英文单词统计器。对于一个纯英文文章的于一个纯英文文章的txttxt文件,实现单词统计功能:文件,实现单词统计功能:(1 1)一共出现了多少个单词)一共出现了多少个单词(2 2)有多少个互不相同的单词)有多少个互不相同的单词(3 3)计算单词出现的频率,将出现频率最高的)计算单词出现的频率,将出现频率最高的5 5个个单词及其频率显示出来。单词及其频率显示出来。