﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>语源科技BlogJava-GnillinG</title><link>http://www.blogjava.net/gnilling/</link><description>&amp;nbsp&amp;nbsp&amp;nbsp The more you share, the more you get</description><language>zh-cn</language><lastBuildDate>Sun, 26 Apr 2026 19:00:59 GMT</lastBuildDate><pubDate>Sun, 26 Apr 2026 19:00:59 GMT</pubDate><ttl>60</ttl><item><title>JavaScript进行GET和POST请求</title><link>http://www.blogjava.net/gnilling/archive/2009/03/02/257442.html</link><dc:creator>Albert Ling</dc:creator><author>Albert Ling</author><pubDate>Mon, 02 Mar 2009 15:43:00 GMT</pubDate><guid>http://www.blogjava.net/gnilling/archive/2009/03/02/257442.html</guid><wfw:comment>http://www.blogjava.net/gnilling/comments/257442.html</wfw:comment><comments>http://www.blogjava.net/gnilling/archive/2009/03/02/257442.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gnilling/comments/commentRss/257442.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gnilling/services/trackbacks/257442.html</trackback:ping><description><![CDATA[<span style="font-family: Times New Roman;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" /><!--[if gte mso 9]><![endif]-->
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
h1
{
mso-style-link:"标题 1 Char";
margin-right:0cm;
margin-left:0cm;
font-size:24.0pt;
font-family:宋体;}
span.1Char
{mso-style-name:"标题 1 Char";
mso-style-link:"标题 1";
font-family:宋体;
font-weight:bold;}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
<p>JavaScript<span style="font-family: 宋体;">进行</span>GET<span style="font-family: 宋体;">和</span>POST<span style="font-family: 宋体;">请求</span></p>
<p>Web<span style="font-family: 宋体;">上最常见的请求就是</span>GET<span style="font-family: 宋体;">请求</span>.<span style="font-family: 宋体;">每次在浏览器中输入</span>URL<span style="font-family: 宋体;">并打开也米纳市</span>,<span style="font-family: 宋体;">就是在向服务器发送一个</span>GET<span style="font-family: 宋体;">请求</span>.</p>
<p>GET<span style="font-family: 宋体;">请求：</span></p>
<p>GET<span style="font-family: 宋体;">请求的参数使用问号追加到</span>URL<span style="font-family: 宋体;">的结尾</span>,<span style="font-family: 宋体;">后米纳给这用</span>&amp;<span style="font-family: 宋体;">好连接起来的名称</span>/<span style="font-family: 宋体;">值</span>.<span style="font-family: 宋体;">例如</span>:</p>
<p>http://www.somewhere.com/page.php?name1=value1&amp;name2=value2&amp;name3=value3</p>
<p><span style="font-family: 宋体;">每个名称和值都是在编码后才能用在</span>URL<span style="font-family: 宋体;">中（在</span>javaScript<span style="font-family: 宋体;">中可以用</span>encodeURIComponent()<span style="font-family: 宋体;">进行编码）。</span>URL<span style="font-family: 宋体;">最大长度为</span>2048<span style="font-family: 宋体;">字符（</span>2KB<span style="font-family: 宋体;">）。问好后米纳的内容成为查询字符串，这些参数可以在服务器端的页面中读取。</span></p>
<p><span style="font-family: 宋体;">要用</span>XMLHTTP<span style="font-family: 宋体;">请求对象发送一个</span>GET<span style="font-family: 宋体;">请求。只需将</span>URL<span style="font-family: 宋体;">（包含所有的参数）传入</span>open()<span style="font-family: 宋体;">方法。同时第一个参数段设为</span>&#8221;get&#8221;:</p>
<p><span>oRequest.open(&#8220;get&#8221;,&nbsp;&#8220;http://www.somewhere.com/page.php?name=value&#8221;,
false);</span></p>
<p><span style="font-family: 宋体;">因为参数必须逐家到</span>URL<span style="font-family: 宋体;">的末尾，所以最好用一个函数来处理此细节：</span></p>
<p><span>Function
addURLParam(sURL, sParamName, sParamName){</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sURL += (sURL.indexOf(&#8220;?&#8221;) == -1 ? &#8220;?&#8221;
: &#8220;&amp;&#8221;);</span></p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sURL += encodeURIComponent(sParamName)
+ &#8220;=&#8221; + encodeURIComponent(sParamName);</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sURL;</p>
<p>}</p>
<p><span style="font-family: 宋体;">三个参数分别为：要添加的</span>URL<span style="font-family: 宋体;">，参数名称和参数值。</span></p>
<p>POST<span style="font-family: 宋体;">请求：</span></p>
<p>POST<span style="font-family: 宋体;">请求通常用于提交数据，比</span>GET<span style="font-family: 宋体;">请求可以发送更多的数据（大约</span>2GB<span style="font-family: 宋体;">）。</span></p>
<p><span style="font-family: 宋体;">构造</span>POST<span style="font-family: 宋体;">的请求参数的函数：</span></p>
<p><span>Function
addPostParam(sParams, sParamName, sParamValue){</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(sParams.length&gt;0){sParams += &#8220;&amp;&#8221;};</p>
<p><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return sParams
+encodeURIComponent(sParamName) + &#8220;=&#8221;</span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;+ encodeURIComponent(sParamName);</p>
<p>}</p>
<p><span style="font-family: 宋体;">接下来为了能使</span>POST<span style="font-family: 宋体;">请求的服务器端页面正确的解释有此函数构造的参数字符串，需要将</span>POST<span style="font-family: 宋体;">请求首部&#8220;</span>Content-Type<span style="font-family: 宋体;">&#8221;设置为&#8220;</span>application/x-www-urlencoded<span style="font-family: 宋体;">&#8221;，所以需要使用</span>setRequestHeader()<span style="font-family: 宋体;">方法设置这个首部：</span></p>
<p><span>var
sParams = &#8216; &#8216;;</span></p>
<p><span>sParams =
addPostParam();</span></p>
<p><span>oRequest.open(&#8220;post&#8221;,
&#8220;page.php&#8221;, false);</span></p>
<p><span>sRequest.setRequestHeader(&#8220;Content-Type&#8221;,
&#8220;application/x-www-form-urlencoded&#8221;);</span></p>
<p>sRequest.send(sParams);</p>
<p><span style="font-family: 宋体;">现在这个例子就可以像由浏览器中提交表单一样正常工作了。</span></p>
<h1 style="margin: 0cm 0cm 0.0001pt;"><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; font-weight: normal;">FORM</span><span style="font-size: 10.5pt; font-weight: normal;">中的</span><span style="font-size: 10.5pt; font-family: &quot;Calibri&quot;,&quot;sans-serif&quot;; font-weight: normal;">get
post</span><span style="font-size: 10.5pt; font-weight: normal;">方法区别</span></h1>
<p>Form<span style="font-family: 宋体;">中的</span>get<span style="font-family: 宋体;">和</span>post<span style="font-family: 宋体;">方法，在数据传输过程中分别对应了</span>HTTP<span style="font-family: 宋体;">协议中的</span>GET<span style="font-family: 宋体;">和</span>POST<span style="font-family: 宋体;">方法。二者主要区别如下：</span><span> <br />
1</span><span style="font-family: 宋体;">、</span>Get<span style="font-family: 宋体;">是用来从服务器上获得数据，而</span>Post<span style="font-family: 宋体;">是用来向服务器上传递数据。</span><span> <br />
2</span><span style="font-family: 宋体;">、</span> Get<span style="font-family: 宋体;">将表单中数据的按照</span>variable=value<span style="font-family: 宋体;">的形式，添加到</span>action<span style="font-family: 宋体;">所指向的</span>URL<span style="font-family: 宋体;">后面，并且两者使用</span>&#8220;?&#8221;<span style="font-family: 宋体;">连接，而各个变量之间使用</span> &#8220;&amp;&#8221;<span style="font-family: 宋体;">连接；</span>Post<span style="font-family: 宋体;">是将表单中的数据放在</span>form<span style="font-family: 宋体;">的数据体中，按照变量和值相对应的方式，传递到</span>action<span style="font-family: 宋体;">所指向</span>URL<span style="font-family: 宋体;">。</span><span> <br />
3</span><span style="font-family: 宋体;">、</span> Get<span style="font-family: 宋体;">是不安全的，因为在传输过程，数据被放在请求的</span>URL<span style="font-family: 宋体;">中，而如今现有的很多服务器、代理服务器或者用户代理都会将请求</span>URL<span style="font-family: 宋体;">记录到日志文件中，然后</span>
<span style="font-family: 宋体;">放在某个地方，这样就可能会有一些隐私的信息被第三方看到。另外，用户也可以在浏览器上直接看到提交的数据，一些系统内部消息将会一同显示在用户面前。</span> Post<span style="font-family: 宋体;">的所有操作对用户来说都是不可见的。</span><span> <br />
4</span><span style="font-family: 宋体;">、</span>Get<span style="font-family: 宋体;">传输的数据量小，这主要是因为受</span>URL<span style="font-family: 宋体;">长度限制；而</span>Post<span style="font-family: 宋体;">可以传输大量的数据，所以在上传文件只能使用</span>Post<span style="font-family: 宋体;">（当然还有一个原因，将在后面的提到）。</span><span> <br />
5</span><span style="font-family: 宋体;">、</span>Get<span style="font-family: 宋体;">限制</span>Form<span style="font-family: 宋体;">表单的数据集的值必须为</span>ASCII<span style="font-family: 宋体;">字符；而</span>Post<span style="font-family: 宋体;">支持整个</span>ISO10646<span style="font-family: 宋体;">字符集。</span><span> <br />
6</span><span style="font-family: 宋体;">、</span>Get<span style="font-family: 宋体;">是</span>Form<span style="font-family: 宋体;">的默认方法。</span>
</p>
</span>
<img src ="http://www.blogjava.net/gnilling/aggbug/257442.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gnilling/" target="_blank">Albert Ling</a> 2009-03-02 23:43 <a href="http://www.blogjava.net/gnilling/archive/2009/03/02/257442.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JavaScript---5种调用函数的方法</title><link>http://www.blogjava.net/gnilling/archive/2009/02/26/256889.html</link><dc:creator>Albert Ling</dc:creator><author>Albert Ling</author><pubDate>Thu, 26 Feb 2009 12:12:00 GMT</pubDate><guid>http://www.blogjava.net/gnilling/archive/2009/02/26/256889.html</guid><wfw:comment>http://www.blogjava.net/gnilling/comments/256889.html</wfw:comment><comments>http://www.blogjava.net/gnilling/archive/2009/02/26/256889.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gnilling/comments/commentRss/256889.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gnilling/services/trackbacks/256889.html</trackback:ping><description><![CDATA[<span style="font-family: Times New Roman;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
<p><span style="font-family: 宋体;">一次又一次的</span>,<span style="font-family: 宋体;">我发现</span>,<span style="font-family: 宋体;">那些有</span>bug<span style="font-family: 宋体;">的</span>Javascript<span style="font-family: 宋体;">代码是由于没有真正理解</span>Javascript<span style="font-family: 宋体;">函数是如何工作而导致的</span>(<span style="font-family: 宋体;">顺便说一下</span>,<span style="font-family: 宋体;">许多那样的代码是我写的</span>).JavaScript<span style="font-family: 宋体;">拥有函数式编程的特性</span>, <span style="font-family: 宋体;">当我们选择面对它的时候</span>,<span style="font-family: 宋体;">这将成为我们前进的阻碍</span><span>.<br />
</span><span style="font-family: 宋体;">作为初学者</span>,<span style="font-family: 宋体;">我们来测试五种函数调用的方法</span>,<span style="font-family: 宋体;">从表面来看我们会认为那些函数与</span>C#<span style="font-family: 宋体;">中函数的作用非常相似</span>,<span style="font-family: 宋体;">但是我们一会儿可以看到还是有非常重要的不同的地方的</span>,<span style="font-family: 宋体;">忽视这些差异无疑会导致难于跟踪的</span>bug<span style="font-family: 宋体;">。</span><span>.<br />
</span><span style="font-family: 宋体;">首先让我们创建一个简单的函数</span>,<span style="font-family: 宋体;">这个函数将在将在下文中使用</span>,<span style="font-family: 宋体;">这个函数仅仅返回当前的</span>this<span style="font-family: 宋体;">的值和两个提供的参数</span>.</p>
<p><span><br />
&lt;script type="text/</span>javascript<span>"&gt;<br />
<span style="color: windowtext; text-decoration: none;">function</span>
makeArray(arg1, arg2){<br />
&nbsp;&nbsp;&nbsp; return [ this, arg1, arg2 ];<br />
}<br />
&lt;/script&gt;<br />
<br />
</span><span style="font-family: 宋体;">最常用的方法</span>,<span style="font-family: 宋体;">但不幸的</span>,<span style="font-family: 宋体;">全局的函数调用</span><span><br />
</span><span style="font-family: 宋体;">当我们学习</span>Javascript<span style="font-family: 宋体;">时，我们了解到如何用上面示例中的语法来定义函数。</span><span><br />
,</span><span style="font-family: 宋体;">我们也知道调用这个函数非常的简单</span>,<span style="font-family: 宋体;">我们需要做的仅仅是</span><span>:<br />
makeArray('one', 'two');<br />
// =&gt; [ window, 'one', 'two' ]<br />
<br />
</span><span style="font-family: 宋体;">等一等</span>,<span style="font-family: 宋体;">那个</span>Window<span style="font-family: 宋体;">对象在这里干嘛呢</span>,<span style="font-family: 宋体;">为何</span>this<span style="font-family: 宋体;">的值是它呢</span>,<span style="font-family: 宋体;">如果你以前没有停下来思考这个问题</span>,<span style="font-family: 宋体;">那么请和我一起来分析吧</span><span>,<br />
</span><span style="font-family: 宋体;">在</span> Javascript<span style="font-family: 宋体;">里</span>,<span style="font-family: 宋体;">我没有指特定的浏览器</span>,<span style="font-family: 宋体;">有一个全局的对象</span>, <span style="font-family: 宋体;">那些看起来散落在你的脚本里的每一行代码</span>(<span style="font-family: 宋体;">例如在一个对象外的声明</span>)<span style="font-family: 宋体;">其实都被写在了一个全局对象的上下文里</span>.<span style="font-family: 宋体;">在我们的例子中</span>,<span style="font-family: 宋体;">其实那个</span>makeArray <span style="font-family: 宋体;">函数可以说不是一个松散的全局函数</span>,<span style="font-family: 宋体;">而是全局对象的一个方法</span>, <span style="font-family: 宋体;">让我们返回来看浏览器</span>,<span style="font-family: 宋体;">在这个环境里它的全局对象被映射到</span>window<span style="font-family: 宋体;">对象</span>.<span style="font-family: 宋体;">让我们来证明一下</span><span>:<br />
alert( typeof window.methodThatDoesntExist );<br />
// =&gt; undefined<br />
alert( typeof window.makeArray);<br />
// =&gt; <span style="color: windowtext; text-decoration: none;">function</span><br />
<br />
</span><span style="font-family: 宋体;">所有的这些意味着我们之前调用</span> makeArray<span style="font-family: 宋体;">的方法是和下面调用的方法一样的</span><span><br />
window.makeArray('one', 'two');<br />
// =&gt; [ window, 'one', 'two' ]<br />
</span><span style="font-family: 宋体;">我说最普遍的调用方法是不幸的是因为它导致我们声明的函数默认是全局的</span>.<span style="font-family: 宋体;">我们都知道全局成员不是编程的最佳实践</span>.<span style="font-family: 宋体;">这在</span>JavaScript<span style="font-family: 宋体;">里是特别的正确</span>,<span style="font-family: 宋体;">在</span>JavaScript<span style="font-family: 宋体;">中避免使用全局的成员</span>,<span style="font-family: 宋体;">你是不会为之后悔的</span>.</p>
<p>JavaScript<span style="font-family: 宋体;">函数调用规则</span><span>1 <br />
</span><span style="font-family: 宋体;">在没有通过明确所有者对象而直接调用的函数中，如</span>myFunction()<span style="font-family: 宋体;">，将导致</span>this<span style="font-family: 宋体;">的值成为默认对象（浏览器中的窗口）。</span></p>
<p><strong><span style="font-family: 宋体;"><span style="font-size: 14pt;"><span style="font-size: 12pt;">函数调用</span></span></span></strong><span><br />
</span><span style="font-family: 宋体;">让我们现在创建一个简单的对象</span>,<span style="font-family: 宋体;">使用</span> makeArray<span style="font-family: 宋体;">函数作为它的一个方法</span>,<span style="font-family: 宋体;">我们将使用</span><span style="color: windowtext; text-decoration: none;">js</span>on<span style="font-family: 宋体;">的方式来声明一个对象</span>,<span style="font-family: 宋体;">我们也来调用这个方法</span><span><br />
//creating the <span style="color: windowtext; text-decoration: none;">object</span><br />
var arrayMaker = {<br />
&nbsp;&nbsp;&nbsp; someProperty: 'some value here',<br />
&nbsp;&nbsp;&nbsp; make: makeArray<br />
};<br />
<br />
//invoke the make() method<br />
arrayMaker.make('one', 'two');<br />
// =&gt; [ arrayMaker, 'one', 'two' ]<br />
// alternative syntax, using square brackets<br />
arrayMaker['make']('one', 'two');<br />
// =&gt; [ arrayMaker, 'one', 'two' ]<br />
<br />
</span><span style="font-family: 宋体;">看</span> <span style="font-family: 宋体;">到这里的不同了吧</span>,this<span style="font-family: 宋体;">的值变成了对象本身</span>.<span style="font-family: 宋体;">你可能会疑问原始的函数定义并没有改变</span>,<span style="font-family: 宋体;">为何它不是</span>window<span style="font-family: 宋体;">了呢</span>.<span style="font-family: 宋体;">好吧</span>,<span style="font-family: 宋体;">这就是函数在</span> JSavacript<span style="font-family: 宋体;">中传递的方式</span>,<span style="font-family: 宋体;">函数在</span>JavaScript<span style="font-family: 宋体;">里是一个标准的数据类型</span>,<span style="font-family: 宋体;">确切的说是一个对象</span>.<span style="font-family: 宋体;">你可以传递它们或者复制他们</span>.<span style="font-family: 宋体;">就好像整个函</span>
<span style="font-family: 宋体;">数连带参数列表和函数体都被复制</span>,<span style="font-family: 宋体;">且被分配给了</span> arrayMaker<span style="font-family: 宋体;">里的属性</span>make,<span style="font-family: 宋体;">那就好像这样定义一个</span><span> arrayMaker:<br />
var arrayMaker = {<br />
&nbsp;&nbsp;&nbsp; someProperty: 'some value here',<br />
&nbsp;&nbsp;&nbsp; make: <span style="color: windowtext; text-decoration: none;">function</span> (arg1, arg2) {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return [ this, arg1, arg2 ];<br />
&nbsp;&nbsp;&nbsp; }<br />
};<br />
<br />
JavaScript</span><span style="font-family: 宋体;">函数调用规则</span>2 <span style="font-family: 宋体;">在一个使用方法调用语法</span>,<span style="font-family: 宋体;">像</span> obj.myFunction()<span style="font-family: 宋体;">或者</span> obj['myFunction'](),<span style="font-family: 宋体;">这时</span>this<span style="font-family: 宋体;">的值为</span><span>obj<br />
<br />
</span><span style="font-family: 宋体;">这是事件处理代码中</span>bug<span style="font-family: 宋体;">的主要源头</span>,<span style="font-family: 宋体;">看看这些例子</span><span><br />
&lt;input type="button" value="Button 1"
id="btn1"&nbsp; /&gt;<br />
&lt;input type="button" value="Button 2"
id="btn2"&nbsp; /&gt;<br />
&lt;input type="button" value="Button 3"
id="btn3"&nbsp; onclick="buttonClicked();"/&gt;<br />
<br />
&lt;script type="text/<span style="color: windowtext; text-decoration: none;">javascript</span>"&gt;<br />
<span style="color: windowtext; text-decoration: none;">function</span>
buttonClicked(){<br />
&nbsp;&nbsp;&nbsp; var text = (this === window) ? 'window' : this.id;<br />
&nbsp;&nbsp;&nbsp; alert( text );<br />
}<br />
var button1 = document.getElementById('btn1');<br />
var button2 = document.getElementById('btn2');<br />
<br />
button1.onclick = buttonClicked;<br />
button2.onclick = <span style="color: windowtext; text-decoration: none;">function</span>(){&nbsp;&nbsp; buttonClicked();&nbsp;&nbsp; };<br />
&lt;/script&gt;<br />
<br />
</span><span style="font-family: 宋体;">点</span> <span style="font-family: 宋体;">击第一个按钮将会显示</span>&#8221;btn&#8221;<span style="font-family: 宋体;">因为它是一个方法调用</span>,this<span style="font-family: 宋体;">为所属的对象</span>(<span style="font-family: 宋体;">按钮元素</span>) <span style="font-family: 宋体;">点击第二个按钮将显示</span>&#8221;window&#8221;<span style="font-family: 宋体;">因为</span><span>
buttonClicked</span><span style="font-family: 宋体;">是被直接调用的</span>(<span style="font-family: 宋体;">不像</span> obj.buttonClicked().) <span style="font-family: 宋体;">这和我们第三个按钮</span>,<span style="font-family: 宋体;">将事件处理函数直接放在标签里是一样的</span>.<span style="font-family: 宋体;">所以点击第三个按钮的结果是和第二个一样的</span><span>.<br />
</span><span style="font-family: 宋体;">使用像</span>jQuery<span style="font-family: 宋体;">的</span>JS<span style="font-family: 宋体;">库有这样的优点</span>,<span style="font-family: 宋体;">当在</span>jQuery<span style="font-family: 宋体;">里定义了一个事件处理函数</span>,JS<span style="font-family: 宋体;">库会帮助重写</span>this<span style="font-family: 宋体;">的值以保证它包含了当前事件源元素的引用</span><span>,<br />
<br />
//</span><span style="font-family: 宋体;">使用</span><span>jQuery<br />
$('#btn1').click( <span style="color: windowtext; text-decoration: none;">function</span>() {<br />
&nbsp;&nbsp;&nbsp; alert( this.id ); // jQuery ensures 'this' will be the
button<br />
});<br />
<br />
jQuery</span><span style="font-family: 宋体;">是如何重载</span>this<span style="font-family: 宋体;">的值的呢</span>?<span style="font-family: 宋体;">继续阅读</span></p>
<p><span>
</span><span style="font-family: 宋体;">另外两个</span>:apply()<span style="font-family: 宋体;">和</span><span>call()<br />
</span><span style="font-family: 宋体;">你越</span> <span style="font-family: 宋体;">多的使用</span>JavaScript<span style="font-family: 宋体;">的函数</span>,<span style="font-family: 宋体;">你就越多的发现你需要传递函数并在不同的上下文里调用他们</span>,<span style="font-family: 宋体;">就像</span>jQuery<span style="font-family: 宋体;">在事件处理函数里所做的一样</span>,<span style="font-family: 宋体;">你往往经</span>
<span style="font-family: 宋体;">常需要重置</span>this<span style="font-family: 宋体;">的值</span>.<span style="font-family: 宋体;">记住我告诉你的</span>,<span style="font-family: 宋体;">在</span>Javascript<span style="font-family: 宋体;">中函数也是对象</span>,<span style="font-family: 宋体;">函数对象包含一些预定义的方法</span>,<span style="font-family: 宋体;">其中有两个便是</span>apply()<span style="font-family: 宋体;">和</span> call(),<span style="font-family: 宋体;">我们可以使用它们来对</span>this<span style="font-family: 宋体;">进行重置</span><span>.<br />
var gasGuzzler = { year: 2008, model: 'Dodge Bailout' };<br />
makeArray.apply( gasGuzzler, [ 'one', 'two' ] );<br />
// =&gt; [ gasGuzzler, 'one' , 'two' ]<br />
makeArray.call( gasGuzzler,&nbsp; 'one', 'two' );<br />
// =&gt; [ gasGuzzler, 'one' , 'two' ]<br />
</span><span style="font-family: 宋体;">这两个方法是相似的</span>,<span style="font-family: 宋体;">不同的是后面的参数的不同</span>,Function.apply()<span style="font-family: 宋体;">是使用一个数组来传递给函数的</span>,<span style="font-family: 宋体;">而</span>Function.call()<span style="font-family: 宋体;">是将这些参数独立传递的</span>,<span style="font-family: 宋体;">在实践中你会发现</span>apply()<span style="font-family: 宋体;">在大多数情况下更方便</span><span>.<br />
<br />
JavaScript</span><span style="font-family: 宋体;">函数调用规则</span>3 <span style="font-family: 宋体;">如果我们想在不复制函数到一个方法而想重载</span>this<span style="font-family: 宋体;">的值的时候</span>,<span style="font-family: 宋体;">我们可以使用</span> myFunction.apply( obj ) <span style="font-family: 宋体;">或</span><span> myFunction.call(obj).<br />
<br />
</span><strong><span style="font-family: 宋体;"><span style="font-size: 14pt;"><span style="font-size: 12pt;"><strong><span style="font-family: 宋体;"><span style="font-size: 18pt;"><strong><span style="font-family: 宋体;"><span style="font-size: 14pt;"><span style="font-size: 12pt;"><strong><span style="font-family: 宋体;">构造器</span></strong></span></span></span></strong></span></span></strong></span></span></span></strong><span><br />
</span><span style="font-family: 宋体;">我不想深入研究在</span>Javascript<span style="font-family: 宋体;">中类型的定义</span>,<span style="font-family: 宋体;">但是在此刻我们需要知道在</span>Javascript<span style="font-family: 宋体;">中没有类</span>,<span style="font-family: 宋体;">而且任何一个自定义的类型需要一个初始化函数</span>,<span style="font-family: 宋体;">使用原型对象</span>(<span style="font-family: 宋体;">作为初始化函数的一个属性</span>)<span style="font-family: 宋体;">定义你的类型也是一个不错的主义</span>,<span style="font-family: 宋体;">让我们来创建一个简单的类型</span><span><br />
//</span><span style="font-family: 宋体;">声明一个构造器</span><span><br />
<span style="color: windowtext; text-decoration: none;">function</span>
ArrayMaker(arg1, arg2) {<br />
&nbsp;&nbsp;&nbsp; this.someProperty = 'whatever';<br />
&nbsp;&nbsp;&nbsp; this.theArray = [ this, arg1, arg2 ];<br />
}<br />
// </span><span style="font-family: 宋体;">声明实例化方法</span><span><br />
ArrayMaker.prototype = {<br />
&nbsp;&nbsp;&nbsp; someMethod: <span style="color: windowtext; text-decoration: none;">function</span>
() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; alert( 'someMethod called');<br />
&nbsp;&nbsp;&nbsp; },<br />
&nbsp;&nbsp;&nbsp; getArray: <span style="color: windowtext; text-decoration: none;">function</span>
() {<br />
&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; return this.theArray;<br />
&nbsp;&nbsp;&nbsp; }<br />
};<br />
<br />
var am = new ArrayMaker( 'one', 'two' );<br />
var other = new ArrayMaker( 'first', 'second' );<br />
<br />
am.getArray();<br />
// =&gt; [ am, 'one' , 'two' ]<br />
<br />
</span><span style="font-family: 宋体;">一个非常重要并值得注意的是出现在函数调用前面的</span>new<span style="font-family: 宋体;">运算符</span>,<span style="font-family: 宋体;">没有那个</span>,<span style="font-family: 宋体;">你的函数就像全局函数一样</span>,<span style="font-family: 宋体;">且我们创建的那些属性都将是创建在全局对象上</span> (window),<span style="font-family: 宋体;">而你并不想那样</span>,<span style="font-family: 宋体;">另一个话题是</span>,<span style="font-family: 宋体;">因为在你的构造器里没有返回值</span>,<span style="font-family: 宋体;">所以如果你忘记使用</span>new<span style="font-family: 宋体;">运算符</span>,<span style="font-family: 宋体;">将导致你的一些变量被赋值为</span> undefined.<span style="font-family: 宋体;">因为这个原因</span>,<span style="font-family: 宋体;">构造器函数以大写字母开头是一个好的习惯</span>,<span style="font-family: 宋体;">这可以作为一个提醒</span>,<span style="font-family: 宋体;">让你在调用的时候不要忘记前面的</span>new<span style="font-family: 宋体;">运算符</span><span>.<br />
</span><span style="font-family: 宋体;">带着这样的小心</span>,<span style="font-family: 宋体;">初始化函数里的代码和你在其他语言里写的初始化函数是相似的</span>.this<span style="font-family: 宋体;">的值将是你将创建的对象</span><span>.<br />
Javascript</span><span style="font-family: 宋体;">函数调用规则</span>4 <span style="font-family: 宋体;">当你将函数用作初始化函数的时候</span>,<span style="font-family: 宋体;">像</span>MyFunction(),Javascript<span style="font-family: 宋体;">的运行时将把</span>this<span style="font-family: 宋体;">的值指定为新建的对象</span>.</p>
<p><strong><span style="font-family: 宋体;">总结</span></strong><span><br />
</span><span style="font-family: 宋体;">我希望理解各种函数调用方式的不同会使你的</span>Sjavacript<span style="font-family: 宋体;">代码远离</span>bugs,<span style="font-family: 宋体;">有些这样的</span>bug<span style="font-family: 宋体;">会确保你总是知道</span>this<span style="font-family: 宋体;">的值是避免他们第一步</span></p>
</span>
<img src ="http://www.blogjava.net/gnilling/aggbug/256889.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gnilling/" target="_blank">Albert Ling</a> 2009-02-26 20:12 <a href="http://www.blogjava.net/gnilling/archive/2009/02/26/256889.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>弄清Java中的IO</title><link>http://www.blogjava.net/gnilling/archive/2009/02/24/256506.html</link><dc:creator>Albert Ling</dc:creator><author>Albert Ling</author><pubDate>Tue, 24 Feb 2009 12:29:00 GMT</pubDate><guid>http://www.blogjava.net/gnilling/archive/2009/02/24/256506.html</guid><wfw:comment>http://www.blogjava.net/gnilling/comments/256506.html</wfw:comment><comments>http://www.blogjava.net/gnilling/archive/2009/02/24/256506.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gnilling/comments/commentRss/256506.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gnilling/services/trackbacks/256506.html</trackback:ping><description><![CDATA[<span style="font-family: Times New Roman;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
<p>&nbsp;&nbsp;&nbsp; Java<span style="font-family: 宋体;">的核心库</span>java.io<span style="font-family: 宋体;">提供了全面的</span>IO<span style="font-family: 宋体;">接口，包括：文件读写，标准设备输出等等。</span>Java<span style="font-family: 宋体;">中</span>IO<span style="font-family: 宋体;">是以流为基础进行输入输出的，所有数据被串行化写入输出流，或者从输入流读入。在具体使用中很多初学者对</span>Java.io<span style="font-family: 宋体;">包的使用非常含糊，本文将详细解说关于</span>Java.io<span style="font-family: 宋体;">的使用。</span></p>
<p><span>-----------------------------------------------------<br />
</span><span style="font-family: 宋体;">　　<strong>一．</strong></span><strong> Input<span style="font-family: 宋体;">和</span></strong><span><strong>Output</strong> <br />
&nbsp;&nbsp;&nbsp;
</span>stream<span style="font-family: 宋体;">代表的是任何有能力产出数据的数据源，或是任何有能力接收数据的接收源。在</span>Java<span style="font-family: 宋体;">的</span>IO<span style="font-family: 宋体;">系统中，所有的</span>stream<span style="font-family: 宋体;">（包括</span>Input<span style="font-family: 宋体;">和</span>Out stream<span style="font-family: 宋体;">）都包括两种类型：</span><span><br />
&nbsp;
</span>1.1 <span style="font-family: 宋体;">以字节为导向的</span><span>stream<br />
</span><span style="font-family: 宋体;">　　以字节为导向的</span>stream<span style="font-family: 宋体;">，表示以字节为单位从</span>stream<span style="font-family: 宋体;">中读取或往</span>stream<span style="font-family: 宋体;">中写入信息。以字节为导向的</span>stream<span style="font-family: 宋体;">包括下面几种类型：</span><span><br />
</span><span>input<br />
</span>stream<span style="font-family: 宋体;">：</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) ByteArrayInputStream<span style="font-family: 宋体;">：把内存中的一个缓冲区作为</span>InputStream<span style="font-family: 宋体;">使用</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) StringBufferInputStream<span style="font-family: 宋体;">：把一个</span>String<span style="font-family: 宋体;">对象作为</span><span>InputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) FileInputStream<span style="font-family: 宋体;">：把一个文件作为</span>InputStream<span style="font-family: 宋体;">，实现对文件的读取操作</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) PipedInputStream<span style="font-family: 宋体;">：实现了</span>pipe<span style="font-family: 宋体;">的概念，主要在线程中使用</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>5) SequenceInputStream<span style="font-family: 宋体;">：把多个</span>InputStream<span style="font-family: 宋体;">合并为一个</span><span>InputStream<br />
</span><span>Out<br />
</span><span>stream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) ByteArrayOutputStream<span style="font-family: 宋体;">：把信息存入内存中的一个缓冲区中</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) FileOutputStream<span style="font-family: 宋体;">：把信息存入文件中</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) PipedOutputStream<span style="font-family: 宋体;">：实现了</span>pipe<span style="font-family: 宋体;">的概念，主要在线程中使用</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) SequenceOutputStream<span style="font-family: 宋体;">：把多个</span>OutStream<span style="font-family: 宋体;">合并为一个</span><span>OutStream<br />
&nbsp;
</span>1.2 <span style="font-family: 宋体;">以</span>Unicode<span style="font-family: 宋体;">字符为导向的</span><span>stream<br />
</span><span style="font-family: 宋体;">　　以</span>Unicode<span style="font-family: 宋体;">字符为导向的</span>stream<span style="font-family: 宋体;">，表示以</span>Unicode<span style="font-family: 宋体;">字符为单位从</span>stream<span style="font-family: 宋体;">中读取或往</span>stream<span style="font-family: 宋体;">中写入信息。以</span>Unicode<span style="font-family: 宋体;">字符为导向的</span>stream<span style="font-family: 宋体;">包括下面几种类型：</span><span><br />
</span><span>Input<br />
</span><span>Stream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) CharArrayReader<span style="font-family: 宋体;">：与</span>ByteArrayInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) StringReader<span style="font-family: 宋体;">：与</span>StringBufferInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) FileReader<span style="font-family: 宋体;">：与</span>FileInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) PipedReader<span style="font-family: 宋体;">：与</span>PipedInputStream<span style="font-family: 宋体;">对应</span><span><br />
</span><span>Out<br />
</span><span>Stream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) CharArrayWrite<span style="font-family: 宋体;">：与</span>ByteArrayOutputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) StringWrite<span style="font-family: 宋体;">：无与之对应的以字节为导向的</span><span>stream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) FileWrite<span style="font-family: 宋体;">：与</span>FileOutputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) PipedWrite<span style="font-family: 宋体;">：与</span>PipedOutputStream<span style="font-family: 宋体;">对应</span><span><br />
</span> <span style="font-family: 宋体;">　&nbsp; 以字符为导向的</span>stream<span style="font-family: 宋体;">基本上对有与之相对应的以字节为导向的</span>stream<span style="font-family: 宋体;">。两个对应类实现的功能相同，字是在操作时的导向不同。如</span> CharArrayReader<span style="font-family: 宋体;">：和</span>ByteArrayInputStream<span style="font-family: 宋体;">的作用都是把内存中的一个缓冲区作为</span>InputStream<span style="font-family: 宋体;">使用，所不同的</span>
<span style="font-family: 宋体;">是前者每次从内存中读取一个字节的信息，而后者每次从内存中读取一个字符。</span><span><br />
&nbsp;
</span>1.3 <span style="font-family: 宋体;">两种不现导向的</span>stream<span style="font-family: 宋体;">之间的转换</span><span><br />
&nbsp;&nbsp;&nbsp;
</span>InputStreamReader<span style="font-family: 宋体;">和</span>OutputStreamReader<span style="font-family: 宋体;">：把一个以字节为导向的</span>stream<span style="font-family: 宋体;">转换成一个以字符为导向的</span>stream<span style="font-family: 宋体;">。</span></p>
<p>--------------------------------------------------<br />
&nbsp;&nbsp;&nbsp; <strong>二</strong><strong>. stream<span style="font-family: 宋体;">添加属性</span></strong><span><br />
&nbsp;
</span>2.1 &#8220;<span style="font-family: 宋体;">为</span>stream<span style="font-family: 宋体;">添加属性</span>&#8221;<span style="font-family: 宋体;">的作用</span><span><br />
</span><span style="font-family: 宋体;">　　运用上面介绍的</span>Java<span style="font-family: 宋体;">中操作</span>IO<span style="font-family: 宋体;">的</span>API<span style="font-family: 宋体;">，我们就可完成我们想完成的任何操作了。但通过</span>FilterInputStream<span style="font-family: 宋体;">和</span>FilterOutStream<span style="font-family: 宋体;">的子类，我们可以为</span>stream<span style="font-family: 宋体;">添加属性。下面以一个例子来说明这种功能的作用。</span><span><br />
</span><span style="font-family: 宋体;">　　如果我们要往一个文件中写入数据，我们可以这样操作：</span><span><br />
FileOutStream fs = new FileOutStream(&#8220;test.txt&#8221;);<br />
</span> <span style="font-family: 宋体;">　&nbsp; 然后就可以通过产生的</span>fs<span style="font-family: 宋体;">对象调用</span>write()<span style="font-family: 宋体;">函数来往</span>test.txt<span style="font-family: 宋体;">文件中写入数据了。但是，如果我们想实现</span>&#8220;<span style="font-family: 宋体;">先把要写入文件的数据先缓存到内存</span>
<span style="font-family: 宋体;">中，再把缓存中的数据写入文件中</span>&#8221;<span style="font-family: 宋体;">的功能时，上面的</span>API<span style="font-family: 宋体;">就没有一个能满足我们的需求了。但是通过</span>FilterInputStream<span style="font-family: 宋体;">和</span> FilterOutStream<span style="font-family: 宋体;">的子类，为</span>FileOutStream<span style="font-family: 宋体;">添加我们所需要的功能。</span><span><br />
&nbsp;
</span>2.2 FilterInputStream<span style="font-family: 宋体;">的各种类型</span><span><br />
&nbsp;&nbsp;&nbsp;
</span>2.2.1 <span style="font-family: 宋体;">用于封装以字节为导向的</span><span>InputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) DataInputStream<span style="font-family: 宋体;">：从</span>stream<span style="font-family: 宋体;">中读取基本类型（</span>int<span style="font-family: 宋体;">、</span>char<span style="font-family: 宋体;">等）数据。</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) BufferedInputStream<span style="font-family: 宋体;">：使用缓冲区</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) LineNumberInputStream<span style="font-family: 宋体;">：会记录</span>input stream<span style="font-family: 宋体;">内的行数，然后可以调用</span>getLineNumber()<span style="font-family: 宋体;">和</span><span>setLineNumber(int)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) PushbackInputStream<span style="font-family: 宋体;">：很少用到，一般用于编译器开发</span><span><br />
&nbsp;&nbsp;&nbsp;
</span>2.2.2 <span style="font-family: 宋体;">用于封装以字符为导向的</span><span>InputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) <span style="font-family: 宋体;">没有与</span>DataInputStream<span style="font-family: 宋体;">对应的类。除非在要使用</span>readLine()<span style="font-family: 宋体;">时改用</span>BufferedReader<span style="font-family: 宋体;">，否则使用</span><span>DataInputStream<br />
&nbsp;&nbsp; &nbsp;&nbsp;
</span>2) BufferedReader<span style="font-family: 宋体;">：与</span>BufferedInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp; &nbsp;&nbsp;
</span>3) LineNumberReader<span style="font-family: 宋体;">：与</span>LineNumberInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>4) PushBackReader<span style="font-family: 宋体;">：与</span>PushbackInputStream<span style="font-family: 宋体;">对应</span><span><br />
&nbsp;
</span>2.3 FilterOutStream<span style="font-family: 宋体;">的各种类型</span><span><br />
&nbsp;&nbsp;&nbsp;
</span>2.2.3 <span style="font-family: 宋体;">用于封装以字节为导向的</span><span>OutputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) DataIOutStream<span style="font-family: 宋体;">：往</span>stream<span style="font-family: 宋体;">中输出基本类型（</span>int<span style="font-family: 宋体;">、</span>char<span style="font-family: 宋体;">等）数据。</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) BufferedOutStream<span style="font-family: 宋体;">：使用缓冲区</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) PrintStream<span style="font-family: 宋体;">：产生格式化输出</span><span><br />
&nbsp;&nbsp;&nbsp;
</span>2.2.4 <span style="font-family: 宋体;">用于封装以字符为导向的</span><span>OutputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) BufferedWrite<span style="font-family: 宋体;">：与对应</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) PrintWrite<span style="font-family: 宋体;">：与对应</span></p>
<p>--------------------------------------------------<br />
</p>
<p><span>&nbsp;&nbsp;&nbsp;
</span><span><strong>三. RandomAccessFile</strong><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>1) <span style="font-family: 宋体;">可通过</span>RandomAccessFile<span style="font-family: 宋体;">对象完成对文件的读写操作</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>2) <span style="font-family: 宋体;">在产生一个对象时，可指明要打开的文件的性质：</span>r<span style="font-family: 宋体;">，只读；</span>w<span style="font-family: 宋体;">，只写；</span>rw<span style="font-family: 宋体;">可读写</span><span><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
</span>3) <span style="font-family: 宋体;">可以直接跳到文件中指定的位置</span></p>
</span>
<img src ="http://www.blogjava.net/gnilling/aggbug/256506.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gnilling/" target="_blank">Albert Ling</a> 2009-02-24 20:29 <a href="http://www.blogjava.net/gnilling/archive/2009/02/24/256506.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java IO 包中的Decorator模式</title><link>http://www.blogjava.net/gnilling/archive/2009/02/23/256337.html</link><dc:creator>Albert Ling</dc:creator><author>Albert Ling</author><pubDate>Mon, 23 Feb 2009 12:45:00 GMT</pubDate><guid>http://www.blogjava.net/gnilling/archive/2009/02/23/256337.html</guid><wfw:comment>http://www.blogjava.net/gnilling/comments/256337.html</wfw:comment><comments>http://www.blogjava.net/gnilling/archive/2009/02/23/256337.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gnilling/comments/commentRss/256337.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gnilling/services/trackbacks/256337.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: Normal07.8 磅02falsefalsefalseEN-USZH-CNX-NONE/* Style Definitions */table.MsoNormalTable{mso-style-parent:"";font-size:10.5pt;font-family:"Calibri","sans-serif"...&nbsp;&nbsp;<a href='http://www.blogjava.net/gnilling/archive/2009/02/23/256337.html'>阅读全文</a><img src ="http://www.blogjava.net/gnilling/aggbug/256337.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gnilling/" target="_blank">Albert Ling</a> 2009-02-23 20:45 <a href="http://www.blogjava.net/gnilling/archive/2009/02/23/256337.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>对象的序列化和反序列化</title><link>http://www.blogjava.net/gnilling/archive/2009/02/22/256133.html</link><dc:creator>Albert Ling</dc:creator><author>Albert Ling</author><pubDate>Sun, 22 Feb 2009 15:07:00 GMT</pubDate><guid>http://www.blogjava.net/gnilling/archive/2009/02/22/256133.html</guid><wfw:comment>http://www.blogjava.net/gnilling/comments/256133.html</wfw:comment><comments>http://www.blogjava.net/gnilling/archive/2009/02/22/256133.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/gnilling/comments/commentRss/256133.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/gnilling/services/trackbacks/256133.html</trackback:ping><description><![CDATA[<span style="font-family: Times New Roman;">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:DrawingGridVerticalSpacing>7.8 磅</w:DrawingGridVerticalSpacing>
<w:DisplayHorizontalDrawingGridEvery>0</w:DisplayHorizontalDrawingGridEvery>
<w:DisplayVerticalDrawingGridEvery>2</w:DisplayVerticalDrawingGridEvery>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>ZH-CN</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:SpaceForUL/>
<w:BalanceSingleByteDoubleByteWidth/>
<w:DoNotLeaveBackslashAlone/>
<w:ULTrailSpace/>
<w:DoNotExpandShiftReturn/>
<w:AdjustLineHeightInTable/>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:DontVertAlignCellWithSp/>
<w:DontBreakConstrainedForcedTables/>
<w:DontVertAlignInTxbx/>
<w:Word11KerningPairs/>
<w:CachedColBalance/>
<w:UseFELayout/>
</w:Compatibility>
<w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel>
<m:mathPr>
<m:mathFont m:val="Cambria Math" />
<m:brkBin m:val="before" />
<m:brkBinSub m:val="--" />
<m:smallFrac m:val="off" />
<m:dispDef/>
<m:lMargin m:val="0" />
<m:rMargin m:val="0" />
<m:defJc m:val="centerGroup" />
<m:wrapIndent m:val="1440" />
<m:intLim m:val="subSup" />
<m:naryLim m:val="undOvr" />
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles deflockedstate="false" defunhidewhenused="true" defsemihidden="true" defqformat="false" defpriority="99" latentstylecount="267">
<w:LsdException locked="false" priority="0" semihidden="false" unhidewhenused="false" qformat="true" name="Normal" />
<w:LsdException locked="false" priority="9" semihidden="false" unhidewhenused="false" qformat="true" name="heading 1" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 2" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 3" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 4" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 5" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 6" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 7" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 8" />
<w:LsdException locked="false" priority="9" qformat="true" name="heading 9" />
<w:LsdException locked="false" priority="39" name="toc 1" />
<w:LsdException locked="false" priority="39" name="toc 2" />
<w:LsdException locked="false" priority="39" name="toc 3" />
<w:LsdException locked="false" priority="39" name="toc 4" />
<w:LsdException locked="false" priority="39" name="toc 5" />
<w:LsdException locked="false" priority="39" name="toc 6" />
<w:LsdException locked="false" priority="39" name="toc 7" />
<w:LsdException locked="false" priority="39" name="toc 8" />
<w:LsdException locked="false" priority="39" name="toc 9" />
<w:LsdException locked="false" priority="35" qformat="true" name="caption" />
<w:LsdException locked="false" priority="10" semihidden="false" unhidewhenused="false" qformat="true" name="Title" />
<w:LsdException locked="false" priority="1" name="Default Paragraph Font" />
<w:LsdException locked="false" priority="11" semihidden="false" unhidewhenused="false" qformat="true" name="Subtitle" />
<w:LsdException locked="false" priority="22" semihidden="false" unhidewhenused="false" qformat="true" name="Strong" />
<w:LsdException locked="false" priority="20" semihidden="false" unhidewhenused="false" qformat="true" name="Emphasis" />
<w:LsdException locked="false" priority="59" semihidden="false" unhidewhenused="false" name="Table Grid" />
<w:LsdException locked="false" unhidewhenused="false" name="Placeholder Text" />
<w:LsdException locked="false" priority="1" semihidden="false" unhidewhenused="false" qformat="true" name="No Spacing" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 1" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 1" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 1" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 1" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 1" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 1" />
<w:LsdException locked="false" unhidewhenused="false" name="Revision" />
<w:LsdException locked="false" priority="34" semihidden="false" unhidewhenused="false" qformat="true" name="List Paragraph" />
<w:LsdException locked="false" priority="29" semihidden="false" unhidewhenused="false" qformat="true" name="Quote" />
<w:LsdException locked="false" priority="30" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Quote" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 1" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 1" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 1" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 1" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 1" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 1" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 1" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 1" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 2" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 2" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 2" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 2" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 2" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 2" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 2" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 2" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 2" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 2" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 2" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 2" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 2" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 2" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 3" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 3" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 3" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 3" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 3" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 3" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 3" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 3" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 3" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 3" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 3" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 3" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 3" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 3" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 4" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 4" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 4" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 4" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 4" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 4" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 4" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 4" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 4" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 4" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 4" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 4" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 4" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 4" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 5" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 5" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 5" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 5" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 5" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 5" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 5" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 5" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 5" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 5" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 5" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 5" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 5" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 5" />
<w:LsdException locked="false" priority="60" semihidden="false" unhidewhenused="false" name="Light Shading Accent 6" />
<w:LsdException locked="false" priority="61" semihidden="false" unhidewhenused="false" name="Light List Accent 6" />
<w:LsdException locked="false" priority="62" semihidden="false" unhidewhenused="false" name="Light Grid Accent 6" />
<w:LsdException locked="false" priority="63" semihidden="false" unhidewhenused="false" name="Medium Shading 1 Accent 6" />
<w:LsdException locked="false" priority="64" semihidden="false" unhidewhenused="false" name="Medium Shading 2 Accent 6" />
<w:LsdException locked="false" priority="65" semihidden="false" unhidewhenused="false" name="Medium List 1 Accent 6" />
<w:LsdException locked="false" priority="66" semihidden="false" unhidewhenused="false" name="Medium List 2 Accent 6" />
<w:LsdException locked="false" priority="67" semihidden="false" unhidewhenused="false" name="Medium Grid 1 Accent 6" />
<w:LsdException locked="false" priority="68" semihidden="false" unhidewhenused="false" name="Medium Grid 2 Accent 6" />
<w:LsdException locked="false" priority="69" semihidden="false" unhidewhenused="false" name="Medium Grid 3 Accent 6" />
<w:LsdException locked="false" priority="70" semihidden="false" unhidewhenused="false" name="Dark List Accent 6" />
<w:LsdException locked="false" priority="71" semihidden="false" unhidewhenused="false" name="Colorful Shading Accent 6" />
<w:LsdException locked="false" priority="72" semihidden="false" unhidewhenused="false" name="Colorful List Accent 6" />
<w:LsdException locked="false" priority="73" semihidden="false" unhidewhenused="false" name="Colorful Grid Accent 6" />
<w:LsdException locked="false" priority="19" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Emphasis" />
<w:LsdException locked="false" priority="21" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Emphasis" />
<w:LsdException locked="false" priority="31" semihidden="false" unhidewhenused="false" qformat="true" name="Subtle Reference" />
<w:LsdException locked="false" priority="32" semihidden="false" unhidewhenused="false" qformat="true" name="Intense Reference" />
<w:LsdException locked="false" priority="33" semihidden="false" unhidewhenused="false" qformat="true" name="Book Title" />
<w:LsdException locked="false" priority="37" name="Bibliography" />
<w:LsdException locked="false" priority="39" qformat="true" name="TOC Heading" />
</w:LatentStyles>
</xml><![endif]--><style>
<!-- /* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-alt:SimSun;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:1;
mso-generic-font-family:roman;
mso-font-format:other;
mso-font-pitch:variable;
mso-font-signature:0 0 0 0 0 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-1610611985 1073750139 0 0 159 0;}
@font-face
{font-family:"\@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;
mso-font-charset:134;
mso-generic-font-family:auto;
mso-font-pitch:variable;
mso-font-signature:3 680460288 22 0 262145 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
mso-pagination:none;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:宋体;
mso-fareast-theme-font:minor-fareast;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;
mso-font-kerning:1.0pt;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
mso-style-priority:99;
color:purple;
mso-themecolor:followedhyperlink;
text-decoration:underline;
text-underline:single;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
/* Page Definitions */
@page
{mso-page-border-surround-header:no;
mso-page-border-surround-footer:no;}
@page Section1
{size:595.3pt 841.9pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;
mso-header-margin:42.55pt;
mso-footer-margin:49.6pt;
mso-paper-source:0;
layout-grid:15.6pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:普通表格;
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-qformat:yes;
mso-style-parent:"";
mso-padding-alt:0cm 5.4pt 0cm 5.4pt;
mso-para-margin:0cm;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.5pt;
mso-bidi-font-size:11.0pt;
font-family:"Calibri","sans-serif";
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-font-kerning:1.0pt;}
</style>
<![endif]-->
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">当两个进程在进行远程通信时，彼此可以发送各种类型的数据。无论是何种类型的数据，都会以二进制序列的形式在网络上传送。发送方需要把这个</span>Java<span style="font-family: 宋体;">对象转换为字节序列，才能在网络上传送；接收方则需要把字节序列再恢复为</span>Java<span style="font-family: 宋体;">对象。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">把</span>Java<span style="font-family: 宋体;">对象转换为字节序列的过程称为对象的序列化。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">把字节序列恢复为</span>Java<span style="font-family: 宋体;">对象的过程称为对象的反序列化。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">对象的序列化主要有两种用途：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">1<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">把对象的字节序列永久地保存到硬盘上，通常存放在一个文件中；</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">2<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">在网络上传送对象的字节序列。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21.1pt;"><strong><span style="font-family: 宋体;">一．</span>JDK</strong><strong><span style="font-family: 宋体;">类库中的序列化</span>API</strong></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">java.io.ObjectOutputStream<span style="font-family: 宋体;">代表对象输出流，它的</span><span>writeObject(Object
obj)</span><span style="font-family: 宋体;">方法可对参数指定的</span>obj<span style="font-family: 宋体;">对象进行序列化，把得到的字节序列写到一个目标输出流中。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">java.io.ObjectInputStream<span style="font-family: 宋体;">代表对象输入流，它的</span>readObject()<span style="font-family: 宋体;">方法从一个源输入流中读取字节序列，再把它们反序列化为一个对象，并将其返回。、</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">只有实现了</span>Serializable<span style="font-family: 宋体;">和</span>Externalizable<span style="font-family: 宋体;">接口的类的对象才能被序列化。</span>Externalizable<span style="font-family: 宋体;">接口继承自</span>Serializable<span style="font-family: 宋体;">接口，实现</span>Externalizable<span style="font-family: 宋体;">接口的类完全由自身来控制序列化的行为，而仅实现</span>Serializable<span style="font-family: 宋体;">接口的类可以采用默认的序列化方式</span>
<span style="font-family: 宋体;">。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">对象序列化包括如下步骤：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">1<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">创建一个对象输出流，它可以包装一个其他类型的目标输出流，如文件输出流；</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">2<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">通过对象输出流的</span>writeObject()<span style="font-family: 宋体;">方法写对象。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">对象反序列化的步骤如下：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">1<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">创建一个对象输入流，它可以包装一个其他类型的源输入流，如文件输入流；</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">2<span style="font-family: 宋体;">）</span>&nbsp;<span style="font-family: 宋体;">通过对象输入流的</span>readObject()<span style="font-family: 宋体;">方法读取对象。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">下面让我们来看一个对应的例子，类的内容如下：</span></p>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;cn.albert.ling.p386;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.</span><span style="color: #000000;">*</span><span style="color: #000000;">;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.util.Date;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;ObjectSaver&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">/**</span><span style="color: #008000;"><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080;">@author</span><span style="color: #008000;">&nbsp;&lt;a&nbsp;href="MailTo:ling.albert.cn@gmail.com"&gt;albert&nbsp;ling&lt;/a&gt;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;Creation&nbsp;date:&nbsp;2009&nbsp;2 22&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">*/</span><span style="color: #000000;"><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;file&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;File(</span><span style="color: #000000;">"</span><span style="color: #000000;">D:\\temp.txt</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectOutputStream&nbsp;out&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ObjectOutputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileOutputStream(file));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;序列化对象</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Customer&nbsp;customer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Customer(</span><span style="color: #000000;">"</span><span style="color: #000000;">LS</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">24</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeObject(</span><span style="color: #000000;">"</span><span style="color: #000000;">Morning!</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeObject(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Date());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeObject(customer);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.writeInt(</span><span style="color: #000000;">123</span><span style="color: #000000;">);&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;写入基本类型数据</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">//</span><span style="color: #008000;">&nbsp;反序列化对象</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectInputStream&nbsp;in&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;ObjectInputStream<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileInputStream(file));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">obj1=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(String)&nbsp;in.readObject());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">obj2=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;(Date)&nbsp;in.readObject());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Customer&nbsp;obj3&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(Customer)&nbsp;in.readObject();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">obj3=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;obj3);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;obj4&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;in.readInt();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">obj4=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;obj4);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;in.close();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;file.delete();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
<br />
</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Customer&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Serializable&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">final</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">long</span><span style="color: #000000;">&nbsp;serialVersionUID&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">1L</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;Customer(String&nbsp;name,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;age)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;name;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.age&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;String&nbsp;toString()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">name=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;name&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;age=</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;age;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</span></div>
<p class="MsoNormal"><span lang="EN-US"><o:p>&nbsp;</o:p></span>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="ProgId" content="Word.Document" />
<meta name="Generator" content="Microsoft Word 12" />
<meta name="Originator" content="Microsoft Word 12" />
<link rel="File-List" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_filelist.xml" />
<link rel="themeData" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_themedata.thmx" />
<link rel="colorSchemeMapping" href="file:///C:%5CUsers%5CLS%5CAppData%5CLocal%5CTemp%5Cmsohtmlclip1%5C01%5Cclip_colorschememapping.xml" /><!--[if gte mso 9]><xml>
Normal
0
7.8 磅
0
2
false
false
false
EN-US
ZH-CN
X-NONE
MicrosoftInternetExplorer4
</xml><![endif]--><!--[if gte mso 9]><![endif]--><style>
<!--
/* Font Definitions */
@font-face
{font-family:宋体;
panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
{font-family:""@宋体";
panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{
mso-style-parent:"";
margin:0cm;
margin-bottom:.0001pt;
text-align:justify;
text-justify:inter-ideograph;
font-size:10.5pt;
font-family:"Calibri","sans-serif";
mso-bidi-font-family:"Times New Roman";}
.MsoChpDefault
{
mso-bidi-font-family:"Times New Roman";}
/* Page Definitions */
@page
{}
@page Section1
{size:612.0pt 792.0pt;
margin:72.0pt 90.0pt 72.0pt 90.0pt;}
div.Section1
{page:Section1;}
-->
</style><!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{
mso-style-parent:"";
font-size:10.5pt;
font-family:"Calibri","sans-serif";}
</style>
<![endif]-->
</p>
<p style="margin-bottom: 3pt; text-indent: 21.1pt;"><strong><span style="font-family: 宋体;">二．实现</span>Serializable</strong><strong><span style="font-family: 宋体;">接口</span></strong></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">ObjectOutputStream<span style="font-family: 宋体;">只能对</span>Serializable<span style="font-family: 宋体;">接口的类的对象进行序列化。默认情况下，</span>ObjectOutputStream<span style="font-family: 宋体;">按照默认方式序列化，这种序列化方式仅仅对对象的非</span>transient<span style="font-family: 宋体;">的实例变量进行序列化，而不会序列化对象的</span>transient<span style="font-family: 宋体;">的实例变量，也不会序列化静态变量。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">当</span>ObjectOutputStream<span style="font-family: 宋体;">按照默认方式反序列化时，具有如下特点：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">1<span style="font-family: 宋体;">）如果在内存中对象所属的类还没有被加载，那么会先加载并初始化这个类。如果在</span>classpath<span style="font-family: 宋体;">中不存在相应的类文件，那么会抛出</span>ClassNotFoundException<span style="font-family: 宋体;">；</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">2<span style="font-family: 宋体;">）在反序列化时不会调用类的任何构造方法。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">如果用户希望控制类的序列化方式，可以在可序列化类中提供以下形式的</span>writeObject()<span style="font-family: 宋体;">和</span>readObject()<span style="font-family: 宋体;">方法。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span>private void
writeObject(java.io.ObjectOutputStream out) throws IOException</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span>private void
readObject(java.io.ObjectInputStream in) throws IOException,
ClassNotFoundException;</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">当</span>ObjectOutputStream<span style="font-family: 宋体;">对一个</span>Customer<span style="font-family: 宋体;">对象进行序列化时，如果该对象具有</span>writeObject()<span style="font-family: 宋体;">方法，那么就会执行这一方法，否则就按默认方式序列化。在该对象的</span>writeObjectt()<span style="font-family: 宋体;">方法中，可以先调用</span>ObjectOutputStream<span style="font-family: 宋体;">的</span>defaultWriteObject()<span style="font-family: 宋体;">方法，使得对象输出流先执行默认的序列化操作。同理可得出反序列化的情况，不过这次是</span>defaultReadObject()<span style="font-family: 宋体;">方法。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">有些对象中包含一些敏感信息，这些信息不宜对外公开。如果按照默认方式对它们序列化，那么它们的序列化数据在网络上传输时，可能会被不法份子窃取。对于这类信息，可以对它们进行加密后再序列化，在反序列化时则需要解密，再恢复为原来的信息。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">默认的序列化方式会序列化整个对象图，这需要递归遍历对象图。如果对象图很复杂，递归遍历操作需要消耗很多的空间和时间，它的内部数据结构为双向列表。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">在应用时，如果对某些成员变量都改为</span>transient<span style="font-family: 宋体;">类型，将节省空间和时间，提高序列化的性能。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21.1pt;"><strong><span style="font-family: 宋体;">三．实现</span>Externalizable</strong><strong><span style="font-family: 宋体;">接口</span></strong></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">Externalizable<span style="font-family: 宋体;">接口继承自</span>Serializable<span style="font-family: 宋体;">接口，如果一个类实现了</span>Externalizable<span style="font-family: 宋体;">接口，那么将完全由这个类控制自身的序列化行为。</span>Externalizable<span style="font-family: 宋体;">接口声明了两个方法：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span>public void
writeExternal(ObjectOutput out) throws IOException</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span>public void
readExternal(ObjectInput in) throws IOException , ClassNotFoundException</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">前者负责序列化操作，后者负责反序列化操作。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">在对实现了</span>Externalizable<span style="font-family: 宋体;">接口的类的对象进行反序列化时，会先调用类的不带参数的构造方法，这是有别于默认反序列方式的。如果把类的不带参数的构造方法删除，或者把该构造方法的访问权限设置为</span>private<span style="font-family: 宋体;">、默认或</span>protected<span style="font-family: 宋体;">级别，会抛出</span>java.io.InvalidException: no valid constructor<span style="font-family: 宋体;">异常。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21.1pt;"><strong><span style="font-family: 宋体;">四．可序列化类的不同版本的序列化兼容性</span></strong></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">凡是实现</span>Serializable<span style="font-family: 宋体;">接口的类都有一个表示序列化版本标识符的静态变量：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span>private static
final long serialVersionUID;</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">以上</span>serialVersionUID<span style="font-family: 宋体;">的取值是</span>Java<span style="font-family: 宋体;">运行时环境根据类的内部细节自动生成的。如果对类的源代码作了修改，再重新编译，新生成的类文件的</span>serialVersionUID<span style="font-family: 宋体;">的取值有可能也会发生变化。</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;"><span style="font-family: 宋体;">类的</span>serialVersionUID<span style="font-family: 宋体;">的默认值完全依赖于</span>Java<span style="font-family: 宋体;">编译器的实现，对于同一个类，用不同的</span>Java<span style="font-family: 宋体;">编译器编译，有可能会导致不同的</span>serialVersionUID<span style="font-family: 宋体;">，也有可能相同。为了提高哦啊</span>serialVersionUID<span style="font-family: 宋体;">的独立性和确定性，强烈建议在一个可序列化类中显示的定义</span>serialVersionUID<span style="font-family: 宋体;">，为它赋予明确的值。显式地定义</span>serialVersionUID<span style="font-family: 宋体;">有两种用途：</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">1<span style="font-family: 宋体;">）在某些场合，希望类的不同版本对序列化兼容，因此需要确保类的不同版本具有相同的</span>serialVersionUID<span style="font-family: 宋体;">；</span></p>
<p style="margin-bottom: 3pt; text-indent: 21pt;">2<span style="font-family: 宋体;">）</span><span style="font-family: 宋体;">在某些场合，不希望类的不同版本对序列化兼容，因此需要确保类的不同版本具有不同的</span>serialVersionUID<span style="font-family: 宋体;">。</span></p>
<p>&nbsp;</p>
</span>
<img src ="http://www.blogjava.net/gnilling/aggbug/256133.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/gnilling/" target="_blank">Albert Ling</a> 2009-02-22 23:07 <a href="http://www.blogjava.net/gnilling/archive/2009/02/22/256133.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>