java io 总结.doc_第1页
java io 总结.doc_第2页
java io 总结.doc_第3页
java io 总结.doc_第4页
java io 总结.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

java io 总结 java中的io中的(input/output)stream无非就是包括基于字符的stream、基于字节的stream和把字节导向的stream转换字符为导向的stream的stream。 (很难理解么?)以字节为导向的streamInputStream/OutputStreamInputStream和OutputStream是两个abstact类,对于字节为导向的stream_);InputStreamByteArrayInputStream把内存中的一个缓冲区作为InputStream使用.constructByteArrayInputStream(byte)创建一个新字节数组输入流,它从指定字节数组中读取数据。 ByteArrayInputStream(byte,int,int)创建一个新字节数组输入流,它从指定字节数组中读取数据。 mark:该字节数组未被复制。 StringBufferInputStream把一个String对象作为InputStream.注释不推荐使用StringBufferInputStream方法。 此类不能将字符正确的转换为字节。 同JDK1.1版中的类似,从一个串创建一个流的最佳方法是采用StringReader类。 constructStringBufferInputStream(String)据指定串创建一个读取数据的输入流串。 FileInputStream把一个文件作为InputStream,实现对文件的读取操作constructFileInputStream(File)创建一个输入文件流,从指定的File对象读取数据。 FileInputStream(FileDescriptor)创建一个输入文件流,从指定的文件描述器读取数据。 FileInputStream(String)创建一个输入文件流,从指定名称的文件读取数据。 methodread()从当前输入流中读取一字节数据。 read(byte)将当前输入流中b.length个字节数据读到一个字节数组中。 read(byte,int,int)将输入流中len个字节数据都扩展这两个鸡肋(基类读入一个字节数组中。 PipedInputStream实现了pipe的概念,主要在线程中使用.管道输入流是指一个通讯管道的接收端。 一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。 PipedInputStream()创建一个管道输入流,接。 PipedInputStream(PipedOutputStream)创建一个管道输入流,它已连接到一个管道输出它还未与一个管道输出流连流。 SequenceInputStream把多个InputStream合并为一个InputStream.“序列输入流”类允许应用程序把几个输入流连续地合并起来,并且使它们像单个输入流一样出现。 每个输入流依次被读取,直到到达该流的末尾。 然后“序列输入流”类关闭这个流并自动地切换到下一个输入流。 SequenceInputStream(Enumeration)创建一个新的序列输入流,并用指定的输入流的枚举值初始化它。 SequenceInputStream(InputStream,InputStream)创建一个新的序列输入流,初始化为首先读输入流s1,然后读输入流s2。 OutputSteam ByteArrayOutputStream把信息存入内存中的一个缓冲区中.该类实现一个以字节数组形式写入数据的输出流。 当数据写入缓冲区时,它自动扩大。 用toByteArray()和toString()能检索数据。 constructByteArrayOutputStream()创建一个新的字节数组输出流。 ByteArrayOutputStream()创建一个新的字节数组输出ByteArrayOutputStream(int)创建一个新的字节数组输出流,并带有指定大小字节的缓冲区容量。 toString(String)根据指定字符编码将缓冲区内容转换为字符串,并将字节转换为字符。 write(byte,int,int)将指定字节数组中从偏移量off开始的len个字节写入该字节数组输出流。 write(int)将指定字节写入该字节数组输出流。 writeTo(OutputStream)用out.write(buf,0,count)调用输出流的写方法将该字节数组输出流的全部内容写入指定的流。 输出流参数。 FileOutputStream:文件输出流是向File或FileDescriptor输出数据的一个输出流。 FileOutputStream(File)创建一个文件输出流,据。 FileOutputStream(FileDescriptor)创建一个文件输出流,向指定的文件描述器输出数据。 FileOutputStream(String)创建一个文件输出流,据。 FileOutputStream(String,boolean)用指定系统的文件名,创建一个输出文件。 PipedOutputStream:管道输出流是指一个通讯管道的发送端。 一个线程通过管道输出流向指定的File对象输出数向指定名称的文件输出数发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。 PipedOutputStream()创建一个管道输出流,接。 PipedOutputStream(PipedInputStream)创建一个管道输出流,它已连接到一个管道输入它还未与一个管道输入流连流。 以字符为导向的stream Reader/Writer以Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。 Reader/Writer为abstact类以Unicode字符为导向的stream包括下面几种类型Reader1)CharArrayReader与ByteArrayInputStream对应CharArrayReader(char)用指定字符数组创建一个CharArrayReader。 CharArrayReader(char,int,int)用指定字符数组创建一个CharArrayReader。 2)StringReader与StringBufferInputStream对应StringReader(String)创建一新的串读取者。 3)FileReader与FileInputStream对应4)PipedReader与PipedInputStream对应Writer1)CharArrayWrite与ByteArrayOutputStream对应2)StringWrite无与之对应的以字节为导向的stream3)FileWrite与FileOutputStream对应4)PipedWrite与PipedOutputStream对应两种不现导向的stream之间的转换InputStreamReader和OutputStreamReader把一个以字节为导向的stream转换成一个以字符为导向的stream。 一个InputStreamReader类是从字节流到字符流的桥梁它读入字节,并根据指定的编码方式,将之转换为字符流。 使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。 InputStreamReader的read()方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。 为了达到更高效率,考虑用BufferedReader封装InputStreamReader,BufferedReader in=new BufferedReader(new InputStreamReader(System.in);InputStreamReader(InputStream)用缺省的字符编码方式,InputStreamReader。 InputStreamReader(InputStream,String)用已命名的字符编码方式,创建一个InputStreamReader。 OutputStreamWriter将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。 每个OutputStreamWriter合并它自己的CharToByteConverter,因而是从字符流创建一个到字节流的桥梁。 FilterInputStream、RandomAessFile见例子。 ObjectInputStream、ObjectOutputStream见另外blog。 Java IO的一般使用原则 一、按数据(去向)分类 1、是文件FileInputStream,FileOutputStream,FileReader,FileWriter 2、是byteByteArrayInputStream,ByteArrayOutputStream 3、是Char:CharArrayReader,CharArrayWriter 4、StringReader,StringWriter 5、网络数据流InputStream,OutputStream,Reader,Writer 二、按是否格式化输出分 1、要格式化输出PrintStream,PrintWriter 三、按是否要缓冲分BufferedOutputStream,BufferedReader,BufferedWriter是String:StringBufferInputStream, 1、要缓冲BufferedInputStream, 四、按数据格式分 1、二进制格式(只要不能确定是纯文本的):InputStream,OutputStream及其所有带Stream结束的子类 2、纯文本格式(含纯英文与汉字或其他编码方式);Reader,Writer及其所有带Reader,Writer的子类 五、按输入输出分 1、输入Reader,InputStream类型的子类 2、输出Writer,OutputStream类型的子类 六、特殊需要 1、从Stream到Reader,Writer的转换类InputStreamReader,OutputStreamWriter 2、对象输入输出ObjectInputStream,ObjectOutputStream 3、进程间通信PipeInputStream,PipeOutputStream,PipeReader,PipeWriter 4、合并输入SequenceInputStream 5、PushbackInputStream,PushbackReader,LineNumberInputStream,LineNumberReader更特殊的需要决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要)首先,考虑最原始的数据格式是什么原则四第二,是输入还是输出原则五第三,是否需要转换流原则六第1点第四,数据(去向)是什么原则一第五,是否要缓冲原则三(特别注明一定要注意的是readLine()是否有定义,有什么比read,write更特殊的输入或输出方法)第六,是否要格式化输出原则二文章2首先是java的IO。 这破东西可真费事,I/O类库常使用”流(stream)”这种抽象。 所谓”流”是一种能生成或接受数据的,代表数据的源和目标的对象。 流把I/O设备内部的具体操作给隐藏起来了。 正如JDK文档所显示的,Java的I/O类库分成输入和输出两大部分。 所有InputStream和Reader的派生类都有一个基本的,继承下来的,能读取单个或byte数组的read()方法。 同理,所有OutputStream和Writer的派生类都有一个基本的,能写入单个或byte数组的write()方法。 但通常情况下,你是不会去用这些方法的;它们是给其它类用的而后者会提供一些更实用的接口。 因此,你很少会碰到只用一个类就能创建一个流的情形,实际上你得把多个对象叠起来,并以此来获取所需的功能。 Java的流类库之所以会那么让人犯晕,最主要的原因就是”你必须为创建一个流而动用多个对象”。 Java的IO类结构根接口FileInputStream/FileOutputStream,ByteArrayInputStream/ByteArrayOutputStream等,充当IO类有BufferedInputStream DataInputStream/DataOutputStream等,FilterInputStream/FilterOutputStream。 使用IO时,首先创建一个数据源IO,然后根据需要的功能创建装饰类IO,其构造函数的参数为已创建的数据源IO。 我们以创建一个具有缓冲的文件输入流为例,假定需要从磁盘读取文件“C:log.txt”/创建一个FileInputStream:FileInputStream fileInput=new FileInputStream(”C:log.txt”);是InputStream/OutputStream,充当数据源的IO类有装饰功能的/BufferedOutputStream,它们都是继承装饰接口/创建一个BufferedInputStream:BufferedInputStream bufferedInput=new BufferedInputStream(fileInput);/现在得到的bufferedInput即是具有缓冲的文件输入流或者进一步简写如下InputStream input=new BufferedInputStream(new FileInputStream(”C:log.txt”);/现在得到的input即是具有缓冲的文件输入流java.io.Reader和java.io.InputStream区别java.io.Reader和java.io.InputStream组成了Java输入类。 Reader用于读入16位字符,也就是Unicode编码的字符;而InputStream用于读入ASCII字符和二进制数据。 在Java中,有不同类型的Reader输入流对应于不同的数据源FileReader用于从文件输入;CharArrayReader用于从程序中的字符数组输入;StringReader用于从程序中的字符串输入;PipedReader用于读取从另一个线程中的PipedWriter写入管道的数据。 相应的也有不同类型的InputStream输入流对应于不同的数据源FileInputStream,ByteArrayInputStream,StringBufferInputStream,PipedInputStream。 另外,还有两种没有对应Reader类型的InputStream输入流Socket用于套接字;URLConnection用于URL连接。 这两个类使用getInputStream()来读取数据。 相应的,和java.io.OutputStream也有类似的区别。 1、Java技术支持两种数据类型的流InputStream和OutputStream字节流。 其它字节流都是InputStream或OutputStream的子类。 Reader和Writer字符流。 其它字符流都是Reader或Writer的子类。 2、节点流Java2SDK中有三种基本类型的节点文件(file)、内存(memory)、管道(pipe)。 3、过程流过程流在其它流之上,完成排序、变换等操作。 过程流也被称做过滤流。 当java.io.Writer你需要改变输入流的原始数据时,你可以将一个过滤输入流连接到一个原始的输入流上。 用过滤流将原始数据变换成你需要的格式。 4、基本字节流类4. 1、FileInputStream和FileOutputStream这两个节点流用来操纵磁盘文件。 这些类的构造函数允许你指定它们所连接的文件。 要构造一个FileInputStream,所关联的文件必须存在而且是可读的。 如果你要构造一个FileOutputStream而输出文件已经存在,则它将被覆盖。 FileInputStream infile=new FileInputStream(”myfile.dat”);FileOutputStream outfile=new FileOutputStream(”results.dat”);4. 1、BufferInputStream和BufferOutputStream这些是过滤器流,它们可以提高I/O操作的效率。 4. 3、PipedInputStream和PipedOutputStream管道流用来在线程间进行通信。 一个线程的PipedInputStream对象从另一个线程的PipedOutputStream对象读取输入。 要使管道流有用,必须有一个输入方和一个输出方。 4. 4、DataInputStream和DataOutputStream这些过滤器通过流来读写Java基本类 5、基本字符流类图阐述了Reader和Writer字符流的体系结构。 5. 1、InputStreamReader和OutputStreamWriter用于字节流与字符流之间的转换接口。 InputStreamReader或OutputStreamWriter时,转换规则定义了16位Unicode和其它平台的特定表示之间的转换。 InputStreamReader从一个数据源读取字节,并自动将其转换成Unicode字符。 如果你特别声明,InputStreamReade会将字节流转换成其它种类的字符流。 OutputStreamWriter将字符的Unicode编码写到输出流,如果你的使用的不是Unicode字符,OutputStreamWriter会将你的字符编码转换成Unicode编码。 5.2.、缓冲读者和作者因为在各种格式之间进行转换和其它I/O操作很类似,所以在处理大块数据时效率最高。 在InputStreamReader和OutputStreamWriter的结尾链接一个BufferedReader和BufferedWriter是一个好主意。 记住对BufferedWriter使用flush()方法。 5. 3、使用其它字符转换如果你需要从一个非本地(例如,从连接到一个不同类型的机器的网络连接读取)的字符编码读取输入,当你构造一个你可以象下面这个程序那样,ir=new InputStreamReader(System.in,“8859_1使用显式的字符编码构造);注如果你通过网络连接读取字符,就应该使用这种形式。 否则,你的程序会总是试图将所读取的字符当作本地表示来进行转换,而这并不总是正确的。 ISO88591是映射到ASCII的Latin1编码模式。 6、对象串行化java.io.Serializable接口支持将一个Java技术对象存放到一个流中。 将一个对象存放到某种类型的永久存储器上称为”保持”。 如果一个对象可以被存放到磁盘或磁带上,或者可以发送到另外一台机器并存放到存储器或磁盘上,那么这个对象就被称为可保持的。 java.io.Serializable接口没有任何方法,它只作为一个”标记”,用来表明实现了这个接口的类可以串行化。 类中没有实现Serializable接口的对象不能被保持。 /文件实现追加/其中的FileWriter()中的第二个参数的含义是:是否在文件中追加内容PrintWriter out=new PrintWriter(new FileWriter(logFileName,true),true);Java读写文件最常用的类是FileInputStream/FileOutputStream和FileReader/FileWriter。 其中FileInputStream和FileOutputStream是基于字节流的,常用于读写二进制文件。 读写字符文件建议使用基于字符的FileReader和FileWriter,省去了字节与字符之间的转换。 但这两个类的构造函数默认使用系统的编码方式,如果文件内容与系统编码方式不一致,可能会出现乱码。 InputStreamReader/OutputStreamWriter,它们也是基于字符的,但在构造函数中可以指定编码类型InputStreamReader(InputStream in,Charset cs)和OutputStreamWriter(OutputStream out,Charset cs)。 在这种情况下,建议使用FileReader和FileWriter的父类/读写文件的编码InputStreamReader r=new InputStreamReader(new FileInputStream(fileName),“utf8);OutputStreamWriter out=new OutputStreamWriter(new FileOutputStream(fileName),”utf8);/*三种IO性能比较:在读写一个10k文件的时候,三种方式的耗时如下:InputStreamReader AndOutputStreamWriter:63ms(可以设置文件的编码,如果不用buffer)BufferedReader AndBufferedWriter:31ms BufferedInputStream And BufferedOutputStream:16ms*/*Description:Test thejava IOs efficiency*Author:KevinChen*Date:xx0218*/import java.io.*;/*using theInputStreamReader AndOutputStreamWriter*/class EncoderRWpublic staticString read(String fileName)throws IOExceptionStringBuffer sb=new StringBuffer();/*此处读文件时用了buffer,如果不用,性能损失一倍*/BufferedReader in=new BufferedReader(new InputStreamReader(new FileInputStream(fileName),“utf8);String s;while(s=in.readLine()!=null)sb.append(s);sb.append(”n”);in.close();return sb.toString();public voidwrite(String fileName,String text)throws IOExceptionOutputStreamWriter out=new OutputStreamWriter(new FileOutputStream(fileName),”utf8);out.write(text);out.flush();out.close();/*using theBufferedReader AndBufferedWriter*/class WriterReaderpublic Stringread(String fileName)throws IOExceptionStringBuffer sb=new StringBuffer();BufferedReader in=new BufferedReader(new FileReader(fileName);String s;while(s=in.readLine()!=null)sb.append(s);sb.append(”n”);in.close();return sb.toString();public voidwrite(String fileName,String text)throws IOExceptionPrintWriter out=new PrintWriter(new BufferedWriter(new FileWriter(fileName);out.print(text);out.close();/*using theBufferedInputStreamAndBufferedOutputStream*/class BufferedStreampublic byteread(String fileName)throws IOExceptionBufferedInputStream remoteBIS=new BufferedInputStream(new FileI

温馨提示

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

最新文档

评论

0/150

提交评论