Java中的IO流系统详解

来源:互联网 发布:安徽铜陵网络台 编辑:程序博客网 时间:2024/06/07 01:01
<div id="main">
                <div class="main">
                        <div class="ad_class">
<div class="notice tracking-ad" data-mod="popu_3"> 




<a href="http://blog.csdn.net/blogdevteam/article/details/58598037" target="_blank">
<font color="red"> CSDN日报20170228——《技术晋升的评定与博弈》
</font></a>


&nbsp;&nbsp;&nbsp;&nbsp;


<a href="http://blog.csdn.net/turingbooks/article/details/58072986" target="_blank">
<font color="blue">程序员2月书讯
</font></a>


&nbsp;&nbsp;&nbsp;


<a href="http://bbs.csdn.net/topics/392092888&#10;" target="_blank">
<font color="red">社区有奖问答--一起舞动酷炫的iOS动画
</font></a>




</div>                        </div>
                        






  
<link href="http://static.blog.csdn.net/css/comment1.css" type="text/css" rel="stylesheet">
<link href="http://static.blog.csdn.net/css/style1.css" type="text/css" rel="stylesheet">
<script language="JavaScript" type="text/javascript" src="http://download.csdn.net/js/jquery.cookie.js"></script>
<script type="text/javascript" src="http://c.csdnimg.cn/rabbit/search-service/main.js"></script>
<link rel="stylesheet" href="http://static.blog.csdn.net/public/res-min/markdown_views.css?v=1.0">
<link rel="stylesheet" href="http://static.blog.csdn.net/css/category.css?v=1.0">
<script type="text/javascript" src="http://static.blog.csdn.net/public/res/bower-libs/MathJax/MathJax.js?config=TeX-AMS_HTML"></script>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/web-storage-cache.min.js"></script>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/replace.min.js"></script>








  <script type="text/ecmascript">
      window.quickReplyflag = true;
           
            var isBole = false;
            
      
      var fasrc="http://my.csdn.net/my/favorite/miniadd?t=Java%e4%b8%ad%e7%9a%84IO%e6%b5%81%e7%b3%bb%e7%bb%9f%e8%af%a6%e8%a7%a3&u=http://blog.csdn.net/jiangwei0910410003/article/details/22376895"


    </script>
<div id="article_details" class="details">
    <div class="article_title">   
         <span class="ico ico_type_Original"></span>




    <h1>
        <span class="link_title"><a href="/jiangwei0910410003/article/details/22376895">
        Java中的IO流系统详解            
        </a></span>
    </h1>
</div>


   


        <div class="article_manage clearfix">
        <div class="article_r">
            <span class="link_postdate">2014-03-28 15:05</span>
            <span class="link_view" title="阅读次数">20752人阅读</span>
            <span class="link_comments" title="评论次数"> <a href="#comments" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_pinglun'])">评论</a>(5)</span>
            <span class="link_collect tracking-ad" data-mod="popu_171"> <a href="javascript:void(0);" onclick="javascript:collectArticle('Java%e4%b8%ad%e7%9a%84IO%e6%b5%81%e7%b3%bb%e7%bb%9f%e8%af%a6%e8%a7%a3','22376895');return false;" title="收藏" target="_blank">收藏</a></span>
             <span class="link_report"> <a href="#report" onclick="javascript:report(22376895,2);return false;" title="举报">举报</a></span>


        </div>
    </div>
    <div class="embody" style="display:none" id="embody">
        <span class="embody_t">本文章已收录于:</span>
        <div class="embody_c" id="lib" value="{&quot;err&quot;:0,&quot;msg&quot;:&quot;ok&quot;,&quot;data&quot;:[]}"></div>
    </div>
    <style type="text/css">        
            .embody{
                padding:10px 10px 10px;
                margin:0 -20px;
                border-bottom:solid 1px #ededed;                
            }
            .embody_b{
                margin:0 ;
                padding:10px 0;
            }
            .embody .embody_t,.embody .embody_c{
                display: inline-block;
                margin-right:10px;
            }
            .embody_t{
                font-size: 12px;
                color:#999;
            }
            .embody_c{
                font-size: 12px;
            }
            .embody_c img,.embody_c em{
                display: inline-block;
                vertical-align: middle;               
            }
             .embody_c img{               
                width:30px;
                height:30px;
            }
            .embody_c em{
                margin: 0 20px 0 10px;
                color:#333;
                font-style: normal;
            }
    </style>
    <script type="text/javascript">
        $(function () {
            try
            {
                var lib = eval("("+$("#lib").attr("value")+")");
                var html = "";
                if (lib.err == 0) {
                    $.each(lib.data, function (i) {
                        var obj = lib.data[i];
                        //html += '<img src="' + obj.logo + '"/>' + obj.name + "&nbsp;&nbsp;";
                        html += ' <a href="' + obj.url + '" target="_blank">';
                        html += ' <img src="' + obj.logo + '">';
                        html += ' <em><b>' + obj.name + '</b></em>';
                        html += ' </a>';
                    });
                    if (html != "") {
                        setTimeout(function () {
                            $("#lib").html(html);                      
                            $("#embody").show();
                        }, 100);
                    }
                }      
            } catch (err)
            { }
            
        });
    </script>
      <div class="category clearfix">
        <div class="category_l">
           <img src="http://static.blog.csdn.net/images/category_icon.jpg">
            <span>分类:</span>
        </div>
        <div class="category_r">
                    <label onclick="GetCategoryArticles('1819961','jiangwei0910410003','top','22376895');">
                        <span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_fenlei']);">Java<em>(34)</em></span>
                      <img class="arrow-down" src="http://static.blog.csdn.net/images/arrow_triangle _down.jpg" style="display:inline;">
                      <img class="arrow-up" src="http://static.blog.csdn.net/images/arrow_triangle_up.jpg" style="display:none;">
                        <div class="subItem">
                            <div class="subItem_t"><a href="http://blog.csdn.net/jiangwei0910410003/article/category/1819961" target="_blank">作者同类文章</a><i class="J_close">X</i></div>
                            <ul class="subItem_l" id="top_1819961">                            
                            </ul>
                        </div>
                    </label>                    
        </div>
    </div>
    <script type="text/javascript" src="http://static.blog.csdn.net/scripts/category.js"></script>  
        <div class="bog_copyright">         
            <p class="copyright_p">版权声明:本文为博主原创文章,未经博主允许不得转载。</p>
        </div>


  


  
  
     


<div style="clear:both"></div><div style="border:solid 1px #ccc; background:#eee; float:left; min-width:200px;padding:4px 10px;"><p style="text-align:right;margin:0;"><span style="float:left;">目录<a href="#" title="系统根据文章中H1到H6标签自动生成文章目录">(?)</a></span><a href="#" onclick="javascript:return openct(this);" title="展开">[+]</a></p><ol style="display:none;margin-left:14px;padding-left:14px;line-height:160%;"><li><a href="#t0">摘要</a></li><li><a href="#t1">
一以字节为导向的 Stream------InputStreamOutputStream</a></li><ol><li><a href="#t2">InputStream</a></li><ol><li><a href="#t3">基类InputStream</a></li><li><a href="#t4">1&nbsp;ByteArrayInputStream
-- 把内存中的一个缓冲区作为 InputStream 使用 </a></li><li><a href="#t5">2&nbsp;StringBufferInputStream
 -- 把一个 String 对象作为 InputStream </a></li><li><a href="#t6">3&nbsp;FileInputStream
 -- 把一个文件作为 InputStream 实现对文件的读取操作</a></li><li><a href="#t7">4&nbsp;PipedInputStream
实现了 pipe 的概念主要在线程中使用  管道输入流是指一个通讯管道的接收端</a></li><li><a href="#t8">5&nbsp;SequenceInputStream
把多个 InputStream 合并为一个 InputStream  序列输入流类允许应用程序把几个输入流连续地合并起来</a></li><li><a href="#t9">6&nbsp;ObjectInputStream用于操作Object的stream这个在stream主要用在对象传输的过程中其中牵涉到了序列化的知识</a></li><li><a href="#t10">7&nbsp;FilterInputStream是一个过滤的InputStream</a></li><ol><li><a href="#t11">71&nbsp;BufferedInputStream使用缓冲区的stream</a></li><li><a href="#t12">72&nbsp;DataInputStream数字格式化的stream</a></li></ol><li><a href="#t13">OutputSteam</a></li><ol><li><a href="#t14">基类OutputStream</a></li><li><a href="#t15">1&nbsp;ByteArrayOutputStream
 把信息存入内存中的一个缓冲区中  该类实现一个以字节数组形式写入数据的输出流</a></li><li><a href="#t16">2&nbsp;&nbsp;FileOutputStream
 文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流</a></li><li><a href="#t17">3&nbsp;PipedOutputStream
 管道输出流是指一个通讯管道的发送端 一个线程通过管道输出流发送数据</a></li><li><a href="#t18">4&nbsp;ObjectOutputStream输出Object对象的stream</a></li><li><a href="#t19">5 &nbsp;FilterOutputStream过滤的OutputStream</a></li><ol><li><a href="#t20">51&nbsp;BufferedOutputStream带有缓冲区的stream</a></li></ol><li><a href="#t21">52&nbsp;DataOutputStream具有格式化的OutputStream</a></li><li><a href="#t22">53&nbsp;PrintStream直接输出到控制台中我们最熟悉的就是Systemout他就是一个PrintStream</a></li></ol></ol></ol><li><a href="#t23"> 二 以字符为导向的 Stream &nbsp;ReaderWriter</a></li><ol><li><a href="#t24">Reader</a></li><ol><li><a href="#t25">Reader基类基于字符流的stream</a></li><li><a href="#t26">1&nbsp;CharArrayReader
与 ByteArrayInputStream 对应此类实现一个可用作字符输入流的字符缓冲区</a></li><li><a href="#t27">2&nbsp;StringReader


与 StringBufferInputStream 对应其源为一个字符串的字符流</a></li><li><a href="#t28">3&nbsp;FileReader
 与 FileInputStream 对应</a></li><li><a href="#t29">4&nbsp;PipedReader
与 PipedInputStream 对应</a></li></ol><li><a href="#t30">Writer</a></li><ol><li><a href="#t31">1&nbsp; &nbsp;
CharArrayWriter 与 ByteArrayOutputStream 对应</a></li><li><a href="#t32">2&nbsp;&nbsp;
StringWriter无与之对应的以字节为导向的 stream</a></li><li><a href="#t33">3&nbsp;
FileWriter 与 FileOutputStream 对应</a></li><li><a href="#t34">4&nbsp;
PipedWriter与 PipedOutputStream 对应</a></li><li><a href="#t35">5
OutputStreamWriter将OutputStream转化成Writer</a></li><li><a href="#t36">6
PrintReader和PrintStream对应</a></li></ol><li><a href="#t37">两种不同导向的 Stream 之间的转换&nbsp;&nbsp;</a></li><ol><li><a href="#t38">1&nbsp;InputStreamReader 和 OutputStreamReader </a></li></ol></ol><li><a href="#t39">三Java IO 的一般使用原则 &nbsp;&nbsp;</a></li><ol><li><a href="#t40">一按数据来源去向分类</a></li><li><a href="#t41">二按是否格式化输出分</a></li><li><a href="#t42">三按是否要缓冲分</a></li><li><a href="#t43">四按数据格式分</a></li><li><a href="#t44">五按输入输出分</a></li><li><a href="#t45">六特殊需要</a></li></ol></ol></div><div style="clear:both"></div><div id="article_content" class="article_content">


