下载

1下载券

加入VIP
  • 专属下载特权
  • 现金文档折扣购买
  • VIP免费专区
  • 千万文档免费下载

上传资料

关闭

关闭

关闭

封号提示

内容

首页 Java中IO系统总结

Java中IO系统总结.pdf

Java中IO系统总结

biglogovisa
2013-04-30 0人阅读 举报 0 0 暂无简介

简介:本文档为《Java中IO系统总结pdf》,可适用于IT/计算机领域

JavaIO系统总结SayingJava中的流分为两种一种是字节流另一种是字符流分别由四个抽象类来表示(每种流包括输入和输出两种所以一共四个):InputStream,OutputStreamReader,Writerstream代表的是任何有能力产出数据的数据源或是任何有能力接收数据的接收源。在Java的IO中所有的stream(包括Inputstream和Outputstream)都包括两种类型:字节流和字符流的区别:Reader和Writer要解决的最主要的问题就是国际化。原先的IO类库只支持位的字节流因此不可能很好地处理位的Unicode字符流。Unicode是国际化的字符集(更何况Java内置的char就是位的Unicode字符)这样加了Reader和Writer之后所有的IO就都支持Unicode了。此外新类库的性能也比旧的好。但是Read和Write并不是取代InputStream和OutputStream有时你还必须同时使用"基于byte的类"和"基于字符的类"。为此它还提供了两个"适配器(adapter)"类。InputStreamReader负责将InputStream转化成Reader而OutputStreamWriter则将OutputStream转化成Writer。当用户开始运行Java应用程序或Applet时会自动建立个对象:SysteminSystemout和Systemerr以上均为标准流对象。Java中的stream简介以字节为导向的stream以字节为导向的stream表示以字节为单位从stream中读取或往stream中写入信息。包括下面几种类型:)InputStream:)ByteArrayInputStream:把内存中的一个缓冲区作为InputStream使用)StringBufferInputStream:把一个String对象作为InputStream)FileInputStream:把一个文件作为InputStream实现对文件的读取操作)PipedInputStream:实现了pipe的概念主要在线程中使用)SequenceInputStream:把多个InputStream合并为一个InputStream)FilterInputStream:抽象类作为”修饰器”与其他对象相连以提供有用接口)OutputStream:)ByteArrayOutputStream:把信息存入内存中的一个缓冲区中)FileOutputStream:把信息存入文件中)PipedOutputStream:实现了pipe的概念主要在线程中使用)SequenceOutputStream:把多个OutStream合并为一个OutStream)FilterOutputStream:抽象类作为”修饰器”与其他对象相连以提供有用接口以字符为导向的stream以Unicode字符为导向的stream表示以Unicode字符为单位从stream中读取或往stream中写入信息。包括下面几种类型:)Reader)CharArrayReader:与ByteArrayInputStream对应)StringReader:与StringBufferInputStream对应)FileReader:与FileInputStream对应)PipedReader:与PipedInputStream对应)Writer)CharArrayWriter:与ByteArrayOutputStream对应)StringWriter:无与之对应的以字节为导向的stream)FileWriter:与FileOutputStream对应)PipedWriter:与PipedOutputStream对应以字符为导向的stream基本上有与之相对应的以字节为导向的stream。两个对应类实现的功能相同只是在操作时的导向不同。如CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用所不同的是前者每次从内存中读取一个字节的信息而后者每次从内存中读取一个字符。两种不同导向的stream之间的转换InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。为stream添加属性利用层叠的数个对象为单个对象动态地、透明地添加职责的方式称作“修饰器”(Decorator)模式。FilterInputStream和FilterOutputStream是用来提供修饰器类接口以控制特定输入(InputStream)和输出流(OutputStream)的两个类。分别继承自IO类库中的基类InputStream和OutputStream类。这两个类是修饰器的必要条件。“为stream添加属性”的作用运用上面介绍的Java中操作IO的API我们就可完成我们想完成的任何操作了。但通过FilterInputStream和FilterOutputStream的子类我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。如果我们要往一个文件中写入数据我们可以这样操作:FileOutputStreamfs=newFileOutputStream(“testtxt”)然后就可以通过产生的fs对象调用write()函数来往testtxt文件中写入数据了。但是如果我们想实现“先把要写入文件的数据缓存到内存中再把缓存中的数据写入文件中”的功能时上面的API就没有一个能满足我们的需求了。但是通过FilterInputStream和FilterOutputStream的子类为FileOutStream添加我们所需要的功能。FilterInputStream的各种类型用于封装以字节为导向的InputStream)DataInputStream:从stream中读取基本类型(int、charlong等)数据。)BufferedInputStream:使用它可以防止每次读写时都得进行实际写操作使用缓冲区)LineNumberInputStream:会记录inputstream内的行数然后可以调用getLineNumber()和setLineNumber(int))PushbackInputStream:很少用到一般用于编译器开发对象流ObjectInputStream类和ObjectOutputStream类分别是DataInputStream类和DataOutputStream类的子类用于封装以字符为导向的InputStream(Reader))没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader否则使用DataInputStream)BufferedReader:与BufferedInputStream对应)LineNumberReader:与LineNumberInputStream对应)PushBackReader:与PushbackInputStream对应用于封装以字节为导向的OutputStream用于封装以字节为导向的OutputStream)DataIOutputStream:往stream中输出基本类型(int、char等)数据。)BufferedOutputStream:使用缓冲区)PrintStream:产生格式化输出其中DataOutputStream处理数据的存储PrintStream处理显示DataOutputStream可以将各种基本数据类型以及String对象格式化输出到“流”中这样一来任何机器上的DataInputStream都能够读取他们。其所有方法均以“Write”开头。PrintStream最初的目的便是为了可视化格式打印所有的基本数据类型以及String对象这和DataOutputStream不同后者的目的是将数据元素置入“流”中使DataInputStream能够可移植地重构他们。用于封装以字符为导向的OutputStream)BufferedWriter:与对应)PrintWriter:与对应RandomAccessFile)可通过RandomAccessFile对象完成对文件的读写操作)在产生一个对象时可指明要打开的文件的性质:r只读w只写rw可读写)可以直接跳到文件中指定的位置IO应用实例importjavaio*publicclassTestIO{publicstaticvoidmain(Stringargs)throwsIOException{以行为单位从一个文件读取数据BufferedReaderin=newBufferedReader(newFileReader("F:nepalonTestIOjava"))Strings,s=newString()while((s=inreadLine())!=)s=s"n"inclose()当读取文件时先把文件内容读到缓存中当调用inreadLine()时再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”)b接收键盘的输入BufferedReaderstdin=newBufferedReader(newInputStreamReader(Systemin))Systemoutprintln("Enteraline:")Systemoutprintln(stdinreadLine())由于想以缓存字节读取方式从标准IO(键盘)中读取数据所以要先把标准IO(Systemin)转换成字符导向的stream再进行BufferedReader封装。从一个String对象中读取数据StringReaderin=newStringReader(s)intcwhile((c=inread())!=)Systemoutprintln((char)c)inclose()要以字符的形式从一个String对象中读取数据所以要产生一个StringReader类型的stream。从内存取出格式化输入try{DataInputStreamin=newDataInputStream(newByteArrayInputStream(sgetBytes()))while(true)Systemoutprintln((char)inreadByte())}catch(EOFExceptione){Systemoutprintln("Endofstream")}输出到文件try{BufferedReaderin=newBufferedReader(newStringReader(s))PrintWriterout=newPrintWriter(newBufferedWriter(newFileWriter("F:nepalonTestIOout")))intlineCount=while((s=inreadLine())!=)outprintln(lineCount":"s)outclose()inclose()}catch(EOFExceptionex){Systemoutprintln("Endofstream")}对String对象s读取数据时先把对象中的数据存入缓存中再从缓冲中进行读取对TestIOout文件进行操作时先把格式化后的信息输出到缓存中再把缓存中的信息输出到文件中。数据的存储和恢复try{DataOutputStreamout=newDataOutputStream(newBufferedOutputStream(newFileOutputStream("F:nepalonDatatxt")))outwriteDouble()outwriteChars("nThaswaspi:writeCharsn")outwriteBytes("Thaswaspi:writeByten")outclose()DataInputStreamin=newDataInputStream(newBufferedInputStream(newFileInputStream("F:nepalonDatatxt")))BufferedReaderinbr=newBufferedReader(newInputStreamReader(in))Systemoutprintln(inreadDouble())Systemoutprintln(inbrreadLine())Systemoutprintln(inbrreadLine())}catch(EOFExceptione){Systemoutprintln("Endofstream")}对Datatxt文件进行输出时是先把基本类型的数据输出到缓存中再把缓存中的数据输出到文件中对文件进行读取操作时先把文件中的数据读取到缓存中再从缓存中以基本类型的形式进行读取。注意inreadDouble()这一行。因为写入第一个writeDouble()所以为了正确显示。也要以基本类型的形式进行读取。有了write()和read()函数可以用DataOutputStream把字符串和其他数据类型相混合。例如:try{DataOutputStreamout=newDataOutputStream(newBufferedOutputStream(newFileOutputStream("Datatxt")))outwriteDouble()outwrite("Thatwaspi")outwriteDouble()outwrite("Squarerootof")outclose()DataInputStreamin=newDataInputStream(newBufferedInputStream(newFileInputStream("Datatxt")))MustuseDataInputStreamfordata:Systemoutprintln(inreadDouble())Onlyread()willrecovertheJavaStringproperly:Systemoutprintln(inread())ReadthefollowingdoubleandString:Systemoutprintln(inreadDouble())Systemoutprintln(inread())}catch(EOFExceptione){thrownewRuntimeException(e)}通过RandomAccessFile操作文件RandomAccessFilerf=newRandomAccessFile("F:nepalonrtestdat","rw")for(inti=i<i)rfwriteDouble(i*)rfclose()rf=newRandomAccessFile("F:nepalonrtestdat","r")for(inti=i<i)Systemoutprintln("Value"i":"rfreadDouble())rfclose()rf=newRandomAccessFile("F:nepalonrtestdat","rw")rfseek(*)rfwriteDouble()rfclose()rf=newRandomAccessFile("F:nepalonrtestdat","r")for(inti=i<i)Systemoutprintln("Value"i":"rfreadDouble())rfclose()}怎样逐字节地读取文件:importjavaio*publicclassTestEOF{Throwexceptionstoconsole:publicstaticvoidmain(Stringargs)throwsIOException{DataInputStreamin=newDataInputStream(newBufferedInputStream(newFileInputStream("TestEOFjava")))while(inavailable()!=)Systemoutprint((char)inreadByte())}关系对应表数据源和目的Java的类Java的类InputStreamReader的适配器:InputStreamReaderOutputStreamWriter的适配器:OutputStreamWriterFileInputStreamFileReaderFileOutputStreamFileWriterStringBufferInputStreamStringReader(没有对应的类)StringWriterByteArrayInputStreamCharArrayReaderByteArrayOutputStreamCharArrayWriterPipedInputStreamPipedReaderPipedOutputStreamPipedWriterFilter类Java的类Java的类FilterInputStreamFilterReaderFilterOutputStreamFilterWriter(这是个无派生类的抽象类)BufferedInputStreamBufferedReader(也有readLine())BufferedOutputStreamBufferedWriterDataInputStream尽量用DataInputStream(除非你用BufferedReader的时候要用readLine())PrintStreamPrintWriterLineNumberInputStream(过时了)LineNumberReaderStreamTokenizerStreamTokenizer(换一个构造函数把Reader当参数传给它)PushBackInputStreamPushBackReader基本使用转换读写文件的实用程序importjavaio*importjavautil*publicclassTextFileextendsArrayList{Toolstoreadandwritefilesassinglestrings:publicstaticStringread(StringfileName)throwsIOException{StringBuffersb=newStringBuffer()BufferedReaderin=newBufferedReader(newFileReader(fileName))Stringswhile((s=inreadLine())!=){sbappend(s)sbappend("n")}inclose()returnsbtoString()}publicstaticvoidwrite(StringfileName,Stringtext)throwsIOException{PrintWriterout=newPrintWriter(newBufferedWriter(newFileWriter(fileName)))outprint(text)outclose()}publicTextFile(StringfileName)throwsIOException{super(ArraysasList(read(fileName)split("n")))}publicvoidwrite(StringfileName)throwsIOException{PrintWriterout=newPrintWriter(newBufferedWriter(newFileWriter(fileName)))for(inti=i<size()i)outprintln(get(i))outclose()}Simpletest:publicstaticvoidmain(Stringargs)throwsException{Stringfile=read("TextFilejava")write("testtxt",file)TextFiletext=newTextFile("testtxt")textwrite("testtxt")}}读取标准输入Howtoreadfromstandardinputimportjavaio*publicclassEcho{publicstaticvoidmain(Stringargs)throwsIOException{BufferedReaderin=newBufferedReader(newInputStreamReader(Systemin))Stringswhile((s=inreadLine())!=slength()!=)Systemoutprintln(s)AnemptylineorCtrlZterminatestheprogram}}将Systemout转换成PrintWriterSystemout是PrintStream也就是说它是OutputStream。不过PrintWriter有一个能将OutputStream改造成PrintWriter的构造函数。有了这个构造函数你就可以随时将Systemout转化成PrintWriter了。importjavaio*publicclassChangeSystemOut{privatestaticTestmonitor=newTest()publicstaticvoidmain(Stringargs){PrintWriterout=newPrintWriter(Systemout,true)outprintln("Hello,world")monitorexpect(newString{"Hello,world"})}}为了启动自动清空缓冲区的功能一定要使用双参数版的构造函数并且把第二个参数设成true。这点非常重要否则就有可能会看不到输出了。输入输出流转向importjavaio*publicclassRedirecting{publicstaticvoidmain(Stringargs)throwsIOException{PrintStreamconsole=SystemoutBufferedInputStreamin=newBufferedInputStream(newFileInputStream("Redirectingjava"))PrintStreamout=newPrintStream(newBufferedOutputStream(newFileOutputStream("testout")))SystemsetIn(in)SystemsetOut(out)BufferedReaderbr=newBufferedReader(newInputStreamReader(Systemin))Stringswhile((s=brreadLine())!=)Systemoutprintln(s)outclose()SystemsetOut(console)}}在这里javalangSystem的静态方法staticvoidsetIn(InputStreamin)staticvoidsetOut(PrintStreamout)提供了重新定义标准输入输出流的方法这样做是很方便的比如一个程序的结果有很多有时候甚至要翻页显示这样不便于观看结果这是你就可以将标准输出流定义为一个文件流程序运行完之后打开相应的文件观看结果就直观了许多。

用户评价(0)

关闭

新课改视野下建构高中语文教学实验成果报告(32KB)

抱歉,积分不足下载失败,请稍后再试!

提示

试读已结束,如需要继续阅读或者下载,敬请购买!

文档小程序码

使用微信“扫一扫”扫码寻找文档

1

打开微信

2

扫描小程序码

3

发布寻找信息

4

等待寻找结果

我知道了
评分:

/10

Java中IO系统总结

VIP

在线
客服

免费
邮箱

爱问共享资料服务号

扫描关注领取更多福利