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

下载本文档

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

文档简介

1、Java 输入输出流详解文章分类:Java编程   最近一段时间,处于失业状态,正好有机会对未理解的知识进行整理,面试中这部分的知识很大可能也是会遇到的。下面的内容一部分是从网上筛选的,经过自己的梳理后总结的。 Java IO 用的是decorator模式来构建的。要容易理解Java IO 应该从对称性和两个模式(装饰器模式和适配器模式)这两方面进行分析。 装饰器模式:    在由InputStream、OutputStream、Reader和Writer 代表的等级结构内部,有一些流处理器可以对另外一些流处理器起到装饰作用

2、,形成新的、具有改善了的功能的流处理器。 下面是Decorator模式的结构图:1.Component就是装饰器模式中公共方法的类,在装饰器模式结构图的顶层。2.ConcreateComponent是转换器模式中具体的被装饰的类,IO包中的媒体流就是此种对象。3.Decorator装饰器模式中的核心对象,所有具体装饰器对象的父类,完成装饰器的部分职能。在上面的例子中Decorator类和这里的对应。该类可以只做一些简单的包裹被装饰的对象,也可以还包含对Component中方法的实现他有一个鲜明的特点:继承至Component,同时包含一个Component作为其成员变量。装饰器模式动

3、机中的动态地增加功能是在这里实现的。4.ConcreteDecoratorA和ConcreteDecoratorB是两个具体的装饰器对象,他们完成具体的装饰功能。装饰功能的实现是通过调用被装饰对象对应的方法,加上装饰对象自身的方法。这是装饰器模式动机中的添加额外功能的关键。 适配器模式: 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。 比如ByteArrayInputStream 是一个适配器类,它继承了InputStream,而封装了一个byte数组,换句话说,它将以个byte数组的接口适配成Inp

4、utStream流处理器的接口。适配器的结构图:  下面开始了解Java IO   Java IO 中的流从不同的角度可以分成三类:1、按数据流的方向不同可以分为输入流(InputStream/Reader)和输出流(OutputStream/Writer),用户可以从输入流中读取信息,但不能写它。相反,对输出流,只能往往输出流写,而不能读取。2、按处理数据单位不同可以分为字节流(InputStream/OutputStream-8位)和字符流(Reader/Writer-16位)。3、按功能不同可以分为节点流(原始流)和处理流(链接流)。节点流为可以从

5、一个特定的数据源(节点)读写数据(如文件、内存)。处理流是“连接”在已存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。下面的分析是从功能上来分析的: 字节流处理类概述: 对于字节流处理的类都继承自InputStream和OutputStream这两个抽象类。 InputStream InputStream结构图,从图中可以很清楚的看到装饰器模式的应用。 InputStream提供的最重要的方法是:Java代码 1. read();  2. read(byte b) 

6、  3. read(byte b, int off, int len)    用于从输入流中读取字节。 原始流(也是一个适配器类):(1)ByteArrayInputStream:为多线程的通信提供缓冲区操作,接收一个Byte数据作为流的源。(2)FileInputStream:建立一个与文件有关的输入流。接收一个File对象作为流的源。(3)PipedInputStream:可以与PipedOutputStream配合使用,用于读入一个数据管道的数据,接收一个PipedOu

7、tputStream 作为源。(4)StringBufferInputStream:将一个字符串缓冲区转换为一个输入流。接收一个String对象作为流的源。链接流:(1)FilterInputStream称为过滤输入流,它将另外一个输入流作为流源。这个类的子类包括一下几种。   BufferedInputStream: 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mar

8、k 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。   DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。   LineNumberInputStream(已过时):提供带有行计数功能的过滤输入流。   PushbackInputStream:提供特殊的功能,可以将已经读取的字节“推回”到输入流中。(2)ObjectInputSt

9、ream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化(3)SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。  从结构图中可以看出直接引用InputStream(相当于装饰器模式中的Component) 的类就是链接流了。而FilterInputStream 相当于装饰器模式中的Decorator。以下的也是一样,所以就不一一分析了,其类的功能可查看API 文档。 

10、;OutputStream(和InputStream相对应)OutputStream结构图:    OutputStream提供的最重要的方法是:Java代码 1. write(int b);  2. write(byte b);  3. write(byte b, int off, int len)    用于将字节写入输出流。   字符流处理概述: 所有

11、的字符流操作类都继承自Reader或者Writer这两个抽象类。 Reader Reader结构图: Reader提供的重要方法有:Java代码 1. read(char cbuf);  2. read(char cbuf, int off, int len);  3. read(CharBuffer target);  他们提供了从流中读取数据到字符数组或者CharBuffer的功能。 Writer Wr

12、iter结构图:  Writer提供的重要方法有:Java代码 1. write(char cbuf);  2. write(char cbuf, int off, int len);  3. write(int c);  4. write(String str);  5. write(String str, int off, int len); 

13、  他们提供了把字符、字符数组或者字符串写入流中的功能。    字节流和字符流之间的转换(从字节流适配到字符流)InputStreamReader和OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream。 InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集 。OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 ch