<h1 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t0"></a><span style="font-size:14px"><strong>摘要:</strong></span></h1>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><a href="http://lib.csdn.net/base/javase" class="replace_word" title="Java SE知识库" target="_blank" style="color:#df3434; font-weight:bold;">Java</a> 流在处理上分为字符流和字节流。字符流处理的单元为 2 个字节的 Unicode 字符,分别操作字符、字符数组或字符串,而字节流处理单元为 1 个字节,操作字节和字节数组。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">Java 内用 Unicode 编码存储字符,字符流处理类负责将外部的其他编码的字符流和 java 内 Unicode 字符流之间的转换。而类 InputStreamReader 和 OutputStreamWriter 处理字符流和字节流的转换。字符流(一次可以处理一个缓冲区)一次操作比字节流(一次一个字节)效率高。&nbsp;</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
&nbsp;</p>
<h1 style="color:rgb(51,51,51); font-family:tahoma; font-size:15px; line-height:25px"><a name="t1"></a>
<span style="color:rgb(255,102,0)"><span style="font-size:14px"><strong>(一)以字节为导向的 Stream------InputStream/OutputStream</strong></span></span></h1>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">InputStream 和 OutputStream 是两个 abstact 类,对于字节为导向的 stream 都扩展这两个基类;</span></p>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t2"></a><span style="color:rgb(0,0,255)"><span style="font-size:14px"><strong>1、 InputStream</strong></span></span></h2>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
&nbsp;</p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
<img src="http://img.blog.csdn.net/20140328140234031?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">&nbsp;</p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
<br>
</p>
<h3 style="font-family:tahoma; line-height:25px"><a name="t3"></a><span style="font-size:14px; color:#ff0000"><strong>基类InputStream:</strong></span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px">构造方法:</span></strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">InputStream() 创建一个输入的stream流</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>方法:</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">available():返回stream中的可读字节数,inputstream类中的这个方法始终返回的是0,这个方法需要子类去实现。</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">close():关闭stream方法,这个是每次在用完流之后必须调用的方法。</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">read():方法是读取一个byte字节,但是返回的是int。</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">read(byte[]):一次性读取内容到缓冲字节数组</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">read(byte[],int,int):从数据流中的哪个位置offset开始读长度为len的内容到缓冲字节数组</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">skip(long):从stream中跳过long类型参数个位置</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">以上的方法都是很简单理解的,这里就不写代码介绍了。</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">下面还有三个方法:</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">mark(int):用于标记stream的作用</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">markSupported():返回的是boolean类型,因为不是所有的stream都可以调用mark方法的,这个方法就是用来判断stream是否可以调用mark方法和reset方法</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">reset():这个方法和mark方法一起使用的,让stream回到mark的位置。</span></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">上面说的可能抽象了点,下面就用代码来解释一下吧:</span></span></p>
<p style="font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"></span></p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 712px; top: 1695px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_1" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_1" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=1&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/262008" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/262008/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.io.demo;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.BufferedInputStream;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.BufferedOutputStream;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.File;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.FileInputStream;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.FileOutputStream;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.IOException;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.InputStream;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.OutputStream;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;InputStreamTest&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;IOException&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;writeToFile();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;readFromFile();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;readFromFile()&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;inputStream&nbsp;=&nbsp;<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputStream&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;BufferedInputStream(</span><span class="keyword">new</span><span>&nbsp;FileInputStream(</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"test.txt"</span><span>)));&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;判断该输入流是否支持mark操作</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(!inputStream.markSupported())&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"mark/reset&nbsp;not&nbsp;supported!"</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;ch;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;count&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">boolean</span><span>&nbsp;marked&nbsp;=&nbsp;</span><span class="keyword">false</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;((ch&nbsp;=&nbsp;inputStream.read())&nbsp;!=&nbsp;-</span><span class="number">1</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(<span class="string">"."</span><span>&nbsp;+&nbsp;ch);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;((ch&nbsp;==&nbsp;</span><span class="number">4</span><span>)&nbsp;&amp;&amp;&nbsp;!marked)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;在4的地方标记位置</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputStream.mark(<span class="number">10</span><span>);&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;marked&nbsp;=&nbsp;<span class="keyword">true</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;(ch&nbsp;==&nbsp;</span><span class="number">8</span><span>&nbsp;&amp;&amp;&nbsp;count&nbsp;&lt;&nbsp;</span><span class="number">2</span><span>)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;重设位置到4</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputStream.reset();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;count++;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">finally</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputStream.close();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(Exception&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;writeToFile()&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;output&nbsp;=&nbsp;<span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;BufferedOutputStream(</span><span class="keyword">new</span><span>&nbsp;FileOutputStream(</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"test.txt"</span><span>)));&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">byte</span><span>[]&nbsp;b&nbsp;=&nbsp;</span><span class="keyword">new</span><span>&nbsp;</span><span class="keyword">byte</span><span>[</span><span class="number">20</span><span>];&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">for</span><span>&nbsp;(</span><span class="keyword">int</span><span>&nbsp;i&nbsp;=&nbsp;</span><span class="number">0</span><span>;&nbsp;i&nbsp;&lt;&nbsp;</span><span class="number">20</span><span>;&nbsp;i++)&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b[i]&nbsp;=&nbsp;(<span class="keyword">byte</span><span>)&nbsp;i;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;写入从0到19的20个字节到文件中</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.write(b);&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">finally</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;output.close();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="262008" snippet_file_name="blog_20140328_1_1838902" name="code" class="java" style="font-size: 13px; display: none;">package com.io.demo;


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;


public class InputStreamTest {
public static void main(String[] args) throws IOException {
writeToFile();
readFromFile();
}


private static void readFromFile() {
InputStream inputStream = null;
try {
inputStream = new BufferedInputStream(new FileInputStream(new File("test.txt")));
// 判断该输入流是否支持mark操作
if (!inputStream.markSupported()) {
System.out.println("mark/reset not supported!");
return;
}
int ch;
int count = 0;
boolean marked = false;
while ((ch = inputStream.read()) != -1) {
System.out.print("." + ch);
if ((ch == 4) &amp;&amp; !marked) {
// 在4的地方标记位置
inputStream.mark(10);
marked = true;
}
if (ch == 8 &amp;&amp; count &lt; 2) {
// 重设位置到4
inputStream.reset();
count++;
}
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
inputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}


private static void writeToFile() {
OutputStream output = null;
try {
output = new BufferedOutputStream(new FileOutputStream(new File("test.txt")));
byte[] b = new byte[20];
for (int i = 0; i &lt; 20; i++)
b[i] = (byte) i;
// 写入从0到19的20个字节到文件中
output.write(b);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
output.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
</pre><br>
<span style="font-size:14px">输出:.0.1.2.3.4.5.6.7.8.</span><span style="font-size:14px"><span style="font-family:tahoma; line-height:25px"><span style="color:#3333ff">5.6.7.8.5.6.7.8</span></span><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px">.9.10.11.12.13.14.15.16.17.18.19</span></span><p></p>
<p style="font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">从输出可以看到,我们在ch==4的时候调用了mark方法进行标记了,当ch==8的时候我们调用了reset方法,就让stream回到了我们标记的地方重新读取。</span></span></p>
<p style="font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">上面的例子是在整个读取stream的过程中操作的,下面来看一下当我们读取完一个stream的时候再去调用reset方法的效果:</span></span></p>
<p style="font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"></span></p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 712px; top: 3199px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_2" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_2" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=2&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/262008" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/262008/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedInputStream&nbsp;bis&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;BufferedInputStream(</span><span class="keyword">new</span><span>&nbsp;ByteArrayInputStream(</span><span class="string">"Hello&nbsp;World!"</span><span>.getBytes()));&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">int</span><span>&nbsp;bytes&nbsp;=&nbsp;-</span><span class="number">1</span><span>;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//这里进行标记</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bis.mark(<span class="number">12</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>((bytes=bis.read())!=-</span><span class="number">1</span><span>){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bytes+<span class="string">","</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//让标签有效,此时bis又回到了开始点</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bis.reset();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>((bytes=bis.read())!=-</span><span class="number">1</span><span>){&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bytes+<span class="string">"."</span><span>);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="262008" snippet_file_name="blog_20140328_2_7825739" name="code" class="java" style="font-size: 13px; display: none;">public static void main(String[] args) throws Exception{
BufferedInputStream bis = new BufferedInputStream(new ByteArrayInputStream("Hello World!".getBytes()));
int bytes = -1;
//这里进行标记
bis.mark(12);
while((bytes=bis.read())!=-1){
System.out.print(bytes+",");
}
System.out.println();
//让标签有效,此时bis又回到了开始点
bis.reset();
while((bytes=bis.read())!=-1){
System.out.print(bytes+".");
}
}</pre><br>
<span style="font-size:14px">输出:</span><p></p>
<p style="font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">72,101,108,108,111,32,87,111,114,108,100,33,<br>
72.101.108.108.111.32.87.111.114.108.100.33.</span></span></p>
<p style="font-family:tahoma; line-height:25px"><span style="font-size:14px; color:#333333">我们可以看到当我们在stream读取完调用reset方法的话,stream就会回到开始点。</span></p>
<p style="font-family:tahoma; line-height:25px"><span style="font-size:14px">通过上面的例子我们可能知道了mark和reset方法的作用和好处:</span></p>
<p style="font-family:tahoma; line-height:25px"><span style="font-size:14px">如果想对一个stream进行多次操作的话,只要读取一次就可以了,不需要多次读取,比如:上面当读取完stream之后,想再去从头操作stream,只需要调用reset方法即可,如果没有mark的话,我们就需要从新在去读取一次数据了。</span></p>
<p style="font-family:tahoma; line-height:25px"><span style="font-size:14px; color:#ff0000">下面再来看一下mark这个方法中的参数的意义:</span></p>
<p style="font-family:tahoma; line-height:25px"></p>
<p style="padding-top:0px; padding-bottom:0px; margin-top:0px; margin-bottom:0px; font-family:verdana,arial,helvetica,sans-serif; line-height:21px">
<span style="padding:0px; margin:0px; line-height:normal; widows:2; border-collapse:separate; font-family:Tahoma; orphans:2; border-spacing:0px"><span style="padding:0px; margin:0px; line-height:1.5em"><span style="padding:0px; margin:0px; font-family:verdana,arial,helvetica,sans-serif; line-height:1.5em"><span style="font-size:14px">根据JAVA官方文档的描述,mark(int
 readlimit)方法表示,标记当前位置,并保证在mark以后最多可以读取readlimit字节数</span></span></span></span><span style="font-size:14px; line-height:1.5em; orphans:2; widows:2">据,mark标记仍有效。如果在mark后读取超过readlimit字节数据,mark标记就会失效,调用reset()方法会有异常。</span><span style="font-size:14px; padding:0px; margin:0px; line-height:1.5em"><span style="padding:0px; margin:0px; line-height:1.5em">但实际的运行情况却和JAVA文档中的描述并不完全相符。</span></span><span style="font-size:14px; padding:0px; margin:0px; line-height:1.5em">&nbsp;</span><span style="font-size:14px; line-height:1.5em">有时候在BufferedInputStream类中调用mark(int
 readlimit)方法后,即使读取超过readlimit字节的数据,mark标记仍有效,仍然能正确调用reset方法重置。</span></p>
<div style="padding:0px; margin:0px auto; border-width:0px; overflow:hidden; font-family:verdana,arial,helvetica,sans-serif; line-height:21px">
<p style="padding-top:0px; padding-bottom:0px; margin-top:0px; margin-bottom:0px; line-height:1.5em">
<span style="font-size:14px">事实上,mark在JAVA中的实现是和缓冲区相关的。只要缓冲区够大,mark后读取的数据没有超出缓冲区的大小,mark标记就不会失效。如果不够大,mark后又读取了大量的数据,导致缓冲区更新,原来标记的位置自然找不到了。</span></p>
<div style="padding:0px; margin:0px auto; border-width:0px; overflow:hidden"><span style="font-size:14px"><span style="padding:0px; margin:0px">因此,mark后读取多少字节才失效,并不完全由readlimit参数确定,也和BufferedInputStream类的缓冲区大小有关。</span>&nbsp;<span style="padding:0px; margin:0px">&nbsp;</span>如果BufferedInputStream类的缓冲区大小大于readlimit,在mark以后只有读取超过缓冲区大小的数据,mark标记才会失效。</span></div>
</div>
<div style="padding:0px; margin:0px auto; border-width:0px; overflow:hidden; font-family:verdana,arial,helvetica,sans-serif; line-height:21px">
<p style="padding-top:0px; padding-bottom:0px; margin-top:0px; margin-bottom:0px; line-height:1.5em">
<span style="padding:0px; margin:0px; line-height:1.5em"><span style="padding:0px; margin:0px; line-height:1.5em; color:rgb(128,0,0)"><span style="font-size:14px"><strong>简言之,BufferedInputStream类调用mark(int readlimit)方法后读取多少字节标记才失效,是取readlimit和BufferedInputStream类的缓冲区大小两者中的最大值,而并非完全由readlimit确定。这个在JAVA文档中是没有提到的。</strong></span></span></span></p>
<p style="padding-top:0px; padding-bottom:0px; margin-top:0px; margin-bottom:0px; line-height:1.5em">
<span style="padding:0px; margin:0px; line-height:1.5em"><span style="padding:0px; margin:0px; line-height:1.5em; color:rgb(128,0,0)"><span style="font-size:14px"><span style="padding:0px; margin:0px; line-height:normal; widows:2; border-collapse:separate; font-weight:normal; font-family:Tahoma; orphans:2; color:rgb(0,0,0); border-spacing:0px">看下面的例子Mark.java。</span></span></span></span></p>
<p style="font-size:14px; padding-top:0px; padding-bottom:0px; margin-top:0px; margin-bottom:0px; line-height:1.5em">
<span style="padding:0px; margin:0px; line-height:1.5em"><span style="padding:0px; margin:0px; font-size:12px; line-height:1.5em; color:rgb(128,0,0)"><span style="padding:0px; margin:0px; font-size:14px; line-height:normal; widows:2; border-collapse:separate; font-weight:normal; font-family:Tahoma; orphans:2; color:rgb(0,0,0); border-spacing:0px"><br>
</span></span></span></p>
</div>
<div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 712px; top: 4014px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_3" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_3" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=3&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/262008" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/262008/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.io.demo;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.BufferedInputStream;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.ByteArrayInputStream;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.IOException;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span><span class="comment">/**&nbsp;&nbsp;</span>&nbsp;</span></li><li class=""><span><span class="comment">&nbsp;*&nbsp;@author&nbsp;WuDian&nbsp;&nbsp;</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;*&nbsp;&nbsp;&nbsp;</span>&nbsp;</span></li><li class=""><span><span class="comment">&nbsp;*/</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;Mark&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;初始化一个字节数组,内有5个字节的数据&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">byte</span><span>[]&nbsp;bytes={</span><span class="number">1</span><span>,</span><span class="number">2</span><span>,</span><span class="number">3</span><span>,</span><span class="number">4</span><span>,</span><span class="number">5</span><span>};&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;用一个ByteArrayInputStream来读取这个字节数组&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ByteArrayInputStream&nbsp;in=<span class="keyword">new</span><span>&nbsp;ByteArrayInputStream(bytes);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;将ByteArrayInputStream包含在一个BufferedInputStream,并初始化缓冲区大小为2。&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedInputStream&nbsp;bis=<span class="keyword">new</span><span>&nbsp;BufferedInputStream(in,</span><span class="number">2</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;读取字节1&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bis.read()+<span class="string">","</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;在字节2处做标记,同时设置readlimit参数为1&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;根据JAVA文档mark以后最多只能读取1个字节,否则mark标记失效,但实际运行结果不是这样&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"mark"</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bis.mark(<span class="number">1</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/*&nbsp;&nbsp;</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;连续读取两个字节,超过了readlimit的大小,mark标记仍有效&nbsp;&nbsp;</span>&nbsp;</span></li><li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;连续读取两个字节&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bis.read()+<span class="string">","</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bis.read()+<span class="string">","</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;调用reset方法,未发生异常,说明mark标记仍有效。&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;因为,虽然readlimit参数为1,但是这个BufferedInputStream类的缓冲区大小为2,&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;所以允许读取2字节&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"reset"</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bis.reset();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">/*&nbsp;&nbsp;</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;连续读取3个字节,超过了缓冲区大小,mark标记失效。&nbsp;&nbsp;</span>&nbsp;</span></li><li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;在这个例子中BufferedInputStream类的缓冲区大小大于readlimit,&nbsp;&nbsp;</span>&nbsp;</span></li><li class="alt"><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;mark标记由缓冲区大小决定&nbsp;&nbsp;</span>&nbsp;</span></li><li class=""><span><span class="comment">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*/</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;reset重置后连续读取3个字节,超过了BufferedInputStream类的缓冲区大小&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bis.read()+<span class="string">","</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bis.read()+<span class="string">","</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bis.read()+<span class="string">","</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;再次调用reset重置,抛出异常,说明mark后读取3个字节,mark标记失效&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"reset&nbsp;again"</span><span>);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bis.reset();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">//&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block&nbsp;&nbsp;&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="262008" snippet_file_name="blog_20140328_3_2525822" name="code" class="java" style="font-size: 10pt; display: none;">package com.io.demo;


import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.IOException;
   
/**  
 * @author WuDian  
 *   
 */   
public class Mark {    
    public static void main(String[] args) {    
   
        try {    
            // 初始化一个字节数组,内有5个字节的数据    
            byte[] bytes={1,2,3,4,5};    
            // 用一个ByteArrayInputStream来读取这个字节数组    
            ByteArrayInputStream in=new ByteArrayInputStream(bytes);    
            // 将ByteArrayInputStream包含在一个BufferedInputStream,并初始化缓冲区大小为2。    
            BufferedInputStream bis=new BufferedInputStream(in,2);     
            // 读取字节1    
            System.out.print(bis.read()+",");    
            // 在字节2处做标记,同时设置readlimit参数为1    
            // 根据JAVA文档mark以后最多只能读取1个字节,否则mark标记失效,但实际运行结果不是这样    
            System.out.println("mark");    
            bis.mark(1);    
                
            /*  
             * 连续读取两个字节,超过了readlimit的大小,mark标记仍有效  
             */   
            // 连续读取两个字节    
            System.out.print(bis.read()+",");     
            System.out.print(bis.read()+",");     
            // 调用reset方法,未发生异常,说明mark标记仍有效。    
            // 因为,虽然readlimit参数为1,但是这个BufferedInputStream类的缓冲区大小为2,    
            // 所以允许读取2字节    
            System.out.println("reset");    
            bis.reset();    
                
            /*  
             * 连续读取3个字节,超过了缓冲区大小,mark标记失效。  
             * 在这个例子中BufferedInputStream类的缓冲区大小大于readlimit,  
             * mark标记由缓冲区大小决定  
             */   
            // reset重置后连续读取3个字节,超过了BufferedInputStream类的缓冲区大小    
            System.out.print(bis.read()+",");    
            System.out.print(bis.read()+",");    
            System.out.print(bis.read()+",");    
            // 再次调用reset重置,抛出异常,说明mark后读取3个字节,mark标记失效    
            System.out.println("reset again");    
            bis.reset();    
        } catch (IOException e) {    
            // TODO Auto-generated catch block    
            e.printStackTrace();    
        }    
    }    
}    
</pre><br>
<span style="font-size:14px">运行结果:</span>
<p style="font-family:tahoma; line-height:25px"><span style="font-size:14px"><span style="color:#ff0000">1,mark<br>
2,3,reset<br>
2,3,4,reset again<br>
java.io.IOException: Resetting to invalid mark<br>
<span style="white-space:pre"></span>at java.io.BufferedInputStream.reset(Unknown Source)<br>
<span style="white-space:pre"></span>at com.io.demo.Mark.main(Mark.java:51)</span><br>
</span></p>
<p style="font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">这样我们就对上面的三个方法进行的解释了。其实等说完所以的stream之后我们会发现,mark和reset方法只有Buffered类的stream有效,所以stream中都会有一个markSupported方法来判断一个stream中的mark和reset方法是否可用。</span></span></p>
<p style="font-family:tahoma; line-height:25px"><span style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
上面就介绍了InputStream基类中的所有方法,下面是其的子类,对于子类可能会添加以下属于自己特定的方法,我们这里就只介绍这些特定的方法</span></span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t4"></a><span style="font-size:14px"><strong>1.1&nbsp;</strong></span><span style="color:#ff0000; font-size:14px"><strong>ByteArrayInputStream</strong>
</span><span style="color:#333333; font-size:14px">-- 把内存中的一个缓冲区作为 InputStream 使用 .</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>construct---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(A)ByteArrayInputStream(byte[]) 创建一个新字节数组输入流( ByteArrayInputStream ),它从指定字节数组中读取数据( 使用 byte 作为其缓冲区数组)</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(B)ByteArrayInputStream(byte[], int, int) 创建一个新字节数组输入流,它从指定字节数组中读取数据。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">方法都是实现了InputStream方法。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t5"></a><span style="font-size:14px"><strong>1.2&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">StringBufferInputStream</span></strong><span style="color:#333333; font-size:14px">
 -- 把一个 String 对象作为 InputStream .</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>construct---&nbsp;&nbsp;</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">StringBufferInputStream(String) 据指定串创建一个读取数据的输入流串。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了InputStream中的部分方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">注释:不推荐使用 StringBufferInputStream 方法。 此类不能将字符正确的转换为字节。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">同 JDK 1.1 版中的类似,从一个串创建一个流的最佳方法是采用 StringReader 类。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t6"></a><span style="font-size:14px"><strong>1.3&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">FileInputStream</span></strong><span style="color:#333333; font-size:14px">
 -- 把一个文件作为 InputStream ,实现对文件的读取操作</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>construct---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(A)FileInputStream(File name) 创建一个输入文件流,从指定的 File 对象读取数据。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(B)FileInputStream(FileDescriptor) 创建一个输入文件流,从指定的文件描述器读取数据。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(C)-FileInputStream(String&nbsp; name) 创建一个输入文件流,从指定名称的文件读取数据。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method ----&nbsp;</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了InputStream中的部分方法;</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">额外的两个方法:</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">getChannel():这个方法返回一个FileChannel对象,这个主要用于JNIO中的通道的。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">getFD():这个方法返回一个FileDescriptor对象,这个在构造函数中使用过。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t7"></a><span style="font-size:14px"><strong>1.4&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">PipedInputStream
</span></strong><span style="color:#333333; font-size:14px">:实现了 pipe 的概念,主要在线程中使用 . 管道输入流是指一个通讯管道的接收端。</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>construct---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">PipedInputStream() 创建一个管道输入流,它还未与一个管道输出流连接。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">PipedInputStream(PipedOutputStream) 创建一个管道输入流 , 它已连接到一个管道输出流。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了InputStream中的部分方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">额外的方法:</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">connection(PipedOutputStream):用来连接PipedOutputStream对象</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t8"></a><span style="font-size:14px"><strong>1.5&nbsp;</strong></span><span style="color:#ff0000; font-size:14px"><strong>SequenceInputStream</strong>
</span><span style="color:#333333; font-size:14px">:把多个 InputStream 合并为一个 InputStream . “序列输入流”类允许应用程序把几个输入流连续地合并起来,</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">并且使它们像单个输入流一样出现。每个输入流依次被读取,直到到达该流的末尾。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">然后“序列输入流”类关闭这个流并自动地切换到下一个输入流。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>construct---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">SequenceInputStream(Enumeration) 创建一个新的序列输入流,并用指定的输入流的枚举值初始化它。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">SequenceInputStream(InputStream, InputStream) 创建一个新的序列输入流,初始化为首先 读输入流 s1, 然后读输入流 s2 。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了InputStream中的部分方法。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"></p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 712px; top: 6530px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_4" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_4" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=4&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/262008" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/262008/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;TestSequence&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>  <span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)</span><span class="keyword">throws</span><span>&nbsp;Exception{&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>  <span class="comment">//不管怎么样,先创建两个文件。从里面读取数据,(我的文件里面有内容!)&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>  InputStream&nbsp;in1=<span class="keyword">new</span><span>&nbsp;FileInputStream(</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"d:\\jack.txt"</span><span>));&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>  InputStream&nbsp;in2=<span class="keyword">new</span><span>&nbsp;FileInputStream(</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"d:\\jack2.txt"</span><span>));&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>  <span class="comment">//读取,数据后要生成的文件&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>  OutputStream&nbsp;ou=<span class="keyword">new</span><span>&nbsp;FileOutputStream(</span><span class="keyword">new</span><span>&nbsp;File(</span><span class="string">"d:\\jack3.txt"</span><span>));&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>  <span class="comment">//创建SequenceInputStream类,&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>  SequenceInputStream&nbsp;si=<span class="keyword">new</span><span>&nbsp;SequenceInputStream(in1,in2);&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>  <span class="comment">//因为SequenceInputStream,是一个字节一个字节读,要判断一下是否读完了。&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>  <span class="keyword">int</span><span>&nbsp;c=</span><span class="number">0</span><span>;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class=""><span>  <span class="keyword">while</span><span>((c=si.read())!=-</span><span class="number">1</span><span>){&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li class="alt"><span>  <span class="comment">//这里也是一个字节一个字节写的。&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class=""><span>  ou.write(c);&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>  }&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>  <span class="comment">//关闭所有的资源&nbsp;&nbsp;</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>  si.close();&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>  ou.close();&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>  in2.close();&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>  in1.close();&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>  }&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class=""><span>  }&nbsp;&nbsp;&nbsp;</span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="262008" snippet_file_name="blog_20140328_4_2034671" name="code" class="java" style="font-size: 10pt; display: none;">public class TestSequence {  
  public static void main(String[] args)throws Exception{  
  //不管怎么样,先创建两个文件。从里面读取数据,(我的文件里面有内容!)  
  InputStream in1=new FileInputStream(new File("d:\\jack.txt"));  
  InputStream in2=new FileInputStream(new File("d:\\jack2.txt"));  
  //读取,数据后要生成的文件  
  OutputStream ou=new FileOutputStream(new File("d:\\jack3.txt"));  
  //创建SequenceInputStream类,  
  SequenceInputStream si=new SequenceInputStream(in1,in2);  
  //因为SequenceInputStream,是一个字节一个字节读,要判断一下是否读完了。  
  int c=0;  
  while((c=si.read())!=-1){  
  //这里也是一个字节一个字节写的。  
  ou.write(c);  
  }  
  //关闭所有的资源  
  si.close();  
  ou.close();  
  in2.close();  
  in1.close();  
  }  
  } </pre><span style="font-size:14px">能够将多个stream进行连接,然后输出。<br>
<br>
</span><p></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t9"></a><span style="font-size:14px"><strong>1.6&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">ObjectInputStream</span></strong><span style="color:#333333; font-size:14px">:用于操作Object的stream,这个在stream主要用在对象传输的过程中,其中牵涉到了序列化的知识</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>construct---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">ObjectInputStream():实例化一个ObjectInputStream对象</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">ObjectInputStream(InputStream):使用一个InputStream对象来实例化一个ObjectInputStream对象,其中InputStream就是对象的输入流</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了InputStream中的部分方法;</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">它自己有很多的额外的方法:</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">这里就只介绍一下readObject(Object)方法,就是将一个对象写入到stream中,但是这个object必须序列化</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">其他的还有像readInt,readFloat等这样基本类型的方法,因为基本类型对应的对象也都是Object.</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t10"></a><span style="font-size:14px"><strong>1.7&nbsp;</strong></span><span style="color:#ff0000; font-size:14px"><strong>FilterInputStream</strong></span><span style="color:#333333; font-size:14px">:是一个过滤的InputStream</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">FilterInputStream(InputStream):使用一个InputStream为参数实例化一个FilterInputStream,其实就是来修饰InputStream的</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了InputStream中的所有方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">他其实没有作用,他的众多子类是很有用的:</span></p>
<h4 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t11"></a><span style="font-size:14px"><strong>1.7.1&nbsp;</strong></span><span style="color:#ff0000; font-size:14px"><strong>BufferedInputStream</strong></span><span style="color:#333333; font-size:14px">:使用缓冲区的stream</span></h4>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">BufferedInputStream(InputStream):使用InputStream为参数初始化实例</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">BufferedInputStream(InputStream,int):能够设置缓冲区大小的BufferedInputStream</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了FilterInputStream中的所有方法(其实也是实现了InputStream中的所有方法)</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h4 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t12"></a><span style="font-size:14px"><strong>1.7.2&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">DataInputStream</span></strong><span style="color:#333333; font-size:14px">:数字格式化的stream</span></h4>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">DataInputStream(InputStream):使用InputStream参数来初始化实例</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了FilterInputStream中的部分方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">额外的方法:</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">readInt,readFloat,readDouble...这样可以直接从stream中读取基本类型的数据</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">还有其他的类就不做解释了,因为用到的很少了,有的可能一辈子都用不到</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
<br>
</p>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t13"></a><span style="color:rgb(0,0,255)"><span style="font-size:14px">2、 OutputSteam</span></span></h2>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
&nbsp;</p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
<img src="http://img.blog.csdn.net/20140328141248890?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">&nbsp;</p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
<br>
</p>
<h3 style="font-family:tahoma; line-height:25px"><a name="t14"></a><span style="font-size:14px; color:#ff0000"><strong>基类OutputStream</strong></span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">OutputStream()</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">write(int):写入一个字节到stream中</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">write(byte[])写入一个byte数组到stream中</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">write(byte[],int,int):把byte数组中从offset开始处写入长度为len的数据</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">close():关闭流,这个是在操作完stream之后必须要调用的方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">flush():这个方法是用来刷新stream中的数据,让缓冲区中的数据强制的输出</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3><a name="t15"></a><span style="font-size:14px"><strong>2.1&nbsp;</strong></span><span style="color:#ff0000; font-size:14px"><strong>ByteArrayOutputStream
</strong></span><span style="color:#333333; font-size:14px">: 把信息存入内存中的一个缓冲区中 . 该类实现一个以字节数组形式写入数据的输出流。</span></h3>
<p></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">当数据写入缓冲区时,它自动扩大。用 toByteArray() 和 toString() 能检索数据。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(A)--- ByteArrayOutputStream() 创建一个新的字节数组输出流。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(B)--- ByteArrayOutputStream() 创建一个新的字节数组输出流。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(C)--- ByteArrayOutputStream(int) 创建一个新的字节数组输出流,并带有指定大小字节的缓冲区容量。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了OutputStream的部分方法:</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">额外的方法:</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">toByteArray() 将字节流转化成一个字节数组,用于数据的检索</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">toString() 将字节流转化成一个String对象,默认采用系统的编码转化,同样可以用于数据的检索</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">toString(String) 根据指定字符编码将缓冲区内容转换为字符串,并将字节转换为字符。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">writeTo(OutputStream) 用 out.write(buf, 0, count) 调用输出流的写方法将该字节数组输出流的全部内容写入指定的输出流参数。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t16"></a><span style="font-size:14px"><strong>2.2&nbsp;</strong>&nbsp;</span><strong style="font-size:14px"><span style="color:#ff0000">FileOutputStream</span></strong><span style="color:#333333; font-size:14px">:
 文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(A)FileOutputStream(File&nbsp; name) 创建一个文件输出流,向指定的 File 对象输出数据。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(B)FileOutputStream(FileDescriptor) 创建一个文件输出流,向指定的文件描述器输出数据。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(C)FileOutputStream(String&nbsp; name) 创建一个文件输出流,向指定名称的文件输出数据。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(D)FileOutputStream(String, boolean) 用指定系统的文件名,创建一个输出文件。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了OutputStream中的部分方法。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">额外的两个方法:</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">getChannel():这个方法返回一个FileChannel对象,这个主要用于JNIO中的通道的。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">getFD():这个方法返回一个FileDescriptor对象,这个在构造函数中使用过。</span></p>
<span style="font-size:14px"><br>
</span>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t17"></a><span style="font-size:14px"><strong>2.3&nbsp;</strong></span><span style="color:#ff0000; font-size:14px"><strong>PipedOutputStream</strong></span><span style="color:#333333; font-size:14px">:
 管道输出流是指一个通讯管道的发送端。 一个线程通过管道输出流发送数据,</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(A)PipedOutputStream() 创建一个管道输出流,它还未与一个管道输入流连接。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">(B)PipedOutputStream(PipedInputStream) 创建一个管道输出流,它已连接到一个管道输入流。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了OutputStream的部分方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">额外的方法:</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">connection(PipedInputStream):连接一个PipedInputStream方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">下面来看一下PipedInputStream和PipedOutputStream的例子:</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"></p><div class="dp-highlighter bg_java"><div class="bar"><div class="tools"><b>[java]</b> <a href="#" class="ViewSource" title="view plain" onclick="dp.sh.Toolbar.Command('ViewSource',this);return false;">view plain</a><span data-mod="popu_168"> <a href="#" class="CopyToClipboard" title="copy" onclick="dp.sh.Toolbar.Command('CopyToClipboard',this);return false;">copy</a><div style="position: absolute; left: 712px; top: 9375px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_5" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_5" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=5&amp;width=18&amp;height=18" wmode="transparent"></div></span><span data-mod="popu_169"> <a href="#" class="PrintSource" title="print" onclick="dp.sh.Toolbar.Command('PrintSource',this);return false;">print</a></span><a href="#" class="About" title="?" onclick="dp.sh.Toolbar.Command('About',this);return false;">?</a><span class="tracking-ad" data-mod="popu_167"><a href="https://code.csdn.net/snippets/262008" target="_blank" title="在CODE上查看代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/CODE_ico.png" width="12" height="12" alt="在CODE上查看代码片" style="position:relative;top:1px;left:2px;"></a></span><span class="tracking-ad" data-mod="popu_170"><a href="https://code.csdn.net/snippets/262008/fork" target="_blank" title="派生到我的代码片" style="text-indent:0;"><img src="https://code.csdn.net/assets/ico_fork.svg" width="12" height="12" alt="派生到我的代码片" style="position:relative;top:2px;left:2px;"></a></span></div></div><ol start="1" class="dp-j"><li class="alt"><span><span class="keyword">package</span><span>&nbsp;com.io.demo;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.BufferedInputStream;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.BufferedReader;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.ByteArrayInputStream;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.IOException;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.InputStreamReader;&nbsp;&nbsp;</span></span></li><li class=""><span><span class="keyword">import</span><span>&nbsp;java.io.PipedInputStream;&nbsp;&nbsp;</span></span></li><li class="alt"><span><span class="keyword">import</span><span>&nbsp;java.io.PipedOutputStream;&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span><span class="keyword">public</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;IO&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">static</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;main(String[]&nbsp;args)&nbsp;</span><span class="keyword">throws</span><span>&nbsp;Exception{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PipedOutputStream&nbsp;pos&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;PipedOutputStream();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PipedInputStream&nbsp;pis&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;PipedInputStream(pos);&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;Thread(</span><span class="keyword">new</span><span>&nbsp;InputStreamRunnable(pis)).start();&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">new</span><span>&nbsp;Thread(</span><span class="keyword">new</span><span>&nbsp;OutputStreamRunnable(pos)).start();&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;InputStreamRunnable&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Runnable{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;PipedInputStream&nbsp;pis&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;InputStreamRunnable(PipedInputStream&nbsp;pis){&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.pis&nbsp;=&nbsp;pis;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;run()&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;sr&nbsp;=&nbsp;<span class="keyword">new</span><span>&nbsp;BufferedReader(</span><span class="keyword">new</span><span>&nbsp;InputStreamReader(pis));&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string">"读取到的内容:"</span><span>+sr.readLine());&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sr.close();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">static</span><span>&nbsp;</span><span class="keyword">class</span><span>&nbsp;OutputStreamRunnable&nbsp;</span><span class="keyword">implements</span><span>&nbsp;Runnable{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">private</span><span>&nbsp;PipedOutputStream&nbsp;pos&nbsp;=&nbsp;</span><span class="keyword">null</span><span>;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;OutputStreamRunnable(PipedOutputStream&nbsp;pos){&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">this</span><span>.pos&nbsp;=&nbsp;pos;&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="annotation">@Override</span><span>&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">public</span><span>&nbsp;</span><span class="keyword">void</span><span>&nbsp;run(){&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">try</span><span>&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos.write(<span class="string">"Hello&nbsp;World!"</span><span>.getBytes());&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;pos.close();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span class="keyword">catch</span><span>&nbsp;(IOException&nbsp;e)&nbsp;{&nbsp;&nbsp;</span></span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class=""><span>&nbsp;&nbsp;</span></li><li class="alt"><span>}&nbsp;&nbsp;</span></li></ol><div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div><pre code_snippet_id="262008" snippet_file_name="blog_20140328_5_2274652" name="code" class="java" style="font-size: 10pt; display: none;">package com.io.demo;


import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;


public class IO {

public static void main(String[] args) throws Exception{

PipedOutputStream pos = new PipedOutputStream();
try {
PipedInputStream pis = new PipedInputStream(pos);
new Thread(new InputStreamRunnable(pis)).start();
new Thread(new OutputStreamRunnable(pos)).start();
} catch (IOException e) {
e.printStackTrace();
}
}

static class InputStreamRunnable implements Runnable{
private PipedInputStream pis = null;
public InputStreamRunnable(PipedInputStream pis){
this.pis = pis;
}
@Override
public void run() {
BufferedReader sr = new BufferedReader(new InputStreamReader(pis));
try {
System.out.println("读取到的内容:"+sr.readLine());
sr.close();
} catch (IOException e) {
e.printStackTrace();
}
}

}

static class OutputStreamRunnable implements Runnable{
private PipedOutputStream pos = null;
public OutputStreamRunnable(PipedOutputStream pos){
this.pos = pos;
}
@Override
public void run(){
try {
pos.write("Hello World!".getBytes());
pos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


}</pre><span style="font-size:14px">其实PipedInputStream/PipedOutputStream相当于消费者和生产者机制。</span><p></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
<br>
</p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t18"></a><span style="font-size:14px"><strong>2.4&nbsp;</strong></span><span style="color:#ff0000; font-size:14px"><strong>ObjectOutputStream</strong></span><span style="color:#333333; font-size:14px">:输出Object对象的stream</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">ObjectOutputStream:实例化一个ObjectOutputStream对象</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">ObjectOutputStream(OutputStream):使用OutputStream对象来实例化一个ObjectOutputStream对象,将对象写入到OutputStream中</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了OutputStream中的部分方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">额外的方法:</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">这里只介绍一个writeObject(Object):将一个对象Object写入到OutputStream中</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">同时他也有writeInt,writeFloat..这样的基本类型的方法,因为基本类型对应的对象类型都是Object的子类</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">关于ObjectInputStream/ObjectOutputStream主要用与将一个对象Object写入到本地或者是在网络中进行传输的,所以这些对象需要进行序列化操作。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t19"></a><span style="font-size:14px"><strong>2.5 &nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">FilterOutputStream</span></strong><span style="color:#333333; font-size:14px">:过滤的OutputStream</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">FilterOutputStream(OutputStream):使用OutputStream参数实例化FilterOutputStream</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了OutputStream的所有方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">和FilterInputStream一样,他其实也没有什么用途,他的子类很有用的</span></p>
<h4 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t20"></a><span style="font-size:14px"><strong>2.5.1&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">BufferedOutputStream</span></strong><span style="color:#333333; font-size:14px">:带有缓冲区的stream</span></h4>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">BufferedOutputStream(OutputStream):使用OutputStream参数初始化BufferedOutputStream类</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">BufferedOutputStream(OutputStream,int):在初始化实例的时候指定缓冲区的大小</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了FilterOutputStream中的部分方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="font-family:tahoma; line-height:25px"><a name="t21"></a><span style="font-size:14px; color:rgb(51,51,51)"><strong>2.5.2&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">DataOutputStream</span></strong><span style="color:rgb(51,51,51); font-size:14px">:具有格式化的OutputStream</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">DataOutputStream(OutputStream):使用OutputStream参数来初始化DataOutputStream实例</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了FilterOutputStream中的部分方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">writeInt,writeFloat,writeDouble....能够给直接向stream中写入基本类型的方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t22"></a><span style="font-size:14px"><strong>2.5.3&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">PrintStream</span></strong><span style="color:#333333; font-size:14px">:直接输出到控制台中:我们最熟悉的就是System.out他就是一个PrintStream</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">PrintStream(OutputStream):使用OutputStream参数来实例化PrintStream</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了FilterOutputStream中的部分方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">print()有多个重载的方法,8中基本类型和String类型,同时他还可以进行格式化输出。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">其他还有一些stream可能用不到,这里就不做介绍了。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
<br>
</p>
<h1 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t23"></a><span style="color:rgb(255,102,0)"><span style="font-size:14px"><strong>( 二 )以字符为导向的 Stream &nbsp;Reader/Writer</strong></span></span></h1>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">以 Unicode 字符为导向的 stream ,表示以 Unicode 字符为单位从 stream 中读取或往 stream 中写入信息。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">Reader/Writer 为 abstact 类</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">以 Unicode 字符为导向的 stream 包括下面几种类型:</span></p>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t24"></a><span style="color:rgb(0,0,255)"><span style="font-size:14px"><strong>1. Reader</strong></span></span></h2>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
&nbsp;</p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
<img src="http://img.blog.csdn.net/20140328143211218?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">&nbsp;</p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
<br>
</p>
<h3 style="font-family:tahoma; line-height:25px"><a name="t25"></a><span style="font-size:14px"><strong><span style="color:#ff0000">Reader基类</span></strong><span style="color:#333333">:基于字符流的stream</span></span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor--</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">Reader():无参的构造方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">这些方法和InputStream中的方法是一一对应的,就是读取的类型不同,InputStream中读取的是byte,而Reader中读取的是char</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t26"></a><span style="font-size:14px"><strong>1.1&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">CharArrayReader
</span></strong><span style="color:#333333; font-size:14px">:与 ByteArrayInputStream 对应此类实现一个可用作字符输入流的字符缓冲区</span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>constructor---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">CharArrayReader(char[]) 用指定字符数组创建一个 CharArrayReader 。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">CharArrayReader(char[], int, int) 用指定字符数组创建一个 CharArrayReader</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><strong>method---</strong></span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">实现了部分Reader的方法</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t27"></a><span style="font-size:14px"><strong>1.2&nbsp;</strong></span><span style="color:#ff0000; font-size:14px"><strong>StringReader
</strong></span><span style="color:#333333; font-size:14px"><span style="font-weight:normal">:</span>
<span style="font-weight:normal">与 StringBufferInputStream 对应其源为一个字符串的字符流。</span></span></h3>
<div><span style="color:#333333; font-size:14px"><br>
</span></div>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t28"></a><span style="font-size:14px"><strong>1.3&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">FileReader
</span></strong><span style="color:#333333; font-size:14px"><span style="font-weight:normal">: 与 FileInputStream 对应</span></span></h3>
<div><span style="color:#333333; font-size:14px"><span style="font-weight:normal"><br>
</span></span></div>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t29"></a><span style="font-size:14px"><strong>1.4&nbsp;</strong></span><strong style="font-size:14px"><span style="color:#ff0000">PipedReader
</span></strong><span style="color:#333333; font-size:14px; font-weight:normal">:与 PipedInputStream 对应</span></h3>
<div><span style="color:#333333; font-size:14px"><br>
</span></div>
<p style="font-family:tahoma; line-height:25px"><span style="font-size:14px; color:rgb(51,51,51)"><strong>1.5&nbsp;</strong></span><span style="font-size:14px"><strong><span style="color:#ff0000">InputStreamReader</span></strong>:</span><span style="color:#333333; color:rgb(51,51,51); font-size:14px">将InputStream转化成Reader</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">&nbsp;</span></p>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t30"></a><span style="color:rgb(0,0,255)"><span style="font-size:14px"><strong>2.&nbsp; Writer</strong></span></span></h2>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
&nbsp;<img src="http://img.blog.csdn.net/20140328143231781?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamlhbmd3ZWkwOTEwNDEwMDAz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt=""></p>
<h3 style="font-family:tahoma; line-height:25px"><a name="t31"></a><span style="font-size:14px"><strong style="color:rgb(51,51,51)">2.1</strong><span style="color:#333333">&nbsp; &nbsp;
</span><span style="color:#ff0000">CharArrayWriter</span><span style="color:#333333"><span style="font-weight:normal">: 与 ByteArrayOutputStream 对应</span></span></span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="font-family:tahoma; line-height:25px"><a name="t32"></a><span style="font-size:14px"><strong style="color:rgb(51,51,51)">2.2</strong><span style="color:#333333">&nbsp;&nbsp;
</span><span style="color:#ff0000"><strong>StringWriter</strong></span><span style="color:#333333"><span style="font-weight:normal">:无与之对应的以字节为导向的 stream</span></span></span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="font-family:tahoma; line-height:25px"><a name="t33"></a><span style="font-size:14px"><span style="color:#333333; font-weight:bold">2.3&nbsp;
</span><span style="color:#ff0000">FileWriter</span><span style="color:#333333"><span style="font-weight:normal">: 与 FileOutputStream 对应</span></span></span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="font-family:tahoma; line-height:25px"><a name="t34"></a><span style="font-size:14px"><strong style="color:rgb(51,51,51)">2.4</strong><span style="color:#333333">&nbsp;
</span><span style="color:#ff0000">PipedWriter</span><span style="color:#333333"><span style="font-weight:normal">:与 PipedOutputStream 对应</span></span></span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="font-family:tahoma; line-height:25px"><a name="t35"></a><span style="font-size:14px"><strong style="color:rgb(51,51,51)">2.5</strong>
<span style="color:#ff0000"><strong>OutputStreamWriter</strong></span><span style="color:#333333"><span style="font-weight:normal">:将OutputStream转化成Writer</span></span></span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h3 style="font-family:tahoma; line-height:25px"><a name="t36"></a><span style="font-size:14px"><strong style="color:rgb(51,51,51)">2.6
</strong><span style="color:#ff0000"><strong>PrintReader</strong><span style="font-weight:normal">:</span></span><span style="color:#333333"><span style="font-weight:normal">和PrintStream对应</span></span></span></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
&nbsp;</p>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t37"></a><span style="color:rgb(0,0,255)"><span style="font-size:14px"><strong>3、两种不同导向的 Stream 之间的转换&nbsp;</strong>&nbsp;</span></span></h2>
<h3 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t38"></a><span style="font-size:14px"><strong>3.1&nbsp;</strong></span><strong style="color:rgb(255,0,0); font-size:14px">InputStreamReader 和 OutputStreamReader :</strong></h3>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">把一个以字节为导向的 stream 转换成一个以字符为导向的 stream 。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">InputStreamReader 的 read() 方法之一的每次调用,可能促使从基本字节输入流中读取一个或多个字节。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">为了达到更高效率,考虑用 BufferedReader 封装 InputStreamReader ,</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">BufferedReader in = new BufferedReader(new InputStreamReader(System.in));</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">例如: // 实现从键盘输入一个整数</span></p>
<div class="dp-highlighter bg_java" style="font-family:Consolas,'Courier New',Courier,mono,serif; background-color:rgb(231,229,220); width:647.453125px; overflow:auto; padding-top:1px; color:rgb(51,51,51); line-height:25px; margin:18px 0px!important">
<div class="bar" style="padding-left:45px">
<div class="tools" style="padding:3px 8px 10px 10px; font-size:9px; line-height:normal; font-family:Verdana,Geneva,Arial,Helvetica,sans-serif; color:silver; background-color:rgb(248,248,248); border-left-width:3px; border-left-style:solid; border-left-color:rgb(108,226,108)">
<strong>[java]</strong>&nbsp;<a target="_blank" href="http://blog.csdn.net/ilibaba/article/details/3955799#" class="ViewSource" title="view plain" style="color:rgb(160,160,160); text-decoration:none; background-color:inherit; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px">view
 plain</a><a target="_blank" href="http://blog.csdn.net/ilibaba/article/details/3955799#" class="CopyToClipboard" title="copy" style="color:rgb(160,160,160); text-decoration:none; background-color:inherit; border:none; padding:1px; margin:0px 10px 0px 0px; font-size:9px; display:inline-block; width:16px; height:16px; text-indent:-2000px">copy</a>
<div style="position:absolute; left:585px; top:5511px; width:18px; height:18px; z-index:99">
</div>
<div style="position: absolute; left: 709px; top: 13457px; width: 18px; height: 18px; z-index: 99;"><embed id="ZeroClipboardMovie_6" src="http://static.blog.csdn.net/scripts/ZeroClipboard/ZeroClipboard.swf" loop="false" menu="false" quality="best" bgcolor="#ffffff" width="18" height="18" name="ZeroClipboardMovie_6" align="middle" allowscriptaccess="always" allowfullscreen="false" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer" flashvars="id=6&amp;width=18&amp;height=18" wmode="transparent"></div></div>
</div>
<ol start="1" class="dp-j" style="padding:0px; border:none; list-style-position:initial; background-color:rgb(255,255,255); color:rgb(92,92,92); margin:0px 0px 1px 45px!important">
<li class="alt" style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit"><span style="margin:0px; padding:0px; border:none; background-color:inherit">String&nbsp;s&nbsp;=&nbsp;</span><span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); background-color:inherit; font-weight:bold">null</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span></li><li style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; background-color:rgb(248,248,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">InputStreamReader&nbsp;re&nbsp;=&nbsp;<span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); background-color:inherit; font-weight:bold">new</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">&nbsp;InputStreamReader(System.in);&nbsp;&nbsp;</span></span></li><li class="alt" style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;=&nbsp;<span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); background-color:inherit; font-weight:bold">new</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">&nbsp;BufferedReader(re);&nbsp;&nbsp;</span></span></li><li style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; background-color:rgb(248,248,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); background-color:inherit; font-weight:bold">try</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">&nbsp;{&nbsp;&nbsp;</span></span></li><li class="alt" style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;s&nbsp;=&nbsp;br.readLine();&nbsp;&nbsp;</span></li><li style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; background-color:rgb(248,248,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"s=&nbsp;"</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">&nbsp;+&nbsp;Integer.parseInt(s));&nbsp;&nbsp;</span></span></li><li class="alt" style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;br.close();&nbsp;&nbsp;</span></li><li style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; background-color:rgb(248,248,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt" style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); background-color:inherit; font-weight:bold">catch</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">&nbsp;(IOException&nbsp;e)&nbsp;&nbsp;</span></span></li><li style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; background-color:rgb(248,248,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class="alt" style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();&nbsp;&nbsp;</span></li><li style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; background-color:rgb(248,248,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;&nbsp;</span></li><li class="alt" style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword" style="margin:0px; padding:0px; border:none; color:rgb(0,102,153); background-color:inherit; font-weight:bold">catch</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">&nbsp;(NumberFormatException&nbsp;e)</span><span class="comment" style="margin:0px; padding:0px; border:none; color:rgb(0,130,0); background-color:inherit">//&nbsp;当应用程序试图将字符串转换成一种数值类型,但该字符串不能转换为适当格式时,抛出该异常。</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">&nbsp;&nbsp;</span></span></li><li style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; background-color:rgb(248,248,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;</span></li><li class="alt" style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; color:inherit; line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(<span class="string" style="margin:0px; padding:0px; border:none; color:blue; background-color:inherit">"&nbsp;输入的不是数字&nbsp;"</span><span style="margin:0px; padding:0px; border:none; background-color:inherit">);&nbsp;&nbsp;</span></span></li><li style="border-style:none none none solid; border-left-width:3px; border-left-color:rgb(108,226,108); list-style:decimal-leading-zero outside; background-color:rgb(248,248,248); line-height:18px; margin:0px!important; padding:0px 3px 0px 10px!important">
<span style="margin:0px; padding:0px; border:none; color:black; background-color:inherit">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;</span></li></ol>
<div class="save_code tracking-ad" data-mod="popu_249" style="display: none;"><a href="javascript:;" target="_blank"><img src="http://static.blog.csdn.net/images/save_snippets.png"></a></div></div>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">InputStreamReader(InputStream) 用缺省的字符编码方式,创建一个 InputStreamReader&nbsp;</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">InputStreamReader(InputStream, String) 用已命名的字符编码方式,创建一个 InputStreamReader&nbsp;</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px; font-size:10pt">
&nbsp;</p>
<h1 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t39"></a><span style="color:rgb(255,102,0)"><strong><span style="font-size:14px">(三)Java IO 的一般使用原则 :&nbsp;&nbsp;</span></strong></span></h1>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t40"></a><span style="font-size:14px">一、按数据来源(去向)分类:</span></h2>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t41"></a><span style="font-size:14px">二、按是否格式化输出分:</span></h2>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">1 、要格式化输出: PrintStream, PrintWriter</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t42"></a><span style="font-size:14px">三、按是否要缓冲分:</span></h2>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t43"></a><span style="font-size:14px"><strong>四、按数据格式分:</strong></span></h2>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t44"></a><span style="font-size:14px"><strong>五、按输入输出分:</strong></span></h2>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">1 、输入: Reader, InputStream 类型的子类</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">2 、输出: Writer, OutputStream 类型的子类</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px"><br>
</span></p>
<h2 style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><a name="t45"></a><span style="font-size:14px"><strong>六、特殊需要:</strong></span></h2>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">2 、对象输入输出: ObjectInputStream, ObjectOutputStream</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">4 、合并输入: SequenceInputStream</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">首先,考虑最原始的数据格式是什么: 原则四</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">第二,是输入还是输出:原则五</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">第三,是否需要转换流:原则六第 1 点</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">第四,数据来源(去向)是什么:原则一</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">第五,是否要缓冲:原则三 (特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)</span></p>
<p style="color:rgb(51,51,51); font-family:tahoma; line-height:25px"><span style="font-size:14px">第六,是否要格式化输出:原则二</span></p>
   
</div>








<!-- Baidu Button BEGIN -->








<div class="bdsharebuttonbox tracking-ad bdshare-button-style0-16" style="float: right;" data-mod="popu_172" data-bd-bind="1488361789182">
<a href="#" class="bds_more" data-cmd="more" style="background-position:0 0 !important; background-image: url(http://bdimg.share.baidu.com/static/api/img/share/icons_0_16.png?v=d754dcc0.png) !important" target="_blank"></a>
<a href="#" class="bds_qzone" data-cmd="qzone" title="分享到QQ空间" style="background-position:0 -52px !important" target="_blank"></a>
<a href="#" class="bds_tsina" data-cmd="tsina" title="分享到新浪微博" style="background-position:0 -104px !important" target="_blank"></a>
<a href="#" class="bds_tqq" data-cmd="tqq" title="分享到腾讯微博" style="background-position:0 -260px !important" target="_blank"></a>
<a href="#" class="bds_renren" data-cmd="renren" title="分享到人人网" style="background-position:0 -208px !important" target="_blank"></a>
<a href="#" class="bds_weixin" data-cmd="weixin" title="分享到微信" style="background-position:0 -1612px !important" target="_blank"></a>
</div>
<script>window._bd_share_config = { "common": { "bdSnsKey": {}, "bdText": "", "bdMini": "1", "bdMiniList": false, "bdPic": "", "bdStyle": "0", "bdSize": "16" }, "share": {} }; with (document) 0[(getElementsByTagName('head')[0] || body).appendChild(createElement('script')).src = 'http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion=' + ~(-new Date() / 36e5)];</script>
<!-- Baidu Button END -->


   <link rel="stylesheet" href="http://static.blog.csdn.net/css/blog_detail.css">


    
<!--172.16.140.14-->


<!-- Baidu Button BEGIN -->
<script type="text/javascript" id="bdshare_js" data="type=tools&amp;uid=1536434" src="http://bdimg.share.baidu.com/static/js/bds_s_v2.js?cdnversion=413434"></script>


<script type="text/javascript">
    document.getElementById("bdshell_js").src = "http://bdimg.share.baidu.com/static/js/shell_v2.js?cdnversion=" + Math.ceil(new Date()/3600000)
</script>
<!-- Baidu Button END -->


 




        <div id="digg" articleid="22376895">
            <dl id="btnDigg" class="digg digg_disable" onclick="btndigga();">
               
                 <dt>顶</dt>
                <dd>21</dd>
            </dl>
           
              
            <dl id="btnBury" class="digg digg_disable" onclick="btnburya();">
              
                  <dt>踩</dt>
                <dd>1</dd>               
            </dl>
            
        </div>
     <div class="tracking-ad" data-mod="popu_222"><a href="javascript:void(0);" target="_blank">&nbsp;</a>   </div>
    <div class="tracking-ad" data-mod="popu_223"> <a href="javascript:void(0);" target="_blank">&nbsp;</a></div>
    <script type="text/javascript">
                function btndigga() {
                    $(".tracking-ad[data-mod='popu_222'] a").click();
                }
                function btnburya() {
                    $(".tracking-ad[data-mod='popu_223'] a").click();
                }
            </script>


   <ul class="article_next_prev">
                <li class="prev_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian']);location.href='/jiangwei0910410003/article/details/21716557';">上一篇</span><a href="/jiangwei0910410003/article/details/21716557" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_shangyipian'])">JavaWeb学习篇之----Tomcat中配置数字证书以及网络传输数据中的密码学知识</a></li>
                <li class="next_article"><span onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian']);location.href='/jiangwei0910410003/article/details/22728051';">下一篇</span><a href="/jiangwei0910410003/article/details/22728051" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_xiayipian'])">JavaWeb学习篇之----Servlet</a></li>
    </ul>


    <div style="clear:both; height:10px;"></div>




        <div class="similar_article" style="">
                <h4>我的同类文章</h4>
                <div class="similar_c" style="margin:20px 0px 0px 0px">
                    <div class="similar_c_t">
                                <label class="similar_cur">
                                    <span style="cursor:pointer" onclick="GetCategoryArticles('1819961','jiangwei0910410003','foot','22376895');">Java<em>(34)</em></span>
                                </label>
                    </div>
                   
                    <div class="similar_wrap tracking-ad" data-mod="popu_141" style="max-height:195px;">
                        <a href="http://blog.csdn.net" style="display:none" target="_blank">http://blog.csdn.net</a>
                        <ul class="similar_list fl"><li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/40709457" id="foot_aritcle_40709457undefined7589035933390957" target="_blank" title="Java虚拟机解析篇之---垃圾回收器">Java虚拟机解析篇之---垃圾回收器</a><span>2014-11-02</span><label><i>阅读</i><b>8596</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/38303229" id="foot_aritcle_38303229undefined6132972879064151" target="_blank" title="数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点">数据结构和算法设计专题之---单链表中在指定的节点前面插入以及删除一个节点</a><span>2014-07-30</span><label><i>阅读</i><b>2281</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/38269117" id="foot_aritcle_38269117undefined25432018661736056" target="_blank" title="数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点">数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点</a><span>2014-07-29</span><label><i>阅读</i><b>2902</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/38235315" id="foot_aritcle_38235315undefined7843173721958538" target="_blank" title="数据结构和算法设计专题之---求子数组和的最大值">数据结构和算法设计专题之---求子数组和的最大值</a><span>2014-07-28</span><label><i>阅读</i><b>1741</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/37997899" id="foot_aritcle_37997899undefined015512348967210654" target="_blank" title="Ubuntu中的解压缩文件的方式">Ubuntu中的解压缩文件的方式</a><span>2014-07-20</span><label><i>阅读</i><b>3735</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/37937749" id="foot_aritcle_37937749undefined8007900579783871" target="_blank" title="数据结构和算法设计专题之---24点游戏(穷举法和递归法)">数据结构和算法设计专题之---24点游戏(穷举法和递归法)</a><span>2014-07-18</span><label><i>阅读</i><b>2621</b></label></li> </ul>


                        <ul class="similar_list fr"><li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/40616223" id="foot_aritcle_40616223undefined8455933159206486" target="_blank" title="Java虚拟机解析篇之---内存模型">Java虚拟机解析篇之---内存模型</a><span>2014-11-02</span><label><i>阅读</i><b>5229</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/38302913" id="foot_aritcle_38302913undefined23534995806717518" target="_blank" title="数据结构和算法设计专题之---判断两个链表是否相交并找出交点">数据结构和算法设计专题之---判断两个链表是否相交并找出交点</a><span>2014-07-30</span><label><i>阅读</i><b>1769</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/38261783" id="foot_aritcle_38261783undefined08821521112431774" target="_blank" title="数据结构和算法设计专题之---八大内部排序">数据结构和算法设计专题之---八大内部排序</a><span>2014-07-29</span><label><i>阅读</i><b>2530</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/38024403" id="foot_aritcle_38024403undefined7798564573547537" target="_blank" title="数据结构和算法设计专题之---二分查找(Java版)">数据结构和算法设计专题之---二分查找(Java版)</a><span>2014-07-21</span><label><i>阅读</i><b>1861</b></label></li> <li><em>•</em><a href="http://blog.csdn.net/jiangwei0910410003/article/details/37996723" id="foot_aritcle_37996723undefined4275033253917535" target="_blank" title="Ubuntu下安装JDK图文解析">Ubuntu下安装JDK图文解析</a><span>2014-07-20</span><label><i>阅读</i><b>17319</b></label></li> </ul>
                    <a href="http://blog.csdn.net/jiangwei0910410003/article/category/1819961" class="MoreArticle">更多文章</a></div>
                </div>
            </div>    
    <script type="text/javascript">
        $(function () {
            GetCategoryArticles('1819961', 'jiangwei0910410003','foot','22376895');
        });
    </script>
      
</div>


     <div>
             <div class="J_adv" data-view="true" data-mod="ad_popu_206" data-mtp="43" data-order="114" data-con="ad_content_1901" style="width: 960px; height: 90px;"><script src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:inline-block;width:960px;height:90px" data-ad-client="ca-pub-8990951720398508" data-ad-slot="8267689356/3776917242" data-adsbygoogle-status="done"><ins id="aswift_0_expand" style="display:inline-table;border:none;height:90px;margin:0;padding:0;position:relative;visibility:visible;width:960px;background-color:transparent"><ins id="aswift_0_anchor" style="display:block;border:none;height:90px;margin:0;padding:0;position:relative;visibility:visible;width:960px;background-color:transparent"><iframe width="960" height="90" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="var i=this.id,s=window.google_iframe_oncopy,H=s&amp;&amp;s.handlers,h=H&amp;&amp;H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&amp;&amp;d&amp;&amp;(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_0" name="aswift_0" style="left:0;position:absolute;top:0;"></iframe></ins></ins></ins><script>(adsbygoogle=window.adsbygoogle || []).push({});</script></div> 
    </div>


<div id="suggest">


</div>
         <script language="javascript" type="text/javascript">     
             $(function(){
                 $.get("/jiangwei0910410003/svc/GetSuggestContent/22376895",function(data){
                     $("#suggest").html(data);
                 });     
             });             
         </script>  




<style>
.blog-ass-articl dd {
color: #369;
width: 99%; /*修改行*/
float: left;
overflow: hidden;
font: normal normal 12px/23px "SimSun";
height: 23px;
margin: 0;
padding: 0 0 0 10px;
margin-right: 30px;
background: url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;
}
</style>


 <link rel="stylesheet" href="http://static.blog.csdn.net/css/replace.css">


<div id="relate" data-mod="popu_218" class="tracking-ad" style="display: block;">
        <div class="relate_t">
            <h3><span>参考知识库</span></h3>
        </div>
        <div class="relate_c"><dl class="relate_list"><dt><a target="_blank" href="http://lib.csdn.net/base/java"><img src="http://img.knowledge.csdn.net/upload/base/1453701371636_636.jpg" alt="img"></a></dt><dd><h4><a target="_blank" href="http://lib.csdn.net/base/java">Java 知识库</a></h4><p><label><span>23337</span><em>关注</em><i>|</i><span>1441</span><em>收录</em></label></p></dd></dl><dl class="relate_list"><dt><a target="_blank" href="http://lib.csdn.net/base/javase"><img src="http://img.knowledge.csdn.net/upload/base/1453169124297_297.jpg" alt="img"></a></dt><dd><h4><a target="_blank" href="http://lib.csdn.net/base/javase">Java SE知识库</a></h4><p><label><span>23007</span><em>关注</em><i>|</i><span>468</span><em>收录</em></label></p></dd></dl><dl class="relate_list"><dt><a target="_blank" href="http://lib.csdn.net/base/javaee"><img src="http://img.knowledge.csdn.net/upload/base/1456818035722_722.jpg" alt="img"></a></dt><dd><h4><a target="_blank" href="http://lib.csdn.net/base/javaee">Java EE知识库</a></h4><p><label><span>15378</span><em>关注</em><i>|</i><span>1252</span><em>收录</em></label></p></dd></dl></div>
</div>
 


<dl class="blog-ass-articl" id="res-relatived"> 
    <div class="embody embody_b" id="libkeyparent" style="display:none">
            <span class="embody_t">更多资料请参考:</span>
            <div class="embody_c" id="libkey"></div>
    </div>




     <dt><span>猜你在找</span></dt>    




   




    <div id="adCollege" style="width: 42%;float: left;"> 
        <script src="http://csdnimg.cn/jobreco/job_reco.js" type="text/javascript"></script> 
        <script type="text/javascript">
            csdn.position.showEdu({
                sourceType: "blog",
                searchType: "detail",
                searchKey: "22376895",
                username: "",
                recordcount: "5",
                containerId: "adCollege" //容器DIV的id。 
            });
        </script> 
    <div class="tracking-ad" data-mod="popu_84"><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/3047" title="JavaSE高级篇---(IO流+多线程+XML+Socket+swing)" strategy="v4:content" target="_blank">JavaSE高级篇---(IO流+多线程+XML+Socket+swing)</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/2544" title="实践项目之深入Javascript字符串实战视频课程" strategy="v4:content" target="_blank">实践项目之深入Javascript字符串实战视频课程</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/4181" title="深入Javascript Object(对象)视频教程" strategy="v4:content" target="_blank">深入Javascript Object(对象)视频教程</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/4184" title="深入Javascript 日期对象(Date)视频课程" strategy="v4:content" target="_blank">深入Javascript 日期对象(Date)视频课程</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px; white-space: nowrap;"><a href="http://edu.csdn.net/course/detail/3767" title="JavaScript面向对象的编程视频课程第二季 对象" strategy="v4:content" target="_blank">JavaScript面向对象的编程视频课程第二季 对象</a></dd></div></div>  


    
     <div id="res" data-mod="popu_36" class="tracking-ad" style="width: 42%; float: left; margin-right: 30px; display: block;"><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="http://blog.csdn.net/yang5726685/article/details/53333613" title="Java中的IO流系统详解" strategy="SearchAlgorithm" target="_blank">Java中的IO流系统详解</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="http://blog.csdn.net/nowlf_android/article/details/39473265" title="Java中的IO流系统详解" strategy="SearchAlgorithm" target="_blank">Java中的IO流系统详解</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="http://blog.csdn.net/lzxyzq/article/details/51397006" title="Java中的IO流系统详解" strategy="SearchAlgorithm" target="_blank">Java中的IO流系统详解</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="http://blog.csdn.net/bbaiggey/article/details/51775552" title="Java IO" strategy="SearchAlgorithm" target="_blank">Java IO</a></dd><dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="http://blog.csdn.net/hkk11568/article/details/53454371" title="java 流" strategy="SearchAlgorithm" target="_blank">java 流</a></dd></div>
   
</dl>




<script type="text/javascript">
    $(function () {
        setTimeout(function () {
            var searchtitletags = 'Java中的IO流系统详解' + ',' + $("#tags").html();
            searchService({
                index: 'blog',
                query: searchtitletags,
                from: 5,
                size: 5,
                appendTo: '#res',
                url: 'recommend',
                his: 2,
                client: "blog_cf_enhance",
                tmpl: '<dd style="background:url(http://static.blog.csdn.net/skin/default/images/blog-dot-red3.gif) no-repeat 0 10px;"><a href="#{ url }" title="#{ title }" strategy="#{ strategy }">#{ title }</a></dd>'
            });
        }, 500);
    });    


 </script>  




    <div id="ad_cen">        
                      <div class="J_adv" data-view="true" data-mod="ad_popu_199" data-mtp="43" data-order="114" data-con="ad_content_1843" style="width: 960px; height: 90px;"><script src="//pagead2.googlesyndication.com/pagead/js/adsbygoogle.js"></script><ins class="adsbygoogle" style="display:inline-block;width:960px;height:90px" data-ad-client="ca-pub-8990951720398508" data-ad-slot="8267689356/3115746762" data-adsbygoogle-status="done"><ins id="aswift_1_expand" style="display:inline-table;border:none;height:90px;margin:0;padding:0;position:relative;visibility:visible;width:960px;background-color:transparent"><ins id="aswift_1_anchor" style="display:block;border:none;height:90px;margin:0;padding:0;position:relative;visibility:visible;width:960px;background-color:transparent"><iframe width="960" height="90" frameborder="0" marginwidth="0" marginheight="0" vspace="0" hspace="0" allowtransparency="true" scrolling="no" allowfullscreen="true" onload="var i=this.id,s=window.google_iframe_oncopy,H=s&amp;&amp;s.handlers,h=H&amp;&amp;H[i],w=this.contentWindow,d;try{d=w.document}catch(e){}if(h&amp;&amp;d&amp;&amp;(!d.body||!d.body.firstChild)){if(h.call){setTimeout(h,0)}else if(h.match){try{h=s.upd(h,i)}catch(e){}w.location.replace(h)}}" id="aswift_1" name="aswift_1" style="left:0;position:absolute;top:0;"></iframe></ins></ins></ins><script>(adsbygoogle=window.adsbygoogle || []).push({});</script></div>
    </div>  


    <!-- 广告位开始 -->
    <div class="J_adv" data-view="true" data-mod="ad_popu_72" data-mtp="62" data-order="40" data-con="ad_content_2072"><script id="popuLayer_js_q" src="http://ads.csdn.net/js/popuLayer.js" defer="" type="text/javascript"></script><div id="layerd" style="position: fixed; bottom: 0px; right: 0px; line-height: 0px; z-index: 1000; width: 300px; height: 278px; display: none;"><div class="J_close layer_close" style="display:;background-color:#efefef;padding:0px;color:#333;font:12px/24px Helvetica,Tahoma,Arial,sans-serif;text-align:right;">关闭</div><!-- 广告占位容器 --><div id="cpro_u2895327"><iframe id="iframeu2895327_0" src="http://pos.baidu.com/icym?pdbid=0&amp;orderid=0&amp;odid=0&amp;rtbid=0&amp;rdid=2895327&amp;dc=3&amp;di=u2895327&amp;dri=0&amp;dis=0&amp;dai=1&amp;ps=974x1548&amp;dcb=___adblockplus&amp;dtm=HTML_POST&amp;dvi=0.0&amp;dci=-1&amp;dpt=none&amp;tsr=0&amp;tpr=1488361789018&amp;ti=Java%E4%B8%AD%E7%9A%84IO%E6%B5%81%E7%B3%BB%E7%BB%9F%E8%AF%A6%E8%A7%A3%20-%20%E7%94%9F%E6%AD%BB%E7%9C%8B%E6%B7%A1%EF%BC%8C%E4%B8%8D%E6%9C%8D%E5%B0%B1%E5%B9%B2%EF%BC%81%20-%20%E5%8D%9A%E5%AE%A2%E9%A2%91%E9%81%93%20-%20CSDN.NET&amp;ari=2&amp;dbv=2&amp;drs=3&amp;pcs=1848x964&amp;pss=1848x17050&amp;cfv=0&amp;cpl=5&amp;chi=1&amp;cce=true&amp;cec=UTF-8&amp;tlm=1488361789&amp;rw=964&amp;ltu=http%3A%2F%2Fblog.csdn.net%2Fjiangwei0910410003%2Farticle%2Fdetails%2F22376895&amp;ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3DL3BxHe7ncfxRVF_eSGKecin7uE6wxzrAq3pSdEdQ5ICL22TuDvYl1a5LMMHv7EK77HFBDU--KFAMurGQzD2-YPKcncRuntNE0g_9AQSD7B7%26wd%3D%26eqid%3Db39354320000a7730000000558b69904&amp;ecd=1&amp;uc=1863x1056&amp;pis=-1x-1&amp;ccd=24&amp;cja=false&amp;cmi=7&amp;col=zh-CN&amp;cdo=-1&amp;sr=1920x1080&amp;tcn=1488361789&amp;qn=4a95c3580c3f5569&amp;tt=1488361789006.15.15.17" width="300" height="250" align="center,center" vspace="0" hspace="0" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" style="border:0;vertical-align:bottom;margin:0;width:300px;height:250px" allowtransparency="true"></iframe></div></div><script>  document.getElementById('popuLayer_js_q').onload=function(){      var styObjd=styObj={width:'300px','height':parseInt(250)+28};window.CSDN.Layer.PopuLayer('#layerd',{storageName:'layerd',styleObj:styObjd,total:50,expoire:1000*60});  }</script><!-- 投放代码 --><script type="text/javascript">   /*服务器频道首页置顶Banner960*90,创建于2014-7-3*/    (window.cproArray = window.cproArray || []).push({        id: 'u2895327'      });  </script>  <script src="http://cpro.baidustatic.com/cpro/ui/c.js" type="text/javascript"></script></div>
    <!-- 广告位结束 -->


<div class="comment_class">
    <div id="comment_title" class="panel_head">
        <span class="see_comment">查看评论</span><a name="comments"></a></div>
    <div id="comment_list"><dl class="comment_item comment_topic" id="comment_item_5919914"><dt class="comment_head" floor="5">5楼 <span class="user"><a class="username" href="/vfp8341" target="_blank">陪你去看南极光</a> <span class="ptime">2016-03-05 15:32发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="5919914" username="vfp8341"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/vfp8341" target="_blank"><img src="http://avatar.csdn.net/D/3/B/3_vfp8341.jpg" width="40" height="40"></a></dd><dd class="comment_body">总结的非常好!详细又有条理。</dd></dl><dl class="comment_item comment_topic" id="comment_item_5881325"><dt class="comment_head" floor="4">4楼 <span class="user"><a class="username" href="/qdh186" target="_blank">有梦想的年轻人</a> <span class="ptime">2016-02-15 12:35发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="5881325" username="qdh186"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qdh186" target="_blank"><img src="http://avatar.csdn.net/9/8/0/3_qdh186.jpg" width="40" height="40"></a></dd><dd class="comment_body">大神,受教了!</dd></dl><dl class="comment_item comment_topic" id="comment_item_5678485"><dt class="comment_head" floor="3">3楼 <span class="user"><a class="username" href="/u013030441" target="_blank">任长江</a> <span class="ptime">2015-12-01 17:21发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="5678485" username="u013030441"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/u013030441" target="_blank"><img src="http://avatar.csdn.net/4/7/8/3_u013030441.jpg" width="40" height="40"></a></dd><dd class="comment_body">总结的很详细,借鉴学习了!!</dd></dl><dl class="comment_item comment_topic" id="comment_item_5410535"><dt class="comment_head" floor="2">2楼 <span class="user"><a class="username" href="/qq_15137871" target="_blank">Bumble_B111</a> <span class="ptime">2015-09-13 23:10发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="5410535" username="qq_15137871"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/qq_15137871" target="_blank"><img src="http://avatar.csdn.net/6/C/9/3_qq_15137871.jpg" width="40" height="40"></a></dd><dd class="comment_body">写得好,总算对Java的IO系统有个整体的认识了</dd></dl><dl class="comment_item comment_topic" id="comment_item_5118037"><dt class="comment_head" floor="1">1楼 <span class="user"><a class="username" href="/sinat_23092639" target="_blank">易水南风</a> <span class="ptime">2015-06-03 12:01发表</span>  <a href="#reply" class="cmt_btn reply" title="回复">[回复]</a> <span class="comment_manage" style="display:none;" commentid="5118037" username="sinat_23092639"> <a href="#quote" class="cmt_btn quote" title="引用">[引用]</a> <a href="#report" class="cmt_btn report" title="举报">[举报]</a></span></span></dt><dd class="comment_userface"><a href="/sinat_23092639" target="_blank"><img src="http://avatar.csdn.net/7/9/D/3_sinat_23092639.jpg" width="40" height="40"></a></dd><dd class="comment_body">总结的不错,受益匪浅。</dd></dl><div class="clear"></div></div>
    <div id="comment_bar" style="display: none;">
    </div>
    <div id="comment_form"><div class="notice">该文章已被禁止评论!</div></div>
    <div class="announce">
        * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场<a name="reply"></a><a name="quote"></a></div>
</div>


<script type="text/javascript">
    var fileName = '22376895';
    var commentscount = 5;
    var islock = true
</script>
<script type="text/javascript" src="http://static.blog.csdn.net/scripts/comment.js"></script>
    <div id="ad_bot">
    </div>
<div id="report_dialog">
</div>


<div id="d-top" style="bottom:60px;">


        <script type="text/javascript">
            $(function(){
                setTimeout(function(){
                    $("#com-quick-reply").hide();
                },300);   
            });    
        </script>
    <a id="d-top-a" class="btn btn-top backtop" style="display: none;" title="返回顶部" onclick="_gaq.push(['_trackEvent','function', 'onclick', 'blog_articles_huidaodingbu'])">         
         <img src="http://static.blog.csdn.net/images/top.png" alt="TOP">
    </a>
</div>
<script type="text/javascript">
    $(function ()
    {
        $("#ad_frm_0").height("90px");
        
        setTimeout(function(){
            $("#ad_frm_2").height("200px");
        },1000);    
    });
  
</script>
<style type="text/css">
    .tag_list
    {
        background: none repeat scroll 0 0 #FFFFFF;
        border: 1px solid #D7CBC1;
        color: #000000;
        font-size: 12px;
        line-height: 20px;
        list-style: none outside none;
        margin: 10px 2% 0 1%;
        padding: 1px;
    }
    .tag_list h5
    {
        background: none repeat scroll 0 0 #E0DBD3;
        color: #47381C;
        font-size: 12px;
        height: 24px;
        line-height: 24px;
        padding: 0 5px;
        margin: 0;
    }
    .tag_list h5 a
    {
        color: #47381C;
    }
    .classify
    {
        margin: 10px 0;
        padding: 4px 12px 8px;
    }
    .classify a
    {
        margin-right: 20px;
        white-space: nowrap;
    }
</style>




<div class="tag_list" style="">


    <h5>
        <a href="http://www.csdn.net/tag/" target="_blank">核心技术类目</a></h5>
    <div class="classify">
<a title="全部主题" href="http://www.csdn.net/tag" target="_blank" onclick="LogClickCount(this,336);">全部主题</a>
<a title="Hadoop" href="http://g.csdn.net/5272865" target="_blank" onclick="LogClickCount(this,336);">Hadoop</a>
<a title="AWS" href="http://g.csdn.net/5272866" target="_blank" onclick="LogClickCount(this,336);">AWS</a>
<a title="移动游戏" href="http://g.csdn.net/5272870" target="_blank" onclick="LogClickCount(this,336);">移动游戏</a>
<a title="Java" href="http://g.csdn.net/5272871" target="_blank" onclick="LogClickCount(this,336);">Java</a>
<a title="Android" href="http://g.csdn.net/5272872" target="_blank" onclick="LogClickCount(this,336);">Android</a>
<a title="iOS" href="http://g.csdn.net/5272873" target="_blank" onclick="LogClickCount(this,336);">iOS</a>
<a title="Swift" href="http://g.csdn.net/5272868" target="_blank" onclick="LogClickCount(this,336);">Swift</a>
<a title="智能硬件" href="http://g.csdn.net/5272869" target="_blank" onclick="LogClickCount(this,336);">智能硬件</a>
<a title="Docker" href="http://g.csdn.net/5272867" target="_blank" onclick="LogClickCount(this,336);">Docker</a>
<a title="OpenStack" href="http://g.csdn.net/5272925" target="_blank" onclick="LogClickCount(this,336);">OpenStack</a>
<a title="VPN" href="http://www.csdn.net/tag/vpn" target="_blank" onclick="LogClickCount(this,336);">VPN</a>
<a title="Spark" href="http://g.csdn.net/5272924" target="_blank" onclick="LogClickCount(this,336);">Spark</a>
<a title="ERP" href="http://www.csdn.net/tag/erp" target="_blank" onclick="LogClickCount(this,336);">ERP</a>
<a title="IE10" href="http://www.csdn.net/tag/ie10" target="_blank" onclick="LogClickCount(this,336);">IE10</a>
<a title="Eclipse" href="http://www.csdn.net/tag/eclipse" target="_blank" onclick="LogClickCount(this,336);">Eclipse</a>
<a title="CRM" href="http://www.csdn.net/tag/crm" target="_blank" onclick="LogClickCount(this,336);">CRM</a>
<a title="JavaScript" href="http://www.csdn.net/tag/javascript" target="_blank" onclick="LogClickCount(this,336);">JavaScript</a>
<a title="数据库" href="http://www.csdn.net/tag/数据库" target="_blank" onclick="LogClickCount(this,336);">数据库</a>
<a title="Ubuntu" href="http://www.csdn.net/tag/ubuntu" target="_blank" onclick="LogClickCount(this,336);">Ubuntu</a>
<a title="NFC" href="http://www.csdn.net/tag/nfc" target="_blank" onclick="LogClickCount(this,336);">NFC</a>
<a title="WAP" href="http://www.csdn.net/tag/wap" target="_blank" onclick="LogClickCount(this,336);">WAP</a>
<a title="jQuery" href="http://www.csdn.net/tag/jquery" target="_blank" onclick="LogClickCount(this,336);">jQuery</a>
<a title="BI" href="http://www.csdn.net/tag/bi" target="_blank" onclick="LogClickCount(this,336);">BI</a>
<a title="HTML5" href="http://www.csdn.net/tag/html5" target="_blank" onclick="LogClickCount(this,336);">HTML5</a>
<a title="Spring" href="http://www.csdn.net/tag/spring" target="_blank" onclick="LogClickCount(this,336);">Spring</a>
<a title="Apache" href="http://www.csdn.net/tag/apache" target="_blank" onclick="LogClickCount(this,336);">Apache</a>
<a title=".NET" href="http://www.csdn.net/tag/.net" target="_blank" onclick="LogClickCount(this,336);">.NET</a>
<a title="API" href="http://www.csdn.net/tag/api" target="_blank" onclick="LogClickCount(this,336);">API</a>
<a title="HTML" href="http://www.csdn.net/tag/html" target="_blank" onclick="LogClickCount(this,336);">HTML</a>
<a title="SDK" href="http://www.csdn.net/tag/sdk" target="_blank" onclick="LogClickCount(this,336);">SDK</a>
<a title="IIS" href="http://www.csdn.net/tag/iis" target="_blank" onclick="LogClickCount(this,336);">IIS</a>
<a title="Fedora" href="http://www.csdn.net/tag/fedora" target="_blank" onclick="LogClickCount(this,336);">Fedora</a>
<a title="XML" href="http://www.csdn.net/tag/xml" target="_blank" onclick="LogClickCount(this,336);">XML</a>
<a title="LBS" href="http://www.csdn.net/tag/lbs" target="_blank" onclick="LogClickCount(this,336);">LBS</a>
<a title="Unity" href="http://www.csdn.net/tag/unity" target="_blank" onclick="LogClickCount(this,336);">Unity</a>
<a title="Splashtop" href="http://www.csdn.net/tag/splashtop" target="_blank" onclick="LogClickCount(this,336);">Splashtop</a>
<a title="UML" href="http://www.csdn.net/tag/uml" target="_blank" onclick="LogClickCount(this,336);">UML</a>
<a title="components" href="http://www.csdn.net/tag/components" target="_blank" onclick="LogClickCount(this,336);">components</a>
<a title="Windows Mobile" href="http://www.csdn.net/tag/windowsmobile" target="_blank" onclick="LogClickCount(this,336);">Windows Mobile</a>
<a title="Rails" href="http://www.csdn.net/tag/rails" target="_blank" onclick="LogClickCount(this,336);">Rails</a>
<a title="QEMU" href="http://www.csdn.net/tag/qemu" target="_blank" onclick="LogClickCount(this,336);">QEMU</a>
<a title="KDE" href="http://www.csdn.net/tag/kde" target="_blank" onclick="LogClickCount(this,336);">KDE</a>
<a title="Cassandra" href="http://www.csdn.net/tag/cassandra" target="_blank" onclick="LogClickCount(this,336);">Cassandra</a>
<a title="CloudStack" href="http://www.csdn.net/tag/cloudstack" target="_blank" onclick="LogClickCount(this,336);">CloudStack</a>
<a title="FTC" href="http://www.csdn.net/tag/ftc" target="_blank" onclick="LogClickCount(this,336);">FTC</a>
<a title="coremail" href="http://www.csdn.net/tag/coremail" target="_blank" onclick="LogClickCount(this,336);">coremail</a>
<a title="OPhone " href="http://www.csdn.net/tag/ophone " target="_blank" onclick="LogClickCount(this,336);">OPhone </a>
<a title="CouchBase" href="http://www.csdn.net/tag/couchbase" target="_blank" onclick="LogClickCount(this,336);">CouchBase</a>
<a title="云计算" href="http://www.csdn.net/tag/云计算" target="_blank" onclick="LogClickCount(this,336);">云计算</a>
<a title="iOS6" href="http://www.csdn.net/tag/iOS6" target="_blank" onclick="LogClickCount(this,336);">iOS6</a>
<a title="Rackspace " href="http://www.csdn.net/tag/rackspace " target="_blank" onclick="LogClickCount(this,336);">Rackspace </a>
<a title="Web App" href="http://www.csdn.net/tag/webapp" target="_blank" onclick="LogClickCount(this,336);">Web App</a>
<a title="SpringSide" href="http://www.csdn.net/tag/springside" target="_blank" onclick="LogClickCount(this,336);">SpringSide</a>
<a title="Maemo" href="http://www.csdn.net/tag/maemo" target="_blank" onclick="LogClickCount(this,336);">Maemo</a>
<a title="Compuware" href="http://www.csdn.net/tag/compuware" target="_blank" onclick="LogClickCount(this,336);">Compuware</a>
<a title="大数据" href="http://www.csdn.net/tag/大数据" target="_blank" onclick="LogClickCount(this,336);">大数据</a>
<a title="aptech" href="http://www.csdn.net/tag/aptech" target="_blank" onclick="LogClickCount(this,336);">aptech</a>
<a title="Perl" href="http://www.csdn.net/tag/perl" target="_blank" onclick="LogClickCount(this,336);">Perl</a>
<a title="Tornado" href="http://www.csdn.net/tag/tornado" target="_blank" onclick="LogClickCount(this,336);">Tornado</a>
<a title="Ruby" href="http://www.csdn.net/tag/ruby" target="_blank" onclick="LogClickCount(this,336);">Ruby</a>
<a title="Hibernate" href="http://www.csdn.net/hibernate" target="_blank" onclick="LogClickCount(this,336);">Hibernate</a>
<a title="ThinkPHP" href="http://www.csdn.net/tag/thinkphp" target="_blank" onclick="LogClickCount(this,336);">ThinkPHP</a>
<a title="HBase" href="http://www.csdn.net/tag/hbase" target="_blank" onclick="LogClickCount(this,336);">HBase</a>
<a title="Pure" href="http://www.csdn.net/tag/pure" target="_blank" onclick="LogClickCount(this,336);">Pure</a>
<a title="Solr" href="http://www.csdn.net/tag/solr" target="_blank" onclick="LogClickCount(this,336);">Solr</a>
<a title="Angular" href="http://www.csdn.net/tag/angular" target="_blank" onclick="LogClickCount(this,336);">Angular</a>
<a title="Cloud Foundry" href="http://www.csdn.net/tag/cloudfoundry" target="_blank" onclick="LogClickCount(this,336);">Cloud Foundry</a>
<a title="Redis" href="http://www.csdn.net/tag/redis" target="_blank" onclick="LogClickCount(this,336);">Redis</a>
<a title="Scala" href="http://www.csdn.net/tag/scala" target="_blank" onclick="LogClickCount(this,336);">Scala</a>
<a title="Django" href="http://www.csdn.net/tag/django" target="_blank" onclick="LogClickCount(this,336);">Django</a>
<a title="Bootstrap" href="http://www.csdn.net/tag/bootstrap" target="_blank" onclick="LogClickCount(this,336);">Bootstrap</a>
    </div>


</div>
  <script language="javascript" type="text/javascript">     
      $(function(){
              setTimeout(function(){
                  $.get("/jiangwei0910410003/svc/GetTagContent",function(data){
                      $(".tag_list").html(data).show();
                  });     
              });
          },500);                       
 </script> 




<div id="pop_win" style="display:none ;position: absolute; z-index: 10000; border: 1px solid rgb(220, 220, 220); top: 222.5px; left: 630px; opacity: 1; background: none 0px 0px repeat scroll rgb(255, 255, 255);">
    
</div>
<div id="popup_mask"></div>
<style>
    #popup_mask
    {
        position: absolute;
        width: 100%;
        height: 100%;
        background: #000;
        z-index: 9999;
        left: 0px;
        top: 0px;
        opacity: 0.3;
        filter: alpha(opacity=30);
        display: none;
    }


</style>








<script type="text/javascript">
    $(function(){
        setTimeout(function(){
            $(".comment_body:contains('回复')").each(function(index,item){
                var u=$(this).text().split(':')[0].toString().replace("回复","")
                var thisComment=$(this);
                if(u)
                {
                    $.getJSON("https://passport.csdn.net/get/nick?callback=?", {users: u}, function(a) {
                        if(a!=null&&a.data!=null&&a.data.length>0)
                        {
                            nick=a.data[0].n; 
                            if(u!=nick)
                            {
                                thisComment.text(thisComment.text().replace(u,nick));  
                            }
                        }       
                    });  
                }
            });         


        },200);  


        setTimeout(function(){
            $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); })
        },5000);


        setTimeout(function(){
            $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); })
        },10000);


        setTimeout(function(){
            $(".math").each(function(index,value){$(this).find("span").last().css("color","#fff"); })
        },15000);
        
        setTimeout(function(){
            $("a img[src='http://js.tongji.linezing.com/stats.gif']").parent().css({"position":"absolute","left":"50%"});
        },300);
    });


    function loginbox(){
        var $logpop=$("#pop_win");
        $logpop.html('<iframe src="https://passport.csdn.net/account/loginbox?service=http://static.blog.csdn.net/callback.htm" frameborder="0" height="600" width="400" scrolling="no"></iframe>');


        $('#popup_mask').css({
            opacity: 0.5,
            width: $( document ).width() + 'px',
            height:  $( document ).height() + 'px'
        });
        $('#popup_mask').css("display","block");
 
        $logpop.css( {
            top: ($( window ).height() - $logpop.height())/ 2  + $( window 
       ).scrollTop() + 'px',
            left:($( window ).width() - $logpop.width())/ 2
        } );
 
        setTimeout( function () {
            $logpop.show();
            $logpop.css( {
                opacity: 1
            } );
        }, 200 );
 
        $('#popup_mask').unbind("click");
        $('#popup_mask').bind("click", function(){
            $('#popup_mask').hide();
            var $clopop = $("#pop_win");
            $("#common_ask_div_sc").css("display","none");
            $clopop.css( {
                opacity: 0
            } );
            setTimeout( function () {
                $clopop.hide();
            }, 350 );
            return false;
        });
    }   


</script>
 <script language="javascript" type="text/javascript" src="http://ads.csdn.net/js/async_new.js"></script>      








                        <div class="clear">
                        </div>
                    </div>                   
                
            </div>
0 0
原创粉丝点击