javaIO浅析


javaIO浅析
2010年06月13日
  什么是流:
  流是一个抽象的概念。当Java程序需要从数据源读取数据时,会开启一个到数据源的流。数据源可以是文件,内存或者网络等。同样,当程序需要输出数 据到目的地时也一样会开启一个流,数据目的地也可以是文件、内存或者网络等。流的创建是为了更方便地处理数据的输入输出。
  流分为字节流和字符流。字节流也称为原始数据,需要用户读入后进行相应的编码转换。而字节流的实现是基于自动转换的,读取数据时会把数据按照JVM 的默认编码自动转换成字符。
  字节流由InputStream和OutputStream处理,而字符流由Reader和Writer处理。Reader和Writer是 Java后加入的处理类,出于让数据的处理更方便的目的。
  字节流处理概述:
  对于字节流处理的类都继承自InputStream和OutputStream这两个抽象类。
  InputStream提供的最重要的方法是: Java代码 type="application/x-shockwave-flash" width="14" height="15" src="http://www.javaeye.com/javascripts/syntaxhigh lighter/clipboard_new.swf" src="http://www.javaeye.com/javascripts/syntaxhigh lighter/clipboard_new.swf" flashvars="clipboard=read()%3B%0Aread(byte%5B%5D%2 0b)%20%3B%0Aread(byte%5B%5D%20b%2C%20int%20off%2C%2 0int%20len)%20%3B" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflash player" width="14" height="15">
  用于从输入流中读取字节。
  OutputStream提供的最重要的方法是: Java代码 type="application/x-shockwave-flash" width="14" height="15" src="http://www.javaeye.com/javascripts/syntaxhigh lighter/clipboard_new.swf" src="http://www.javaeye.com/javascripts/syntaxhigh lighter/clipboard_new.swf" flashvars="clipboard=write(int%20b)%3B%0Awrite(byt e%5B%5D%20b)%3B%0Awrite(byte%5B%5D%20b%2C%20int%20o ff%2C%20int%20len)%20" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflash player" width="14" height="15">
  用于将字节写入输出流。
  字节流处理类概述:
  字节流的处理类有很多,他们都继承自InputStream或者OutputStream抽象类。
  输入流:
  先谈谈输入流,输入流中跟数据源直接接触的类有:FileInputStream和ByteArrayInputStream,他们分别实现了从文 件或者内存中的字节数组读入数据到输入流。
  其他的输入流处理类都是装饰类(Decorator模式),下面对他们进行一下简单介绍:
  BufferedInputStream: 提供了缓冲功能。
  DataInputStream: 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。 
  PipedInputStream: 允许以管道的方式来处理流。当连接到一个PipedOutputStream后,它会读取后者输出到管道的数据。
  PushbackInputStream: 允许放回已经读取的数据。
  SequenceInputStream: 能对多个inputstream进行顺序处理。
  输出流:
  基本上每个输入流类都有一个相应的输出流类,提供相应的输出流处理。 同样,跟数据目的地直接接触的类有:FileOutputStream和ByteArrayOutputStream,前者实现了把数据流写入文件 的功能,后者实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray() 和 toString() 获取数据。  下面对其它的装饰类做一下简单介绍:
  BufferedOutputStream: 提供了缓冲功能的输出流,在写出完成之前要调用flush来保证数据的输出。
  DataOutputStream: 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。  PipedOutputStream: 允许以管道的方式来处理流。可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。 PrintStream: 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。我们经常用到的System.out或者System.err都是 PrintStream。
  字符流处理概述:
  所有的字符流操作类都继承自Reader或者Writer这两个抽象类。
  Reader提供的重要方法有: Java代码 type="application/x-shockwave-flash" width="14" height="15" src="http://www.javaeye.com/javascripts/syntaxhigh lighter/clipboard_new.swf" src="http://www.javaeye.com/javascripts/syntaxhigh lighter/clipboard_new.swf" flashvars="clipboard=read(char%5B%5D%20cbuf)%3B%0A read(char%5B%5D%20cbuf%2C%20int%20off%2C%20int%20le n)%3B%0Aread(CharBuffer%20target)%3B" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflash player" width="14" height="15">
  他们提供了从流中读取数据到字符数组或者CharBuffer的功能。
  Writer提供的重要方法有: Java代码 type="application/x-shockwave-flash" width="14" height="15" src="http://www.javaeye.com/javascripts/syntaxhigh lighter/clipboard_new.swf" src="http://www.javaeye.com/javascripts/syntaxhigh lighter/clipboard_new.swf" flashvars="clipboard=write(char%5B%5D%20cbuf)%3B%0 Awrite(char%5B%5D%20cbuf%2C%20int%20off%2C%20int%20 len)%3B%0Awrite(int%20c)%3B%0Awrite(String%20str)%3 B%0Awrite(String%20str%2C%20int%20off%2C%20int%20le n)%3B" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflash player" width="14" height="15">
  他们提供了把字符、字符数组或者字符串写入流中的功能。
  字符流处理类概述:
  输入流:
  跟数据源直接接触的类:
  CharArrayReader: 从内存中的字符数组中读入数据,以对数据进行流式读取。
  StringReader:从内存中的字符串读入数据,以对数据进行流式读取。
  FileReader:从文件中读入数据。注意这里读入数据时会根据JVM的默认编码对数据进行内转换,而不能指定使用的编码。所以当文件使用的编 码不是JVM默认编码时,不要使用这种方式。要正确地转码,使用InputStreamReader。
  装饰类:
  BufferedReader:提供缓冲功能,可以读取行:readLine();
  LineNumberReader: 提供读取行的控制:getLineNumber()等方法。 InputStreamReader: 字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。 输出流:
  根数据目的相关的类:
  CharArrayWriter:把内存中的字符数组写入输出流,输出流的缓冲区会自动增加大小。输出流的数据可以通过一些方法重新获取。
  StringWriter: 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。 
  FileWriter:把数据写入文件。
  装饰类:
  BufferedWriter:提供缓冲功能。 OutputStreamWriter:字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。 PrintWriter: 向文本输出流打印对象的格式化表示形式。
  流处理中的其它方法:
  mark和reset用于重复读取某段的数据,如下代码: Java代码 type="application/x-shockwave-flash" width="14" height="15" src="http://www.javaeye.com/javascripts/syntaxhigh lighter/clipboard_new.swf" src="http://www.javaeye.com/javascripts/syntaxhigh lighter/clipboard_new.swf" flashvars="clipboard=is%20%3D%20new%20BufferedInpu tStream(new%20FileInputStream(%22res%2Finput.data%2 2))%3B%0AassertTrue(is.available()%20%3E%200)%3B%0A assertTrue(is.markSupported())%3B%0A%0A%2F%2F%20The %20read%20limit%20has%20no%20effect.%0Ais.mark(0)%3 B%0A%0Aint%20first%20%3D%20is.read()%3B%0Aint%20sec ond%20%3D%20is.read()%3B%0A%0Ais.reset()%3B%0Aint%2 0firstAgain%20%3D%20is.read()%3B%0Aint%20secondAgai n%20%3D%20is.read()%3B%0A%0AassertEquals(first%2C%2 0firstAgain)%3B%0AassertEquals(second%2C%20secondAg ain)%3B" quality="high" allowscriptaccess="always" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflash player" width="14" height="15">
  Writer或者OutputStream中的flush(): 刷新该流的缓冲,用于确保数据的输出。
  close(): 关闭流并释放与之关联的所有系统资源。

猜你喜欢

转载自npjev02v.iteye.com/blog/1362420