14、arset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。 RandomAccessFileRandomAccessFile:此类的实例支持对随机访问文件的读取和写入。随机访问文件的行为类似存储在文件系统中的一个大型 byte 数组。存在指向该隐含数组的光标或索引,称为文件指针;输入操作从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。如果随机访问文件以读取/写入模式创建,则输出操作也可用;输出操作从文件指针开始写入字节,并随着对字节的写入而前移此文件指针。写入隐含数组的当前末尾之后的输出操作导致该数组扩展。该文件指针可以

15、通过 getFilePointer 方法读取,并通过 seek 方法设置。 I/O应用的例子 Java代码 1. package JavaIO;  2.   3. import java.io.*;  4.   5. public class JavaIO  6.     public static void main(String args)&#

16、160;throws Exception   7.         / 1b. 接收键盘的输入  8.         /* 9.          * 由于想以缓存字节读取方式从标准IO(键盘)中读取数据,所以要 10.  &#

17、160;       * 先把标准IO(System.in)转换成字符导向的stream,再进行BufferedReader封装。 11.          */  12.         BufferedReader stdin = new BufferedReader(new

18、 InputStreamReader(  13.                 System.in);  14.         System.out.println("Enter a line:");  15.    

19、;     System.out.println(stdin.readLine();  16.   17.         / 2. 从一个String对象中读取数据  18.         /* 19.        

20、0; * 要以字符的形式从一个String对象中读取数据,所以要产生一个StringReader类型的stream。 20.          */  21.         StringReader in2 = new StringReader("zhxing");  22.  

21、0;      int c;  23.         while (c = in2.read() != -1)  24.             System.out.println(char) c);  2

22、5.         in2.close();  26.   27.         / 3. 从内存取出格式化输入  28.         / 把内存中的一个缓冲区作为DataInputStream使用  29.   

23、0;     try   30.             DataInputStream in3 = new DataInputStream(new ByteArrayInputStream(  31.           

24、60;         "zhxing".getBytes();  32.             while (true)  33.                &#

25、160;System.out.println(char) in3.readByte();  34.          catch (EOFException e)   35.             System.out.println("End of stream")

26、;  36.           37.   38.         / 4. 输出到文件  39.         /* 40.          *

27、0;对String对象s2读取数据时,先把对象中的数据存入缓存中,再从缓冲中进行读取;对TestIO.out文件进行操作时, 41.          * 先把格式化后的信息输出 到缓存中,再把缓存中的信息输出到文件中。 42.          */  43.         

28、try   44.             BufferedReader in4 = new BufferedReader(new StringReader("zhxing");  45.             PrintWriter&#

29、160;out1 = new PrintWriter(new BufferedWriter(  46.                     new FileWriter("F:java TestIO.out");  47.     &#

30、160;       int lineCount = 1;  48.             String s = null;  49.             while (s&

31、#160;= in4.readLine() != null)  50.                 out1.println(lineCount+ + ":" + s);  51.           &#

32、160; out1.close();  52.             in4.close();  53.          catch (EOFException ex)   54.         

33、0;   System.out.println("End of stream");  55.           56.   57.         / 5. 数据的存储和恢复  58.        

34、; /* 59.          * 对Data.txt文件进行输出时,是先把基本类型的数据输出屋缓存中,再把缓存中的数据输出到文件中;对文件进行读取操作时,先把文件中的数据读取到缓存中,再从缓存中以基本类型的形式进行读取。注意in5.readDouble()这一行。因为写入第一个writeDouble(),所以为了正确显示。也要以基本类型的形式进行读取。 60.         &#

35、160;*/  61.         try   62.             DataOutputStream out2 = new DataOutputStream(  63.         

36、0;           new BufferedOutputStream(new FileOutputStream(  64.                           

37、0; "F:java Data.txt");  65.             out2.writeDouble(3.1415926);  66.             out2.writeChars("nThas was pi:writeChar

38、sn");  67.             out2.writeBytes("Thas was pi:writeByten");  68.             out2.close();  69.     

39、;        DataInputStream in5 = new DataInputStream(new BufferedInputStream(  70.                     new FileInputStream

40、("F:java Data.txt");  71.             BufferedReader in5br = new BufferedReader(  72.                 

41、60;   new InputStreamReader(in5);  73.             System.out.println(in5.readDouble();  74.             System.out.println(in5br.readLine()

42、;  75.             System.out.println(in5br.readLine();  76.          catch (EOFException e)   77.         

43、60;   System.out.println("End of stream");  78.           79.   80.         / 6. 通过RandomAccessFile操作文件  81.     &#

44、160;   / 通过RandomAccessFile类对文件进行操作。  82.         RandomAccessFile rf = new RandomAccessFile("F:java rtest.dat", "rw");  83.        

45、60;for (int i = 0; i < 10; i+)  84.             rf.writeDouble(i * 1.414);  85.         rf.close();  86.         rf = new RandomAccessFile("F:java r

温馨提示

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

评论

0/150

提交评论