IO输入输出流_第1页
IO输入输出流_第2页
IO输入输出流_第3页
IO输入输出流_第4页
IO输入输出流_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

输入输出流,本章内容,Java流式输入/输出原理Java流类的分类输入/输出流类常见的节点流和处理流文件流缓冲流字符集和编码数据流转换流Print流Object流NIO简介,Java流式输入/输出原理,在Java程序中,对于数据的输入/输出操作以“流”(stream)方式进行;J2SDK提供了各种各样的“流”类,用以获取不同种类的数据;程序中通过标准的方法输入或输出数据。,流是一个很形象的概念,I/O流提供一条通道程序,可以使用这条通道把源中的字节序列送给目的地。把输入流的指向称做源,程序从指向源的输入流中读取源中的数据。而输出流的指向是字节要去的一个目的地(或用户),程序通过向输出流中写入数据把信息传递到目的地。虽然I/O流经常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘、鼠标、内存或显示器窗口。,输入/输出流的分类,java.io包中定义了多个流类型(类或抽象类)来实现输入/输出功能;可以从不同的角度对其进行分类:按数据流的方向不同可以分为输入流和输出流。(以程序的角度来考虑)按处理数据单位不同可以分为字节流和字符流。按照功能不同可以分为节点流和处理流。J2SDK所提供的所有流类型位于包java.io内都分别继承自以下四种抽象流类型。,节点流和处理流,节点流为可以从一个特定的数据源(节点)读写数据(如:文件,内存),处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。,InputStream,继承自InputSteam的流都是用于向程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。,InputStream的基本方法,/读取一个字节并以整数的形式返回(0255),/如果返回-1已到输入流的末尾。intread()throwsIOException/读取一系列字节并存储到一个数组buffer,/返回实际读取的字节数,如果读取前已到输入流的末尾返回-1intread(bytebuffer)throwsIOException/读取length个字节/并存储到一个字节数组buffer,从off位置开始存,最多len/返回实际读取的字节数,如果读取前以到输入流的末尾返回-1intread(bytebuffer,intoff,intlen)throwsIOException/关闭流释放内存资源voidclose()throwsIOException,OutputStream,继承自OutputSteam的流是用于程序中输入数据,且数据的单位为字节(8bit);下图中深色为节点流,浅色为处理流。,OutputStream的基本方法,/向输出流中写入一个字节数据,该字节数据为参数b的低8位voidwrite(intb)throwsIOException/将一个字节类型的数组中的数据写入输出流voidwrite(byteb)throwsIOException/将一个字节类型的数组中的从指定位置(off)开始的/len个字节写入到输出流voidwrite(byteb,intoff,intlen)throwsIOException/关闭流释放内存资源voidclose()throwsIOException/将输出流中缓冲的数据全部写出到目的地voidflush()throwsIOException,良好的编程习惯先flush()再close(),Reader,继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(16bit);下图中深色为节点流,浅色的为处理流。,Reader的基本方法,/读取一个字符并以整数的形式返回(0255),/如果返回-1已到输入流的末尾。intread()throwsIOException/读取一系列字符并存储到一个数组buffer,/返回实际读取的字符数,如果读取前已到输入流的末尾返回-1intread(charcbuf)throwsIOException/读取length个字符/并存储到一个数组buffer,从off位置开始存,最多读取len/返回实际读取的字符数,如果读取前以到输入流的末尾返回-1intread(charcbuf,intoff,intlen)throwsIOException/关闭流释放内存资源voidclose()throwsIOException0,Writer,继承自Writer的流都是用于程序中输入数据,且数据的单位为字符(16bit);下图中深色为节点流,浅色为处理流。,Writer的基本方法,/向输出流中写入一个字符数据,该字节数据为参数b的低16位voidwrite(intc)throwsIOException/将一个字符类型的数组中的数据写入输出流,voidwrite(charcbuf)throwsIOException/将一个字符类型的数组中的从指定位置(offset)开始的/length个字符写入到输出流voidwrite(charcbuf,intoffset,intlength)throwsIOException/将一个字符串中的字符写入到输出流voidwrite(Stringstring)throwsIOException/将一个字符串从offset开始的length个字符写入到输出流voidwrite(Stringstring,intoffset,intlength)throwsIOException/关闭流释放内存资源voidclose()throwsIOException/将输出流中缓冲的数据全部写出到目的地voidflush()throwsIOException,节点流类型,访问文件,FileInputStream和FileOutputStream分别继承自InputStream和OutputStream用于向文件中输入和输出字节。FileInputStream和FileOutputStream的常用构造方法:FileInputStream(Stringname)throwsFileNotFoundExceptionFileInputStream(Filefile)throwsFileNotFoundExceptionFileOutputStream(Stringname)throwsFileNotFoundExceptionFileOutputStream(Filefile)throwsFileNotFoundExceptionFileOutputStream(Filefile,booleanappend)throwsFileNotFoundException,FileInputSteam和FileOutputStream类支持其父类InputStream和OutputStream所提供的数据读写方法。注意:在实例化FileInputStream和FileOutputSteam流时要用trycatch语句以处理其可能抛出的FileNotFoundException。在读写数据时也要用trycatch语句以处理可能抛出的IOException。FileNotFoundException是IOException的子类,例:TestFileInputStream.java/TestFileOutputStream.java,访问文件,FileReader和FileWriter分别继承自Reader和Writer,FileInputSteam与FileOutputStream类似,所不同的时FileReader和FileWriter向文件输入和输出的数据单位为字符。FileReader和FileWriter的常用构造方法:,publicFileWriter(Filefile)throwsIOExceptionpublicFileWriter(Filefile,booleanappend)throwsIOExceptionpublicFileWriter(StringfileName)throwsIOExceptionpublicFileWriter(StringfileName,booleanappend)throwsIOExceptionpublicFileReader(StringfileName)throwsFileNotFoundExceptionpublicFileReader(Filefile)throwsFileNotFoundException,例:TestFileWriter.java/TestFileReader.java,处理流类型,缓冲流,缓冲流要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。J2SDK提供了四种缓存流,其常用的构造方法为:,BufferedReader(Readerin)BufferedReader(Readerin,intsz)/sz为自定义缓存区的大小BufferedWriter(Writerout)BufferedWriter(Writerout,intsz)BufferedInputStream(InputStreamin)BufferedInputStream(InputStreamin,intsize)BufferedOutputStream(OutputStreamout)BufferedOutputStream(OutputStreamout,intsize),BufferedReader提供了readLine方法用于读取一行字符串(以r或n分隔)BufferedWriter提供了newLine用于写入一个行分隔符。对于输出的缓冲流,写出的数据会先在内存中缓存,使用flush方法将会使内存中的数据立刻写出。,例:TestBufferStream1/2.java,转换流,InputStreamReader和OutputStreamWriter用与字节数据到字符数据之间的转换。InputStreamReader需要和InputStream“套接”。OutpStreamWriter需要和OutputStream“套接”。转换流在构造时可以指定其编码集合,例如:InputStreamisr=newInputStreamReader(System.in,“ISO8859_1”),例:TestTransform1/2.java,nio:异步IO,非阻塞,什么是字符集?什么是编码?,字符(Character):是文字与符号的总称,包括文字、图形符号、数学符号等。字符集(Charset):就是一组抽象字符的集合。字符集常常和一种具体的语言文字对应起来,该文字中的所有字符或者大部分常用字符就构成了该文字的字符集,比如英文字符集。一组有共同特征的字符也可以组成字符集,比如繁体汉字字符集、日文汉字字符集。编码(Encoding):制定编码首先要确定字符集,并将字符集内的字符排序,然后和二进制数字对应起来。根据字符集内字符的多少,会确定用几个字节来编码。,常用字符集有哪些?,ASCIIAmericanStandardCodeforInformationInterchange,美国信息交换标准码。在计算机的存储单元中,一个ASCII码值占一个字节(8个二进制位)ISO/IEC8859,是国际标准化组织(ISO)及国际电工委员会(IEC)联合制定的一系列8位字符集的标准.,iso8859-1编码表示的字符范围很窄,无法表示中文字符UCS:通用字符集(UniversalCharacterSet,UCS)是由ISO制定的ISO10646(或称ISO/IEC10646)标准所定义的字符编码方式,采用4字节编码。UCS-2:与unicode的2byte编码基本一样。UCS-4:4byte编码,目前是在UCS-2前加上2个全零的byte。,Unicode:Unicode的编码方式与ISO10646的通用字符集(UniversalCharacterSet,UCS)概念相对应,目前的用于实用的Unicode版本对应于UCS-2,使用16位的编码空间。也就是每个字符占用2个字节,共可以表示65536个字符。基本满足各种语言的使用。Unicode字符集有多种编码形式标准的Unicode称为UTF-16后来为了双字节的Unicode能够在现存的处理单字节的系统上正确传输,出现了UTF-8,使用类似MBCS的方式对Unicode进行编码。,UTF:Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一定一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。Unicode的实现方式称为Unicode转换格式(UnicodeTranslationFormat,简称为UTF)。UTF-8:8bit变长编码,对于大多数常用字符集(ASCII中0127字符)它只使用单字节,而对其它常用字符(特别是朝鲜和汉语会意文字),它使用3字节。UTF-16:16bit编码,大致相当于20位编码,汉字编码,GB2312字集是简体字集,全称为GB2312(80)字集,共包括国标简体汉字6763个。GB2312,正式的名称为MBCS(Multi-ByteChactacterSystem,多字节字符系统),通常也称为ANSI字符集。BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个。GBK字集是简繁字集,包括了GB字集、BIG5字集和一些符号,共包括21003个字符。GB18030是国家制定的一个强制性大字集标准,全称为GB18030-2000,它的推出使汉字集有了一个“大一统”的标准。,ISO/IEC8859,ISO/IEC8859ISO8859-1(Latin-1)-西欧语言Unicode字符集中覆盖了ISO8859_1ISO8859-2(Latin-2)-中欧语言ISO8859-3(Latin-3)-南欧语言。世界语也可用此字符集显示。ISO8859-4(Latin-4)-北欧语言ISO8859-5(Cyrillic)-斯拉夫语言ISO8859-6(Arabic)-阿拉伯语ISO8859-7(Greek)-希腊语ISO8859-8(Hebrew)-希伯来语(视觉顺序)ISO8859-8-I-希伯来语(逻辑顺序)ISO8859-9(Latin-5或Turkish)-它把Latin-1的冰岛语字母换走,加入土耳其语字母。ISO8859-10(Latin-6或Nordic)-北日耳曼语支,用来代替Latin-4。ISO8859-11(Thai)-泰语,从泰国的TIS620标准字集演化而来。ISO8859-13(Latin-7或BalticRim)-波罗的语族ISO8859-14(Latin-8或Celtic)-凯尔特语族ISO8859-15(Latin-9)-西欧语言,加入Latin-1欠缺的法语及芬兰语重音字母,以及欧元符号。ISO8859-16(Latin-10)-东南欧语言。主要供罗马尼亚语使用,并加入欧元符号。,如何读取utf-8的文件?,importjava.io.*;publicclassTestInputStreamReaderpublicstaticvoidmain(Stringargs)throwsExceptionFileInputStreamfin=newFileInputStream(d:chartestutf-8.txt);InputStreamReaderfileIn=newInputStreamReader(fin,UTF-8);BufferedReaderinfm=newBufferedReader(fileIn);Strings=;while(true)s=infm.readLine();if(s=null)break;System.out.println(s);,DataInputStream和DataOutputStream分别继承自InputSteam和OutputStream,它属于处理流,需要分别“套接”在InputStream和OutputStream类型的节点流上。DataInputStream和DataOutputStream提供了可以存取与机器无关的Java原始类型数据(如:int,double等)的方法。DataInputStream和DataOutputStream的构造方法为:DataInputStream(InputStreamin)DataOutputStream(OutputStreamout),数据流&ByteArrayInputStream&ByteArrayOutputStream,例:TestDataStream.java,PrintWriter和PrintStream都属于输出流,分别针对与字符和字节。PrintWriter和PrintStream提供了重载的printPrintln方法用于多种数据类型的输出。PrintWriter和PrintStream的输出操作不会抛出异常,用户通过检测错误状态获取错误信息。PrintWriter和PrintStream有自动flush功能。,Print流,PrintWriter(Writerout)PrintWriter(Writerout,booleanautoFlush)PrintWriter(OutputStreamout)PrintWriter(OutputStreamout,booleanautoFlush)PrintStream(Ou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论