- 浏览: 14415 次
最新评论
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(): 关闭流并释放与之关联的所有系统资源。
发表评论
-
linux 进程通信――C语言实现
2012-01-20 08:36 842linux 进程通信――C语言实现 2010年10月15日 ... -
Dot NET:嵌入式开发平台(图)
2012-01-20 08:36 595Dot NET:嵌入式开发平台(图) 2010年08月11日 ... -
Mnesia 一个用于电信应用系统的健壮的分布式DBMS
2012-01-20 08:36 612Mnesia 一个用于电信应用系统的健壮的分布式DBMS ... -
uboot的配置问题对\include\configs\[boardname].h的修改
2012-01-20 08:35 1774uboot的配置问题对\include\configs\[bo ... -
ApplicationDomain
2012-01-19 13:42 641ApplicationDomain 2010年08月01日 ... -
flex3控件_ModuleLoader
2012-01-19 13:42 546flex3控件_ModuleLoader 2011年07月0 ... -
Flex-LoaderContext applicationDomain 属性详解
2012-01-19 13:42 938Flex-LoaderContext applicationD ... -
ApplicationDomain.currentDomain的细节
2012-01-19 13:42 647ApplicationDomain.currentDomain ... -
修复工具类
2012-01-19 13:41 659修复工具类 2011年05月08日 ... -
LINUX 常用基本指令
2012-01-17 03:31 617LINUX 常用基本指令 2011年08月05日 lin ... -
计算机基础应用》理论题1
2012-01-17 03:31 865计算机基础应用》理论 ... -
学习光盘刻录必备基础知识
2012-01-17 03:31 779学习光盘刻录必备基础 ... -
Ghost命令全解析 百度搜集
2012-01-17 03:31 637Ghost命令全解析 百度搜集 2010年06月21日 ... -
衣食住行皆史
2012-01-16 02:06 654衣食住行皆史 2010年04 ... -
人的衣食住行
2012-01-16 02:06 751人的衣食住行 2009年11月28日 衣食住行 【词目 ... -
走近古人的生活 衣食住行
2012-01-16 02:06 959走近古人的生活 衣食住行 2009年12月19日 教材分 ... -
中国古代衣食住行 9
2012-01-16 02:06 664中国古代衣食住行 9 2009年09月27日 陈设和起居 ... -
中国古代衣食住行 6
2012-01-16 02:06 514中国古代衣食住行 6 2009年09月27日 ...
相关推荐
JavaNIO浅析IO模型Java开发Java经验技巧共10页.pdf.zip
本篇文章给大家分享了关于java io的一些相关知识点以及相关内容,对此有需要的朋友可以学习参考下。
1.4 Java IO流相关知识 1.5 JVM ClassLoader机制 1.6 Java中的synchronized使用 1.7 Java中的反射机制 1.8 Java中Heap与Stack的区别 1.9 Java中String和StringBuffer的区别 1.10 Java中Comparable和Comparator...
(3)IO多路复用(IO Multiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。 (4)异步IO(Asynchronous IO):即经典的Proactor设计模式,也称为异步非...
主要介绍了Java.IO输入输出流 过滤流 buffer流和data流的相关资料,本文给大家介绍的非常详细,具有参考借鉴价值,需要的朋友可以参考下
在进入Java NIO编程之前,我们今天先来讨论一些比较基础的知识:I/O模型。对java io nio相关知识感兴趣的朋友一起学习吧
(3)IO多路复用(IOMultiplexing):即经典的Reactor设计模式,有时也称为异步阻塞IO,Java中的Selector和Linux中的epoll都是这种模型。(4)异步IO(AsynchronousIO):即经典的Proactor设计模式,也称为异步非...
下面本文先从同步和异步的概念 说起,然后接着阐述了阻塞和非阻塞的区别,接着介绍了阻塞IO和非阻塞IO的区别,然后介绍了同步IO和异步IO的区别,接下来介绍了5种IO模型,后介绍了两种和高性能IO设计相关的设计模式...
流的原理浅析: java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java Io流的40多个类都是从如下4个抽象类基类中派生出来的。 InputStream/Reader: 所有的输入流...
而JspWriter继承了java.io.Writer . write方法是在在父类Writer中定义的, print方法是在子类JspWriter中定义的. 重载的print方法可以将各种类型的数据转换成字符串的形式输出. 重载的write方法只能输出字符/字符...
许多学习Kotlin的开发者之前都是学习过Java的,并且本身Kotlin就是一款基于JVM语言,因此不可避免地需要经常和Java进行比较。 Kotlin的诸多特性,在熟悉Java的开发者看来,有些人很喜欢,有些人不喜欢。但即使是不...
[1,2,3].length 可以得到 3, “123”.length 也可以得到 3,这个略懂js的都知道。 但是 eval.length,RegExp.length,””.toString.length,1..toString.length 会得到什么呢? 分别得到 1,2,0,1,这些数字...
java收银系统 源码 description 本文是【浅析微信支付】系列文章的第一篇,主要会介绍一下为何写下这个系列以及对于微信支付的一点小经验,与君共勉。 前篇大纲 以下会分几个步骤讲一下我学习微信支付的过程,也是一...
target=_blank>浅析Java语言中两种异常使用的差别</A> <LI><A title=邂逅StringIndexOutOfBoundsException href="http://www.jspcn.net/htmlnews/11171163972961452.html" target=_blank>邂逅...