<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>linsl</title>
    <description></description>
    <link>http://linsl.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>j2EE中的过滤器的用法(过滤乱码)</title>
        <author>linsl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://linsl.javaeye.com">linsl</a>&nbsp;
          链接：<a href="http://linsl.javaeye.com/blog/224660" style="color:red;">http://linsl.javaeye.com/blog/224660</a>&nbsp;
          发表时间: 2008年08月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>乱码是j2ee中一个比较常见的问题。遇到1，2个情况下，可以用new String(request.getParameter(xxx).getBytes("ISO-8859-1"),"UTF-8")来解决。遇到多的情况下，就最好用过滤器了。<br />1个过滤器只需要注意2个地方，类和在web.xml上面的发布。<br /><br />1。在web.xml上面的发布如下： </p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; height: 206px; background-color: #eeeeee; border: #cccccc 1px solid;"><span style="font-size: x-small;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #000000;">&lt;</span><span style="color: #000000;">filter</span><span style="color: #000000;">&gt;</span></span><span style="color: #000000;"><br /><span style="font-size: x-small;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: x-small;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">filter</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">SetCharsetEncodingFilter</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">filter</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;&nbsp;<span style="color: #008000;"> //这个是类名</span></span></span><span style="color: #000000;"><br /><span style="font-size: x-small;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: x-small;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">filter</span><span style="color: #000000;">-</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">org.SetCharacter</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">filter</span><span style="color: #000000;">-</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: #008000;">//这个是类的位置</span></span></span><span style="color: #000000;"><br /><span style="font-size: x-small;"><span style="color: #008000;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: x-small;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">init</span><span style="color: #000000;">-</span><span style="color: #000000;">param</span><span style="color: #000000;">&gt;</span></span><span style="color: #000000;"><br /><span style="font-size: x-small;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: x-small;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">param</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">encoding</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">param</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span></span><span style="color: #000000;"><br /><span style="font-size: x-small;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: x-small;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">param</span><span style="color: #000000;">-</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">utf</span><span style="color: #000000;">-</span><span style="color: #000000;">8</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">param</span><span style="color: #000000;">-</span><span style="color: #000000;">value</span><span style="color: #000000;">&gt;</span></span><span style="color: #000000;"><br /><span style="font-size: x-small;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: x-small;"><span style="color: #000000;">&lt;/</span><span style="color: #000000;">init</span><span style="color: #000000;">-</span><span style="color: #000000;">param</span><span style="color: #000000;">&gt;</span></span><span style="color: #000000;"><br /><span style="font-size: x-small;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;</span></span><span style="font-size: x-small;"><span style="color: #000000;">&lt;/</span><span style="color: #000000;">filter</span><span style="color: #000000;">&gt;</span></span><span style="color: #000000;"><br /><span style="font-size: x-small;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;</span></span><span style="font-size: x-small;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">filter</span><span style="color: #000000;">-</span><span style="color: #000000;">mapping</span><span style="color: #000000;">&gt;</span></span><span style="color: #000000;"><br /><span style="font-size: x-small;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: x-small;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">filter</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">SetCharsetEncodingFilter</span><span style="color: #000000;">&lt;/</span><span style="color: #000000;">filter</span><span style="color: #000000;">-</span><span style="color: #000000;">name</span><span style="color: #000000;">&gt;</span></span><span style="color: #000000;"><br /><span style="font-size: x-small;"><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_323_359_Open_Image" onclick="this.style.display='none'; Codehighlighter1_323_359_Open_Text.style.display='none'; Codehighlighter1_323_359_Closed_Image.style.display='inline'; Codehighlighter1_323_359_Closed_Text.style.display='inline';" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_323_359_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_323_359_Closed_Text.style.display='none'; Codehighlighter1_323_359_Open_Image.style.display='inline'; Codehighlighter1_323_359_Open_Text.style.display='inline';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><span style="font-size: x-small;"><span style="color: #000000;">&lt;</span><span style="color: #000000;">url</span><span style="color: #000000;">-</span><span style="color: #000000;">pattern</span><span style="color: #000000;">&gt; </span></span><span id="Codehighlighter1_323_359_Open_Text"><span style="color: #008000;"><span style="font-size: x-small; color: #000000;">/* </span></span><span style="color: #008000;"><span style="font-size: x-small; color: #000000;">&lt;/url-pattern&gt;&nbsp;&nbsp;</span><span style="font-size: x-small;"><span style="color: #008000;"> //这个代表所有的文件遇到过滤器都要被拦截<br /></span><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;<span style="color: #000000;">&nbsp;&lt;/filter-mapping&gt;</span></span></span></span></div>
<p><br />2。过滤的这个类如下：</p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;org;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.io.IOException;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.Filter;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.FilterChain;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.FilterConfig;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletException;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletRequest;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.servlet.ServletResponse;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockStart.gif" id="Codehighlighter1_300_1251_Open_Image" onclick="this.style.display='none'; Codehighlighter1_300_1251_Open_Text.style.display='none'; Codehighlighter1_300_1251_Closed_Image.style.display='inline'; Codehighlighter1_300_1251_Closed_Text.style.display='inline';" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedBlock.gif" id="Codehighlighter1_300_1251_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_300_1251_Closed_Text.style.display='none'; Codehighlighter1_300_1251_Open_Image.style.display='inline'; Codehighlighter1_300_1251_Open_Text.style.display='inline';" align="top" alt="" style="display: none;" /></span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;SetCharacter&nbsp;</span><span style="color: #0000ff;">implements</span><span style="color: #000000;">&nbsp;Filter&nbsp;</span><span id="Codehighlighter1_300_1251_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;String&nbsp;encoding&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;FilterConfig&nbsp;filterConfig&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">protected</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">boolean</span><span style="color: #000000;">&nbsp;ignore&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_478_767_Open_Image" onclick="this.style.display='none'; Codehighlighter1_478_767_Open_Text.style.display='none'; Codehighlighter1_478_767_Closed_Image.style.display='inline'; Codehighlighter1_478_767_Closed_Text.style.display='inline';" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_478_767_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_478_767_Closed_Text.style.display='none'; Codehighlighter1_478_767_Open_Image.style.display='inline'; Codehighlighter1_478_767_Open_Text.style.display='inline';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;init(FilterConfig&nbsp;arg0)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;ServletException&nbsp;</span><span id="Codehighlighter1_478_767_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.encoding&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;arg0.getInitParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">encoding</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;value&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;arg0.getInitParameter(</span><span style="color: #000000;">"</span><span style="color: #000000;">imnore</span><span style="color: #000000;">"</span><span style="color: #000000;">);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_600_627_Open_Image" onclick="this.style.display='none'; Codehighlighter1_600_627_Open_Text.style.display='none'; Codehighlighter1_600_627_Closed_Image.style.display='inline'; Codehighlighter1_600_627_Closed_Text.style.display='inline';" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_600_627_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_600_627_Closed_Text.style.display='none'; Codehighlighter1_600_627_Open_Image.style.display='inline'; Codehighlighter1_600_627_Open_Text.style.display='inline';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(value</span><span style="color: #000000;">==</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)</span><span id="Codehighlighter1_600_627_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.ignore&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_668_695_Open_Image" onclick="this.style.display='none'; Codehighlighter1_668_695_Open_Text.style.display='none'; Codehighlighter1_668_695_Closed_Image.style.display='inline'; Codehighlighter1_668_695_Closed_Text.style.display='inline';" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_668_695_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_668_695_Closed_Text.style.display='none'; Codehighlighter1_668_695_Open_Image.style.display='inline'; Codehighlighter1_668_695_Open_Text.style.display='inline';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(value.equalsIgnoreCase(</span><span style="color: #000000;">"</span><span style="color: #000000;">true</span><span style="color: #000000;">"</span><span style="color: #000000;">))</span><span id="Codehighlighter1_668_695_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.ignore&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_734_761_Open_Image" onclick="this.style.display='none'; Codehighlighter1_734_761_Open_Text.style.display='none'; Codehighlighter1_734_761_Closed_Image.style.display='inline'; Codehighlighter1_734_761_Closed_Text.style.display='inline';" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_734_761_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_734_761_Closed_Text.style.display='none'; Codehighlighter1_734_761_Open_Image.style.display='inline'; Codehighlighter1_734_761_Open_Text.style.display='inline';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(value.equalsIgnoreCase(</span><span style="color: #000000;">"</span><span style="color: #000000;">yes</span><span style="color: #000000;">"</span><span style="color: #000000;">))</span><span id="Codehighlighter1_734_761_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.ignore&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">true</span><span style="color: #000000;">;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_890_1083_Open_Image" onclick="this.style.display='none'; Codehighlighter1_890_1083_Open_Text.style.display='none'; Codehighlighter1_890_1083_Closed_Image.style.display='inline'; Codehighlighter1_890_1083_Closed_Text.style.display='inline';" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_890_1083_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_890_1083_Closed_Text.style.display='none'; Codehighlighter1_890_1083_Open_Image.style.display='inline'; Codehighlighter1_890_1083_Open_Text.style.display='inline';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;doFilter(ServletRequest&nbsp;arg0,&nbsp;ServletResponse&nbsp;arg1,&nbsp;FilterChain&nbsp;arg2)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;IOException,&nbsp;ServletException&nbsp;</span><span id="Codehighlighter1_890_1083_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_943_1052_Open_Image" onclick="this.style.display='none'; Codehighlighter1_943_1052_Open_Text.style.display='none'; Codehighlighter1_943_1052_Closed_Image.style.display='inline'; Codehighlighter1_943_1052_Closed_Text.style.display='inline';" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_943_1052_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_943_1052_Closed_Text.style.display='none'; Codehighlighter1_943_1052_Open_Image.style.display='inline'; Codehighlighter1_943_1052_Open_Text.style.display='inline';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(ignore</span><span style="color: #000000;">||</span><span style="color: #000000;">(arg0.getCharacterEncoding()&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">))</span><span id="Codehighlighter1_943_1052_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encoding&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">selectEncoding(arg0);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(encoding</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg0.setCharacterEncoding(encoding);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg2.doFilter(arg0,arg1);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1138_1167_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1138_1167_Open_Text.style.display='none'; Codehighlighter1_1138_1167_Closed_Image.style.display='inline'; Codehighlighter1_1138_1167_Closed_Text.style.display='inline';" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1138_1167_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1138_1167_Closed_Text.style.display='none'; Codehighlighter1_1138_1167_Open_Image.style.display='inline'; Codehighlighter1_1138_1167_Open_Text.style.display='inline';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;String&nbsp;selectEncoding(ServletRequest&nbsp;arg0)&nbsp;</span><span id="Codehighlighter1_1138_1167_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.encoding);<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockStart.gif" id="Codehighlighter1_1193_1248_Open_Image" onclick="this.style.display='none'; Codehighlighter1_1193_1248_Open_Text.style.display='none'; Codehighlighter1_1193_1248_Closed_Image.style.display='inline'; Codehighlighter1_1193_1248_Closed_Text.style.display='inline';" align="top" alt="" /><img src="http://www.blogjava.net/Images/OutliningIndicators/ContractedSubBlock.gif" id="Codehighlighter1_1193_1248_Closed_Image" onclick="this.style.display='none'; Codehighlighter1_1193_1248_Closed_Text.style.display='none'; Codehighlighter1_1193_1248_Open_Image.style.display='inline'; Codehighlighter1_1193_1248_Open_Text.style.display='inline';" align="top" alt="" style="display: none;" />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;destroy()&nbsp;</span><span id="Codehighlighter1_1193_1248_Open_Text"><span style="color: #000000;">{<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.encoding&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">this</span><span style="color: #000000;">.filterConfig&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">;<br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedSubBlockEnd.gif" align="top" alt="" />&nbsp;&nbsp;&nbsp;&nbsp;}</span></span><span style="color: #000000;"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/InBlock.gif" align="top" alt="" /><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/ExpandedBlockEnd.gif" align="top" alt="" />}</span></span><span style="color: #000000;"><br /><img src="http://www.blogjava.net/Images/OutliningIndicators/None.gif" align="top" alt="" /></span></div>
          <br/>
          <span style="color:red;">
            <a href="http://linsl.javaeye.com/blog/224660#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 05 Aug 2008 16:25:00 +0800</pubDate>
        <link>http://linsl.javaeye.com/blog/224660</link>
        <guid>http://linsl.javaeye.com/blog/224660</guid>
      </item>
      <item>
        <title>金额数字大写转换</title>
        <author>linsl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://linsl.javaeye.com">linsl</a>&nbsp;
          链接：<a href="http://linsl.javaeye.com/blog/218545" style="color:red;">http://linsl.javaeye.com/blog/218545</a>&nbsp;
          发表时间: 2008年07月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: small; color: #ff0000;"><strong>转载请注明链接:</strong></span></p>
<pre name="code" class="js">//by linsl 2008-07-23 转化格式#.##
function numToCh(num)
{
	if(num=="")
		return "零元整";
	var ch_str="";

	for(var i=0;i&lt;num.length;i++)
		{
			num=num.replace(",","");//替换千位分隔符
		}
	if(isNaN(num)||num=="0."||num==".0")
		{
			alert("请检查金额是否为有效数字的");
			return "";
		}
	if(num==0)
		return "零元整";
	var part=num.split(".");//将整数部分与小数部分分开
	
	if(part[0].length&gt;12)
		{
			alert("数字超出大小写转换范围(0.01----999999999999.99)");
			return "";
		}
	
	var num_ch=new Array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖");
	var z_unit=new Array("元","拾","佰","仟","萬","拾","佰","仟","億","拾","佰","仟");
	var point=new Array("角","分","厘");
	
	//整数部分数据处理
	for(var i=0;i&lt;part[0].length;i++)
		{
			ch_str+=num_ch[part[0].substring(i,i+1)]+z_unit[part[0].length-i-1];
		}
	//小数部分数据处理
	if(part.length&gt;1)
	{
		if(part[1].length&gt;2)
		{
			alert("数字超出大小写转换范围(0.01----999999999999.99)");
			return "";
		}
		for(var i=0;i&lt;part[1].length;i++)
			{
				ch_str+=num_ch[part[1].substring(i,i+1)]+point[i];
			}
	}
	//转化后的字符串处理	
	for(i=0;i&lt;4;i++)
	{
	ch_str=ch_str.replace("零億","億");
	ch_str=ch_str.replace("零萬","萬");
	ch_str=ch_str.replace("零仟","零");
	ch_str=ch_str.replace("零佰","零");
	ch_str=ch_str.replace("零拾","零");
	ch_str=ch_str.replace("零元","元");
	ch_str=ch_str.replace("億萬","億");
	ch_str=ch_str.replace("零零","零");
	ch_str=ch_str.replace("零角","零");
	ch_str=ch_str.replace("零分","");
	ch_str=ch_str.replace("零厘","");
}
	if(ch_str.substring(ch_str.length-1)==("零"))
		ch_str=ch_str.substring(0,ch_str.length-1)+"整";
	if(ch_str=="元整")
		ch_str="零元整";
	return ch_str;
}</pre>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://linsl.javaeye.com/blog/218545#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 23 Jul 2008 13:43:02 +0800</pubDate>
        <link>http://linsl.javaeye.com/blog/218545</link>
        <guid>http://linsl.javaeye.com/blog/218545</guid>
      </item>
      <item>
        <title>oracle 10g表空间操作</title>
        <author>linsl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://linsl.javaeye.com">linsl</a>&nbsp;
          链接：<a href="http://linsl.javaeye.com/blog/206739" style="color:red;">http://linsl.javaeye.com/blog/206739</a>&nbsp;
          发表时间: 2008年06月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <div class="postbody">
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">---------------------------------------------- -</span></span><span>表空间的操作</span><span><span style="font-family: Times New Roman;">----------------------------------------------------</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">1.</span></span><span>创建表空间：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">create tablespace tablespace_name datafile 'filepath' size filesize autoextend on next autosize maxsize filemaxsize [unlimited]</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">eg:</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">create tablespace sales datafile 'c:\1.txt' size 10m autoextend on next 1m maxsize 100m</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">2.</span></span><span>为表空间增加数据文件：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter tablespace tablespace_name add datafile 'filepath' size filesize autoextend on next autosize maxsize filemaxsize[unlimited]</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">eg:</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter tablespace sales datafile 'c:\2.txt' size 10m autoextend on next 1m maxsize unlimited</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">3.</span></span><span>调整表空间：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter database datafile 'filepath' resize filesize--</span></span><span>重置表空间的大小</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">eg:</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter database datafile 'c:\2.txt' resize 10m</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">4.</span></span><span>关闭表空间的自动扩展属性：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter database datafile 'filepath' autoextend off</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">eg:</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter database datafile 'c:\2.txt' autoextend off</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">5.</span></span><span>打开表空间的自动扩展属性：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter database datafile 'filepath' autoextend on</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">eg:</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter database datafile 'c:\2.txt' autoextend on</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">6.</span></span><span>使表空间脱机：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter tablespace tablespace_name offline</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">7.</span></span><span>使表空间联机：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter tablespace tablespace_name online</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">8.</span></span><span>设置表空间为只读：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter tablespace tablespace_name read only</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">9.</span></span><span>设置表空间为读写：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">alter tablespace tablespace_name read write</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">11.</span></span><span>删除表空间：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">drop tablespace tablespace_name</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">12.</span></span><span>删除表空间的同时，删除数据文件</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">drop tablespace tablespace_name including contents and datefiles</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">13.</span></span><span>查看每个表空间占用空间的大小：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">select tablespace_name,sum(bytes)/1024/1024 from dba_segments group by tablespace_name</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">10.</span></span><span>移动表空间数据文件步骤：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">a.</span></span><span>使表空间脱机：</span><span><span style="font-family: Times New Roman;">alter tablespace tablespace_name offline</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">b.</span></span><span>物理移动数据文件到目的地（可以是表空间的部分数据文件或者是修改数据文件的名称）</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">c.</span></span><span>逻辑移动：</span><span><span style="font-family: Times New Roman;">alter tablespace tablespace_name rename datafile '</span></span><span>源文件地址</span><span><span style="font-family: Times New Roman;">'to '</span></span><span>目的文件地址</span><span><span style="font-family: Times New Roman;">'--</span></span><span>注意可以将多个源文件转移到同一个目的文件地址（多个源文件地址用逗号分隔）</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">d.</span></span><span>将表空间联机：</span><span><span style="font-family: Times New Roman;">alter tablespace tablespace_name online</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">11.</span></span><span>查询表空间的信息：</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">select tablespace_name,bytes/1024/1024<span>&nbsp;&nbsp;</span>file_size_mb,file_name from DBA_DATE_FILES--</span></span><span>注意书籍库中的实体都是以大写表示</span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">12.</span></span><span>当数据文件被删除的时候，如果对该数据文件操作的时候，</span><span><span style="font-family: Times New Roman;">oracle</span></span><span>会报不能找到该数据文件的错误。如何处理。</span></p>
<p style="margin: 0cm 0cm 0pt;"><span>（</span><span><span style="font-family: Times New Roman;">1</span></span><span>）</span><span><span style="font-family: Times New Roman;">shutdown&mdash;</span></span><span>关闭</span><span><span style="font-family: Times New Roman;">oracle</span></span><span>实例</span></p>
<p style="margin: 0cm 0cm 0pt;"><span>（</span><span><span style="font-family: Times New Roman;">2</span></span><span>）</span><span><span style="font-family: Times New Roman;">startup<span>&nbsp;&nbsp;</span>--</span></span><span>开启</span><span><span style="font-family: Times New Roman;">oracle</span></span><span>实例并打开数据库</span></p>
<p style="margin: 0cm 0cm 0pt;"><span>（</span><span><span style="font-family: Times New Roman;">3</span></span><span>）</span><span><span style="font-family: Times New Roman;">alter database datafile &lsquo;datafile_name&rsquo; offline drop;</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span>（</span><span><span style="font-family: Times New Roman;">4</span></span><span>）</span><span><span style="font-family: Times New Roman;">alter database open</span></span></p>
<p style="margin: 0cm 0cm 0pt;"><span><span style="font-family: Times New Roman;">------------------------------------------------------------------------------------------------------------------</span></span></p>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://linsl.javaeye.com/blog/206739#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 21 Jun 2008 21:20:34 +0800</pubDate>
        <link>http://linsl.javaeye.com/blog/206739</link>
        <guid>http://linsl.javaeye.com/blog/206739</guid>
      </item>
      <item>
        <title>oracle查看当前和断开会话连接</title>
        <author>linsl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://linsl.javaeye.com">linsl</a>&nbsp;
          链接：<a href="http://linsl.javaeye.com/blog/192650" style="color:red;">http://linsl.javaeye.com/blog/192650</a>&nbsp;
          发表时间: 2008年05月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>select &nbsp; SID,SERIAL#,USERNAME,MACHINE &nbsp; &nbsp; from &nbsp; v$session; &nbsp; <br />&nbsp; &nbsp; <br />&nbsp; alter &nbsp; system &nbsp; kill &nbsp; session &nbsp; sid,SERIAL#;</p>
          <br/>
          <span style="color:red;">
            <a href="http://linsl.javaeye.com/blog/192650#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 13 May 2008 17:15:50 +0800</pubDate>
        <link>http://linsl.javaeye.com/blog/192650</link>
        <guid>http://linsl.javaeye.com/blog/192650</guid>
      </item>
      <item>
        <title>(转)基于开源jabber(XMPP)架设内部即时通讯服务的解决方案</title>
        <author>linsl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://linsl.javaeye.com">linsl</a>&nbsp;
          链接：<a href="http://linsl.javaeye.com/blog/189518" style="color:red;">http://linsl.javaeye.com/blog/189518</a>&nbsp;
          发表时间: 2008年05月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Jabber 是著名的即时通讯服务服务器，它是一个自由开源软件，能让用户自己架即时通讯服务器，可以在Internet上应用，也可以在局域网中应用。<br />&nbsp;&nbsp;&nbsp; XMPP（可扩展消息处理现场协议）是基于可扩展标记语言（XML）的协议，它用于即时消息（IM）以及在线现场探测。它在促进服务器之间的准即时操作。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息，即使其操作系统和浏览器不同。XMPP的技术来自于Jabber，其实它是 Jabber的核心协定，所以XMPP有时被误称为Jabber协议。Jabber是一个基于XMPP协议的IM应用，除Jabber之外，XMPP还支持很多应用。</p>
<p>此文已转向：<a href="http://www.blog-dragon.com/2007/10/jabber-xmpp-openfire-spark.html">http://www.blog-dragon.com/2007/10/jabber-xmpp-openfire-spark.html</a></p>
<p>转载请注明出处：<a href="http://blog.csdn.net/expendable">expendable</a><br />下面就是如何架设内部即时通讯服务的步骤：</p>
<p><span style="font-size: small; color: #ff0000;"><strong>第一步：安装Jabber服务器软件<br /></strong></span>Jabber服务软件有很多，具体可以参考jabber官方网站的列表：<br />Jabber官网地址：<a href="http://www.jabber.org/">http://www.jabber.org/</a><br />常用Jabber服务器软件：<a href="http://www.jabber.org/software/servers.shtml">http://www.jabber.org/software/servers.shtml</a></p>
<p>其中最为方便安装搭建的无疑是Openfire(Wildfire)，一款基于GPL协议开源软件，Openfire有linux、windows和MAC的不同版本，软件需要java环境支持，不过软件本身自带了环境包，你可以根据你的需要下载不同的版本。<br />下载地址：<a href="http://www.igniterealtime.org/downloads/index.jsp#openfire">http://www.igniterealtime.org/downloads/index.jsp#openfire</a><br />最新版本：Openfire 3.3.2</p>
<!--原著:肥龙龙 http://blog.csdn.net/expendable-->
<p>1、Windows版本安装方法：<br />下载：openfire_3_3_2.exe带java环境版本<br />安装：直接运行安装文件，程序默认安装至<span style="color: #0000ff;">c:\Program Files\Openfire</span><br />运行：<span style="color: #0000ff;">\bin\openfire.exe<br /></span>&nbsp;<br />2、Linux/Unix版本安装方法<br />如果使用rpm包安装，下载：<span style="color: #0000ff;">openfire-3.3.2-1.i386.rpm</span><br />运行：<br /><span style="color: #0000ff;">#rpm -ivh openfire_3_0_0.rpm</span><br />默认安装路径位于：<span style="color: #0000ff;">/opt/openfire<br /></span>使用源码包安装，下载： <span style="color: #0000ff;">openfire_3_0_0.tar.gz</span>（不带java环境，请自行安装）<br /><span style="color: #0000ff;">#tar -xzvf openfire_3_0_0.tar.gz<br /># mv openfire /opt<br /></span>启动方法：<br /><span style="color: #0000ff;">#/opt/openfire/bin/openfire.sh</span></p>
<p><span style="font-size: small; color: #ff0000;"><strong>第二步：配置jabber服务器<br /></strong></span>Openfire（Wildfire）支持完全的web安装，如果你在本地按安装只需要在浏览器中输入<a href="http://localhost:9090/">http://localhost:9090</a>（远程服务器为http://你的服务器地址:9090）即可开始即时通讯服务器配置。<br />（1）语言选择：中文简体<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/step1.gif" alt="" /><br />（2）服务期设置：选择域及端口，建议默认<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/step2.gif" alt="" /><br />（3）数据库设置：根据需要，这里选&ldquo;标准数据库&rdquo;<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/step3.jpg" alt="" /><br />（4）标准数据库设置：选择MySQL，数据库URL填入你的数据库地址，端口和数据库名称（请自行创建），用户名密码填入你的mysql的帐号密码，其他更具需要选择填写。继续之后会在你的mysql中创建表并初始化。<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/step4.gif" alt="" /><br />（5）特性设置：如果你不打算用LDAP，保留默认<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/step5.gif" alt="" /><br />（6）管理员帐户设置：填入系统管理员信息<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/step6.gif" alt="" /><br />（7）安装完成<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/step7.gif" alt="" /><br />至此，Openfire安装完毕。你可以继续登录到管理控制台，进行更为详细的设置。<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/step8.gif" alt="" /></p>
<p><span style="font-size: small; color: #ff0000;"><strong>第三步：Jabber客户端安装配置<br /></strong></span>支持Jabber有很多很好的客户端软件，官方推荐的有：</p>
<div>
<table class="MsoNormalTable" cellspacing="1" border="1" align="center" cellpadding="0" style="mso-cellspacing: 0cm; mso-yfti-tbllook: 1184; mso-padding-alt: 2.25pt 2.25pt 2.25pt 2.25pt;">
<tbody>
<tr style="mso-yfti-irow: 0; mso-yfti-firstrow: yes;">
<td bgcolor="#cccccc" style="background-color: transparent; border-color: #d4d0c8; padding: 2.25pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center;"><span style="font-size: small;"><strong><span style="font-family: 宋体; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Verdana;">平台</span></strong><strong><span lang="EN-US" style="font-size: 12pt; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体;"></span></strong></span></p>
</td>
<td bgcolor="#cccccc" style="background-color: transparent; border-color: #d4d0c8; padding: 2.25pt;">
<p class="MsoNormal" align="center" style="margin: 0cm 0cm 0pt; text-align: center;"><span style="font-size: small;"><strong><span style="font-family: 宋体; mso-ascii-font-family: Verdana; mso-fareast-font-family: 宋体; mso-fareast-theme-font: minor-fareast; mso-hansi-font-family: Verdana;">建议客户端</span></strong><strong><span lang="EN-US" style="font-size: 12pt; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体;"></span></strong></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 1;">
<td style="background-color: transparent; border-color: #d4d0c8; padding: 2.25pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US" style="font-family: 'Verdana','sans-serif';">Windows</span><span lang="EN-US" style="font-size: 12pt; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体;"></span></span></p>
</td>
<td style="background-color: transparent; border-color: #d4d0c8; padding: 2.25pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-family: 'Verdana','sans-serif';"><a href="http://exodus.jabberstudio.org/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Exodus</span></span></a><span style="font-size: small;">, </span><a href="http://www.pandion.be/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Pandion</span></span></a><span style="font-size: small;">, </span><a href="http://www.psi-im.org/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Psi</span></span></a><span style="font-size: small;">, </span><a href="http://www.igniterealtime.org/projects/spark/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Spark</span></span></a><span style="font-size: small;"> </span></span><span lang="EN-US" style="font-size: 12pt; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体;"></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 2;">
<td style="background-color: transparent; border-color: #d4d0c8; padding: 2.25pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US" style="font-family: 'Verdana','sans-serif';">Linux</span><span lang="EN-US" style="font-size: 12pt; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体;"></span></span></p>
</td>
<td style="background-color: transparent; border-color: #d4d0c8; padding: 2.25pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-family: 'Verdana','sans-serif';"><a href="http://www.gajim.org/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Gajim</span></span></a><span style="font-size: small;">, </span><a href="http://www.imendio.com/projects/gossip/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Gossip</span></span></a><span style="font-size: small;">, </span><a href="http://kopete.kde.org/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Kopete</span></span></a><span style="font-size: small;">, </span><a href="http://www.pidgin.im/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Pidgin</span></span></a><span style="font-size: small;">, </span><a href="http://www.psi-im.org/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Psi</span></span></a><span style="font-size: small;">, </span><a href="http://www.igniterealtime.org/projects/spark/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Spark</span></span></a><span style="font-size: small;">, </span><a href="http://tkabber.jabber.ru/en/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Tkabber</span></span></a><span style="font-size: small;"> </span></span><span lang="EN-US" style="font-size: 12pt; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体;"></span></p>
</td>
</tr>
<tr style="mso-yfti-irow: 3; mso-yfti-lastrow: yes;">
<td style="background-color: transparent; border-color: #d4d0c8; padding: 2.25pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span style="font-size: small;"><span lang="EN-US" style="font-family: 'Verdana','sans-serif';">Macintosh</span><span lang="EN-US" style="font-size: 12pt; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体;"></span></span></p>
</td>
<td style="background-color: transparent; border-color: #d4d0c8; padding: 2.25pt;">
<p class="MsoNormal" style="margin: 0cm 0cm 0pt;"><span lang="EN-US" style="font-family: 'Verdana','sans-serif';"><a href="http://www.adiumx.com/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Adium</span></span></a><span style="font-size: small;">, </span><a href="http://www.apple.com/macosx/features/ichat/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">iChat</span></span></a><span style="font-size: small;">, </span><a href="http://www.psi-im.org/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Psi</span></span></a><span style="font-size: small;">, </span><a href="http://www.igniterealtime.org/projects/spark/"><span style="font-family: 'Calibri','sans-serif'; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin;"><span style="font-size: small;">Spark</span></span></a><span style="font-size: small;"> </span></span><span lang="EN-US" style="font-size: 12pt; font-family: 'Verdana','sans-serif'; mso-fareast-font-family: 宋体; mso-bidi-font-family: 宋体;"></span></p>
</td>
</tr>
</tbody>
</table>
</div>
<!--原著:肥龙龙 http://blog.csdn.net/expendable-->
<p>更多的列表请参考：<a href="http://www.jabber.org/software/clients.shtml">http://www.jabber.org/software/clients.shtml</a><br />这里我们建议使用Spark，因为Spark和Openfire能够很好的相互支持，可说黄金组合。软件下载地址：<a href="http://www.igniterealtime.org/downloads/index.jsp#spark">http://www.igniterealtime.org/downloads/index.jsp#spark</a><br />目前最新的版本为：2.5.4（6月22日发版）</p>
<p>（1）下载for windows的版本，安装比较简单。<br /><img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/login1.gif" alt="" />&nbsp;<br />（2）选择高级选项：服务器填入你的服务器地址，端口为5222<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/login2.gif" alt="" /><br />（3）注册一个新帐号：服务器参照前文填写<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/login3.gif" alt="" /><br />（4）注册成功后，开始登录。<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/login4.gif" alt="" /><br />（5）登陆后界面<br />&nbsp;<img src="http://p.blog.csdn.net/images/p_blog_csdn_net/expendable/login5.gif" alt="" /><br />现在你就可以和局域网内其拥有jabber帐号的用户通讯了<br /><span style="color: #ff0000;">注：Spark官方并没有中文汉化版本，关于Spark的汉化，请参考松鼠的blog，地址：</span><a href="http://blog.csdn.net/squirrelme"><span style="color: #ff0000;">http://blog.csdn.net/squirrelme</span></a><br /><span style="text-decoration: underline;"><span style="color: #800080;"><a href="http://blog.csdn.net/squirrelme/archive/2007/06/25/1666302.aspx">基于jabber/xmpp即时通讯服务器OpenFire的客户端Spark的中文汉化包</a></span></span></p>
<p><span style="font-size: small; color: #ff0000;"><strong>第四步：Jabber连接与MSN、ICQ等IM通讯<br /></strong></span>Jabber最有优势的就是其通信协议，可以和多种即时通讯对接。比如有第三方插件，能让jabber用户和MSN 、Yahoo Messager、ICQ等IM用户相互通讯。因为Google遵从jabber协议，并且Google已经将Gtalk的服务器开放给了其它的Jabber服务器。所以PSI、Giam等Jabber客户端软件支持GTalk用户登陆。</p>
<p>使用Openfire+Spark的组合也可以实现这个功能，下面具体介绍</p>
<p>继续阅读完整版本：<a href="http://www.blog-dragon.com/2007/10/jabber-xmpp-openfire-spark.html">http://www.blog-dragon.com/2007/10/jabber-xmpp-openfire-spark.html</a></p>
<p><br />转载请注明出处：<a href="http://blog.csdn.net/expendable">expendable</a><br />上面就是内容全部，祝您好运。&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://linsl.javaeye.com/blog/189518#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 04 May 2008 20:57:39 +0800</pubDate>
        <link>http://linsl.javaeye.com/blog/189518</link>
        <guid>http://linsl.javaeye.com/blog/189518</guid>
      </item>
      <item>
        <title>jmf简单例子</title>
        <author>linsl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://linsl.javaeye.com">linsl</a>&nbsp;
          链接：<a href="http://linsl.javaeye.com/blog/187783" style="color:red;">http://linsl.javaeye.com/blog/187783</a>&nbsp;
          发表时间: 2008年04月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="java">import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Panel;
import java.awt.Rectangle;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

import javax.media.Buffer;
import javax.media.CannotRealizeException;
import javax.media.CaptureDeviceInfo;
import javax.media.CaptureDeviceManager;
import javax.media.Manager;
import javax.media.MediaLocator;
import javax.media.NoPlayerException;
import javax.media.Player;
import javax.media.control.FrameGrabbingControl;
import javax.media.format.VideoFormat;
import javax.media.util.BufferToImage;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

import com.sun.image.codec.jpeg.ImageFormatException;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGEncodeParam;
import com.sun.image.codec.jpeg.JPEGImageEncoder;

/**
 * @author 
 * @version 创建时间：Apr 28, 2008 8:02:26 PM
 * 类说明:
 */
public class FirstCapture extends JPanel implements ActionListener{

	private CaptureDeviceInfo captureDeviceInfo=null;
	private MediaLocator mediaLocator=null;
	private static Player player=null;
	private ImagePanel imagePanel=null;
	private JButton capture;
	private Buffer buffer=null;
	private VideoFormat videoFormat=null;
	private BufferToImage bufferToImage=null;
	private Image image=null;
	/**
	 * @param args
	 */
	public FirstCapture()
	{
		 setLayout(new BorderLayout());
		 setSize(320,550);
		String str=&quot;vfw:Microsoft WDM Image Capture (Win32):0&quot;;
		captureDeviceInfo=CaptureDeviceManager.getDevice(str);
		mediaLocator=new MediaLocator(&quot;vfw://0&quot;);
		imagePanel=new ImagePanel();
		 capture=new JButton(&quot;拍照&quot;);
		 capture.addActionListener(this);
		try {
			player=Manager.createRealizedPlayer(mediaLocator);
			player.start();
			Component comp;
			Component comp1;
			if((comp=player.getVisualComponent())!=null)
				add(comp,BorderLayout.NORTH);
//			if((comp1=player.getControlPanelComponent())!=null)
//				add(comp1,BorderLayout.CENTER);
		} catch (NoPlayerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (CannotRealizeException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		add(imagePanel,BorderLayout.SOUTH);
		add(capture,BorderLayout.CENTER);
	}
	
	@Override
	public void print(Graphics g) {
		// TODO Auto-generated method stub
		super.print(g);
		g.setColor(new Color(255,0,0));
	      g.drawLine(0, 0, 100, 100);
	}

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JFrame f = new JFrame(&quot;FirstCapture&quot;);
		FirstCapture cf = new FirstCapture();
	    
	    f.addWindowListener(new WindowAdapter() {
	      public void windowClosing(WindowEvent e) {
	      player.close();
	      System.exit(0);}});
	    
	    f.add(&quot;Center&quot;,cf);
	    f.pack();
	    f.setSize(new Dimension(320,550));
	    f.setVisible(true);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		FrameGrabbingControl fgc=(FrameGrabbingControl)player.getControl(&quot;javax.media.control.FrameGrabbingControl&quot;);
		buffer=fgc.grabFrame();
		bufferToImage=new BufferToImage((VideoFormat)buffer.getFormat());
		image=bufferToImage.createImage(buffer);
		imagePanel.setImage(image);
		saveImage(image,&quot;D:/test.jpg&quot;);
	}
	public static void saveImage(Image image,String path)
	{
		BufferedImage bi=new BufferedImage(image.getWidth(null),image.getHeight(null),BufferedImage.TYPE_INT_RGB);
		Graphics2D g2 = bi.createGraphics();
		g2.drawImage(image, null, null);
		FileOutputStream fos=null;
		try {
				fos=new FileOutputStream(path);
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		JPEGImageEncoder je=JPEGCodec.createJPEGEncoder(fos);
		JPEGEncodeParam jp=je.getDefaultJPEGEncodeParam(bi);
		jp.setQuality(0.5f, false);
		je.setJPEGEncodeParam(jp);
		try {
			je.encode(bi);
			fos.close();
		} catch (ImageFormatException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
	class ImagePanel extends Panel 
	  {
	    public Image myimg = null;
	    
	    public ImagePanel() 
	    {
	      setLayout(null);
	      setSize(320,240);
	    }
	    
	    public void setImage(Image img) 
	    {
	      this.myimg = img;
	      repaint();
	    }
	    
	    public void paint(Graphics g) 
	    {
	      if (myimg != null) 
	      {
	        g.drawImage(myimg, 0, 0, this);
	      }
	      
	    }
	  }
	
}
</pre>
&nbsp;
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://linsl.javaeye.com/blog/187783#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 28 Apr 2008 22:26:14 +0800</pubDate>
        <link>http://linsl.javaeye.com/blog/187783</link>
        <guid>http://linsl.javaeye.com/blog/187783</guid>
      </item>
      <item>
        <title>【转】利用JMF进行多媒体编程 (二) </title>
        <author>linsl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://linsl.javaeye.com">linsl</a>&nbsp;
          链接：<a href="http://linsl.javaeye.com/blog/187348" style="color:red;">http://linsl.javaeye.com/blog/187348</a>&nbsp;
          发表时间: 2008年04月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><span style="font-size: 10pt; font-family: 宋体;">例子程序</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体;">由于</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF2.1</span><span style="font-size: 10pt; font-family: 宋体;">比较复杂，我不可能在在例子中包含</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF2.1</span><span style="font-size: 10pt; font-family: 宋体;">支持的所有功能。因此我选择了下面几个在</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF</span><span style="font-size: 10pt; font-family: 宋体;">中比较常用的功能</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">:</span><span style="font-size: 10pt; font-family: 宋体;">播放多媒体、注册音频和视频截取设备、截取视频和音频。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />1</span><span style="font-size: 10pt; font-family: 宋体;">．播放多媒体</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体;">在</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF.java</span><span style="font-size: 10pt; font-family: 宋体;">中有一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">play</span><span style="font-size: 10pt; font-family: 宋体;">（）方法。该方法可以播放用户选择的多媒体文件。当播放多媒体文件时，你需要一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象。在例子中，</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">dualPlayer</span><span style="font-size: 10pt; font-family: 宋体;">就是</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">接口的实现对象。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player&nbsp;dualPlayer;</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体;">在</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Play</span><span style="font-size: 10pt; font-family: 宋体;">（）方法中，通过使用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">FileDialog</span><span style="font-size: 10pt; font-family: 宋体;">获得媒体文件的路径和文件名，并保存在</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">filename</span><span style="font-size: 10pt; font-family: 宋体;">中。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="color: #0000ff;">try</span><span style="color: #000000;">&nbsp;<br />{<br />&nbsp;&nbsp;&nbsp;&nbsp;FileDialog&nbsp;fd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;FileDialog(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Select&nbsp;File</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;FileDialog.LOAD);<br />&nbsp;&nbsp;&nbsp;&nbsp;fd.show();<br />&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;filename&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;fd.getDirectory()&nbsp;</span><span style="color: #000000;">+</span><span style="color: #000000;">&nbsp;fd.getFile();<br />&nbsp;&nbsp;&nbsp;&nbsp;<img src="http://linsl.javaeye.com/Images/dot.gif" alt="" /><br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">catch</span><span style="color: #000000;">&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff;">out</span><span style="color: #000000;">.println(e.toString());<br />&nbsp;&nbsp;}<br /></span></div>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体;">然后你需要通过媒体管理器</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Manager</span><span style="font-size: 10pt; font-family: 宋体;">间接创建一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象。你可以使用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Manager</span><span style="font-size: 10pt; font-family: 宋体;">类的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">createPlayer</span><span style="font-size: 10pt; font-family: 宋体;">（）方法或者</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> createProcessor</span><span style="font-size: 10pt; font-family: 宋体;">（）方法来获得一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象或</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Processor</span><span style="font-size: 10pt; font-family: 宋体;">对象。在</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">play</span><span style="font-size: 10pt; font-family: 宋体;">（）方法中，我使用的是</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> createPlayer</span><span style="font-size: 10pt; font-family: 宋体;">（）方法。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">dualPlayer&nbsp;=&nbsp;Manager.createPlayer<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(new&nbsp;MediaLocator("file:///"&nbsp;+&nbsp;filename));</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体;">有时你需要使用一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象来控制多个其他的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">和</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Controller</span><span style="font-size: 10pt; font-family: 宋体;">对象，我们把这个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象称为主对象，并把这些对象组成</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">一个组。通过调用主对象中的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">start</span><span style="font-size: 10pt; font-family: 宋体;">（）、</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">stop</span><span style="font-size: 10pt; font-family: 宋体;">（）、</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">setMediaTime</span><span style="font-size: 10pt; font-family: 宋体;">（）等方法就可以激活组中所有成员的相应方法。主对象控制所有的状态</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">变化和事件发布。然后使用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">addControllerListerner</span><span style="font-size: 10pt; font-family: 宋体;">（）方法来将一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">ControllerListener</span><span style="font-size: 10pt; font-family: 宋体;">对象绑定到</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">象上，</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Controller</span><span style="font-size: 10pt; font-family: 宋体;">对象将向该</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">ControllerListener</span><span style="font-size: 10pt; font-family: 宋体;">对象发送事件消息。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">dualPlayer.addControllerListener(this);</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体;">最后需要调用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">start</span><span style="font-size: 10pt; font-family: 宋体;">（）方法来启动</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">start</span><span style="font-size: 10pt; font-family: 宋体;">（）方法将</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象的状态设置为</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Started</span><span style="font-size: 10pt; font-family: 宋体;">。如果</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">没有被实体化（</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Realize</span><span style="font-size: 10pt; font-family: 宋体;">）或预取（</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Prefetch</span><span style="font-size: 10pt; font-family: 宋体;">），</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">start</span><span style="font-size: 10pt; font-family: 宋体;">（）方法会自动执行这些操作。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">dualPlayer.start();</span></p>
<p><span style="font-size: 10pt; font-family: 宋体;">由于</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF</span><span style="font-size: 10pt; font-family: 宋体;">类实现了</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">ControllerLister</span><span style="font-size: 10pt; font-family: 宋体;">接口，因此需要实现该接口中的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">controllerUpdate</span><span style="font-size: 10pt; font-family: 宋体;">（）方法，该方法在</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Controller</span><span style="font-size: 10pt; font-family: 宋体;">对象产生一个事件时被调用。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;synchronized&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;controllerUpdate(ControllerEvent&nbsp;</span><span style="color: #0000ff;">event</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">event</span><span style="color: #000000;">&nbsp;instanceof&nbsp;RealizeCompleteEvent)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;Component&nbsp;comp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((comp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;dualPlayer.getVisualComponent())&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add&nbsp;(</span><span style="color: #000000;">"</span><span style="color: #000000;">Center</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;comp);<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;((comp&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;dualPlayer.getControlPanelComponent())&nbsp;</span><span style="color: #000000;">!=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add(</span><span style="color: #000000;">"</span><span style="color: #000000;">South</span><span style="color: #000000;">"</span><span style="color: #000000;">,&nbsp;comp);<br />&nbsp;&nbsp;&nbsp;&nbsp;validate();<br />&nbsp;&nbsp;}<br />}<br /></span></div>
<br /></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体;">当</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF</span><span style="font-size: 10pt; font-family: 宋体;">类产生了一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">RealizeCompleteEvent</span><span style="font-size: 10pt; font-family: 宋体;">事件后，</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">controllerUpdate</span><span style="font-size: 10pt; font-family: 宋体;">（）方法在界面上增加两个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Component</span><span style="font-size: 10pt; font-family: 宋体;">对象，一个用于播放媒体，一个用于放置控制按钮，例如播放、停止等。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<p><span style="font-size: 10pt; font-family: 宋体;">在运行程序的过程中，程序会产生下面的输出。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />&lt;!--[if !supportLineBreakNewLine]--&gt;
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="color: #000000;">Starting&nbsp;player&nbsp;<img src="http://linsl.javaeye.com/Images/dot.gif" alt="" />javax.media.TransitionEvent<br />&nbsp;&nbsp;[source</span><span style="color: #000000;">=</span><span style="color: #000000;">com.sun.media.content.video.mpeg.Handler@71bb78,<br />&nbsp;&nbsp;previous</span><span style="color: #000000;">=</span><span style="color: #000000;">Unrealized,<br />&nbsp;&nbsp;current</span><span style="color: #000000;">=</span><span style="color: #000000;">Realizing,<br />&nbsp;&nbsp;target</span><span style="color: #000000;">=</span><span style="color: #000000;">Started]<br />Open&nbsp;log&nbsp;file:&nbsp;C:\test\Java\JMF\JMF\jmf.log<br />javax.media.DurationUpdateEvent<br />&nbsp;&nbsp;[source</span><span style="color: #000000;">=</span><span style="color: #000000;">com.sun.media.content.video.mpeg.Handler@71bb78,duration</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />&nbsp;&nbsp;javax.media.Time@2a37a6<br />javax.media.RealizeCompleteEvent<br />[source</span><span style="color: #000000;">=</span><span style="color: #000000;">com.sun.media.content.video.mpeg.Handler@71bb78,<br />&nbsp;&nbsp;previous</span><span style="color: #000000;">=</span><span style="color: #000000;">Realizing,<br />&nbsp;&nbsp;current</span><span style="color: #000000;">=</span><span style="color: #000000;">Realized,<br />&nbsp;&nbsp;target</span><span style="color: #000000;">=</span><span style="color: #000000;">Started]<br />Adding&nbsp;visual&nbsp;component<br />Adding&nbsp;control&nbsp;panel<br />javax.media.TransitionEvent<br />&nbsp;&nbsp;[source</span><span style="color: #000000;">=</span><span style="color: #000000;">com.sun.media.content.video.mpeg.Handler@71bb78,<br />&nbsp;&nbsp;previous</span><span style="color: #000000;">=</span><span style="color: #000000;">Realized,<br />&nbsp;&nbsp;current</span><span style="color: #000000;">=</span><span style="color: #000000;">Prefetching,<br />&nbsp;&nbsp;target</span><span style="color: #000000;">=</span><span style="color: #000000;">Started]<br />javax.media.PrefetchCompleteEvent<br />&nbsp;&nbsp;[source</span><span style="color: #000000;">=</span><span style="color: #000000;">com.sun.media.content.video.mpeg.Handler@71bb78,<br />&nbsp;&nbsp;previous</span><span style="color: #000000;">=</span><span style="color: #000000;">Prefetching,<br />&nbsp;&nbsp;current</span><span style="color: #000000;">=</span><span style="color: #000000;">Prefetched,target</span><span style="color: #000000;">=</span><span style="color: #000000;">Started]<br />javax.media.StartEvent<br />&nbsp;&nbsp;[source</span><span style="color: #000000;">=</span><span style="color: #000000;">com.sun.media.content.video.mpeg.Handler@71bb78,<br />&nbsp;&nbsp;previous</span><span style="color: #000000;">=</span><span style="color: #000000;">Prefetched,<br />&nbsp;&nbsp;current</span><span style="color: #000000;">=</span><span style="color: #000000;">Started,<br />&nbsp;&nbsp;target</span><span style="color: #000000;">=</span><span style="color: #000000;">Started,<br />&nbsp;&nbsp;mediaTime</span><span style="color: #000000;">=</span><span style="color: #000000;">javax.media.Time@56a05e,timeBaseTime</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />&nbsp;&nbsp;javax.media.Time@3a8602]<br />javax.media.EndOfMediaEvent<br />&nbsp;&nbsp;[source</span><span style="color: #000000;">=</span><span style="color: #000000;">com.sun.media.content.video.mpeg.Handler@71bb78,<br />&nbsp;&nbsp;previous</span><span style="color: #000000;">=</span><span style="color: #000000;">Started,<br />&nbsp;&nbsp;current</span><span style="color: #000000;">=</span><span style="color: #000000;">Prefetched,<br />&nbsp;&nbsp;target</span><span style="color: #000000;">=</span><span style="color: #000000;">Prefetched,<br />&nbsp;&nbsp;mediaTime</span><span style="color: #000000;">=</span><span style="color: #000000;">javax.media.Time@1d332b]<br /></span></div>
<br />&lt;!--[endif]--&gt;</span><span style="font-size: 10pt; font-family: 宋体;">前面提到，当调用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">start</span><span style="font-size: 10pt; font-family: 宋体;">（）方法的时候，</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">会切换到</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Started</span><span style="font-size: 10pt; font-family: 宋体;">状态。从上面列出的信息中可以看到</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象的状态从</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> Unrealized</span><span style="font-size: 10pt; font-family: 宋体;">变成了</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Started</span><span style="font-size: 10pt; font-family: 宋体;">。当</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">EndOfMedia</span><span style="font-size: 10pt; font-family: 宋体;">事件被激活时（这时</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象完成了媒体文件的播放），状态从</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Started</span><span style="font-size: 10pt; font-family: 宋体;">变</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">成了</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Prefetched</span><span style="font-size: 10pt; font-family: 宋体;">。下图显示了程序正在播放多媒体文件时的情况。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br /><br />&lt;!--[if !supportLineBreakNewLine]--&gt;</span><span style="font-size: small; font-family: 宋体, MS Song;"> </span></p>
<p class="MsoNormal"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">2</span><span style="font-size: 10pt; font-family: 宋体;">．注册音频和视频截取设备</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<p><span style="font-size: 10pt; font-family: 宋体;">在例子中，注册音频和视频截取设备的方法只在程序的内部注册这些设备，在程序外则不起作用。该方法的作用是</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">当用户的计算机上存在多和音频和视频截取设备时，告诉程序因该使用哪个设备和这些设备支持的音频和视频格式。因此在进行截取处理之前需要获得设备的配置信</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">息。在例子中，当在</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Configure</span><span style="font-size: 10pt; font-family: 宋体;">菜单上按下</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Capture&nbsp;Device</span><span style="font-size: 10pt; font-family: 宋体;">命令后，会弹出</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">CaptureDeviceDialog</span><span style="font-size: 10pt; font-family: 宋体;">对话框。如果在截取</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">音频或视频前没有设定设备的配置，也会弹出该对话框。图三显示了该对话框。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />&lt;!--[if !supportLineBreakNewLine]--&gt;<br /></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体;">让我们来看一下</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">CaptureDeviceDialog</span><span style="font-size: 10pt; font-family: 宋体;">类中的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">init</span><span style="font-size: 10pt; font-family: 宋体;">（）方法：在初始化了界面之后，通过调用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">CaptureDeviceManager</span><span style="font-size: 10pt; font-family: 宋体;">类的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">getDeviceList</span><span style="font-size: 10pt; font-family: 宋体;">（）方法：</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">devices&nbsp;=&nbsp;CaptureDeviceManager.getDeviceList&nbsp;(&nbsp;null&nbsp;);</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">CaptureDeviceManager </span><span style="font-size: 10pt; font-family: 宋体;">类使用查询机制和一个注册表来定位设备，然后将设备的信息放入</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">CaptureDeviceInfo</span><span style="font-size: 10pt; font-family: 宋体;">对象中返回。我们还可以利用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> CaptureDeviceManager</span><span style="font-size: 10pt; font-family: 宋体;">类来注册新的设备。通过调用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">getDeviceList</span><span style="font-size: 10pt; font-family: 宋体;">（）方法程序获取了一个支持指定格式的设备的列表。在例</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">子中，我将格式参数设定为</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">null</span><span style="font-size: 10pt; font-family: 宋体;">，这意味着设备可以使用任何格式。返回值被放入</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">device</span><span style="font-size: 10pt; font-family: 宋体;">变量中。如果</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">getDeviceList</span><span style="font-size: 10pt; font-family: 宋体;">（）方法返回的是一</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">个非空值，程序会将包含在其中的音频设备名称和视频设备名称分别放入两个下拉列表中中，但是到目前为止我们还不知道哪些设备是音频设备，哪些是视频设备。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> &nbsp;</span></p>
<p><span style="font-size: 10pt; font-family: 宋体;">我们可以通过</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">CaptureDeviceInfo</span><span style="font-size: 10pt; font-family: 宋体;">的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">getFormat</span><span style="font-size: 10pt; font-family: 宋体;">（）方法获得</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Format</span><span style="font-size: 10pt; font-family: 宋体;">对象组数，在</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Format</span><span style="font-size: 10pt; font-family: 宋体;">对象中保存了</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">设备支持的媒体格式。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Format</span><span style="font-size: 10pt; font-family: 宋体;">类间接被</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">AudioFormat</span><span style="font-size: 10pt; font-family: 宋体;">和</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">VideoFormat</span><span style="font-size: 10pt; font-family: 宋体;">类所继承。因此我们可以利用设备支持的格式类型来区分设备的类</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">型：</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(devices</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">&amp;</span><span style="color: #000000;">&nbsp;devices.size()</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">0</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;deviceCount&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;devices.size();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;audioDevices&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Vector();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;videoDevices&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;Vector();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Format[]&nbsp;formats;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;i&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;deviceCount;&nbsp;&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cdi&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(CaptureDeviceInfo)&nbsp;devices.elementAt&nbsp;(&nbsp;i&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;formats&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cdi.getFormats();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;j</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;&nbsp;j</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">formats.length;&nbsp;j</span><span style="color: #000000;">++</span><span style="color: #000000;">&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(&nbsp;formats[j]&nbsp;instanceof&nbsp;AudioFormat&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;audioDevices.addElement(cdi);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(formats[j]&nbsp;instanceof&nbsp;VideoFormat&nbsp;)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;videoDevices.addElement(cdi);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">break</span><span style="color: #000000;">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.&nbsp;.&nbsp;.<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></div>
&lt;!--[endif]--&gt;</span><br /><span style="font-size: 10pt; font-family: 宋体;">上面的程序运行后，</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">audioDevices</span><span style="font-size: 10pt; font-family: 宋体;">（）中将包含所有的音频设备，</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">videoDevices</span><span style="font-size: 10pt; font-family: 宋体;">（）中将保存所有的视频设备。其中</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">cdi</span><span style="font-size: 10pt; font-family: 宋体;">是</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">CaptureDeviceInfo</span><span style="font-size: 10pt; font-family: 宋体;">对象。然后将设备名称填入下拉列表中：</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><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;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">audioDevices.size();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cdi&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(CaptureDeviceInfo)&nbsp;audioDevices.elementAt(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;audioDeviceCombo.addItem(cdi.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;i</span><span style="color: #000000;">=</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;i</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">videoDevices.size();&nbsp;i</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cdi&nbsp;&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;(CaptureDeviceInfo)&nbsp;videoDevices.elementAt(i);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;videoDeviceCombo.addItem(cdi.getName());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /></span></div>
</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体;">然后程序显示出当前选中的设备支持的格式：</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />displayAudioFormats();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;displayVideoFormats();</span></p>
<p><span style="font-size: 10pt; font-family: 宋体;">下一步需要获取用户选中的音频设备和视频设备以及它们支持的格式，相关的方法是</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF</span><span style="font-size: 10pt; font-family: 宋体;">类中的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">getAudioDevice</span><span style="font-size: 10pt; font-family: 宋体;">（）、</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> getVideoDevice</span><span style="font-size: 10pt; font-family: 宋体;">（）、</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">getAudioFormat</span><span style="font-size: 10pt; font-family: 宋体;">（）和</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">getVideoFormat</span><span style="font-size: 10pt; font-family: 宋体;">（）方法。然后将获取的对象分别保存到</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> audioCDI</span><span style="font-size: 10pt; font-family: 宋体;">，</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">videoCDI</span><span style="font-size: 10pt; font-family: 宋体;">，</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">audioFormat</span><span style="font-size: 10pt; font-family: 宋体;">和</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">videoFormat</span><span style="font-size: 10pt; font-family: 宋体;">中：</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="color: #000000;">audioCDI&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cdDialog.getAudioDevice();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(audioCDI</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;audioDeviceName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;audioCDI.getName();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff;">out</span><span style="color: #000000;">.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Audio&nbsp;Device&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;audioDeviceName);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;videoCDI&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cdDialog.getVideoDevice();<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;(videoCDI</span><span style="color: #000000;">!=</span><span style="color: #0000ff;">null</span><span style="color: #000000;">)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;videoDeviceName&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;videoCDI.getName();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.</span><span style="color: #0000ff;">out</span><span style="color: #000000;">.println(</span><span style="color: #000000;">"</span><span style="color: #000000;">Video&nbsp;Device&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;videoDeviceName);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&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;videoFormat&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cdDialog.getVideoFormat();<br />&nbsp;&nbsp;&nbsp;&nbsp;audioFormat&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;cdDialog.getAudioFormat();<br />&nbsp;<br /></span></div>
&lt;!--[endif]--&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> &lt;!--[endif]--&gt;</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">3</span><span style="font-size: 10pt; font-family: 宋体;">．截取视频和音频</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br /><br /></span><span style="font-size: 10pt; font-family: 宋体;">使用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">capture</span><span style="font-size: 10pt; font-family: 宋体;">（）方法可以截取音频和视频数据。但是在使用该方法前需要确定是否已经选中了视频和音频截取设备：</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br /><br />if&nbsp;(audioCDI==null&nbsp;&amp;#38;&amp;#38;&nbsp;videoCDI==null)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;registerDevices();<br /></span><span style="font-size: 10pt; font-family: 宋体;">和</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">play</span><span style="font-size: 10pt; font-family: 宋体;">（）方法类似，可以通过使用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Manger</span><span style="font-size: 10pt; font-family: 宋体;">类中的静态方法</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">createPlayer</span><span style="font-size: 10pt; font-family: 宋体;">（）创建一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象，该对象可以播放一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">DataSource</span><span style="font-size: 10pt; font-family: 宋体;">对象中的数据流。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />Player.createPlayer(MediaLocator&nbsp;sourceLocator)<br /></span><span style="font-size: 10pt; font-family: 宋体;">在</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">例子中，我首先通过调用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">audioCDI</span><span style="font-size: 10pt; font-family: 宋体;">和</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">videoCDI</span><span style="font-size: 10pt; font-family: 宋体;">的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">getLocator</span><span style="font-size: 10pt; font-family: 宋体;">（）方法来获得</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">MediaLocator</span><span style="font-size: 10pt; font-family: 宋体;">对象，然后利用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Manager </span><span style="font-size: 10pt; font-family: 宋体;">类的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">createPlayer</span><span style="font-size: 10pt; font-family: 宋体;">（）方法创建</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象。最后将一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">ControllerListener</span><span style="font-size: 10pt; font-family: 宋体;">对象绑定到视频</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象上并开始播放。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="color: #000000;">videoPlayer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Manager.createPlayer(videoCDI.getLocator());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;audioPlayer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Manager.createPlayer(audioCDI.getLocator());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;videoPlayer.addControllerListener(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;videoPlayer.start();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;audioPlayer.start();<br /></span></div>
<br /></span><span style="font-size: 10pt; font-family: 宋体;">使用这种方法导致最后获得了两个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象。我们也可以使用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Manager</span><span style="font-size: 10pt; font-family: 宋体;">类中的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">createDataSource</span><span style="font-size: 10pt; font-family: 宋体;">（）方法从视频和音频</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> CaptureDeviceInfo</span><span style="font-size: 10pt; font-family: 宋体;">对象（</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">audioCID</span><span style="font-size: 10pt; font-family: 宋体;">和</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">videoCDI</span><span style="font-size: 10pt; font-family: 宋体;">）中获得视频和音频数据源（</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">DataSource</span><span style="font-size: 10pt; font-family: 宋体;">对象），然后调用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> createMergingDataSource</span><span style="font-size: 10pt; font-family: 宋体;">（）方法将两个数据源合并成一个数据源（</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">ds</span><span style="font-size: 10pt; font-family: 宋体;">）：</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;<br />&lt;!--[if !supportLineBreakNewLine]--&gt;<br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="color: #000000;">DataSource[]&nbsp;dataSources&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;DataSource[</span><span style="color: #000000;">2</span><span style="color: #000000;">];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSources[</span><span style="color: #000000;">0</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Manager.createDataSource(audioCDI.getLocator());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataSources[</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Manager.createDataSource(videoCDI.getLocator());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataSource&nbsp;ds&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Manager.createMergingDataSource(dataSources);<br /></span></div>
&lt;!--[endif]--&gt;</span><span style="font-size: 10pt; font-family: 宋体;">然后可以使用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">ds</span><span style="font-size: 10pt; font-family: 宋体;">作为</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">createPlayer</span><span style="font-size: 10pt; font-family: 宋体;">（）方法的参数来获得一个</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Player</span><span style="font-size: 10pt; font-family: 宋体;">对象</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">dualPlayer</span><span style="font-size: 10pt; font-family: 宋体;">。调用</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">addControllerListener</span><span style="font-size: 10pt; font-family: 宋体;">（）就可以进行播放了。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> <br />
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 98%; padding-top: 4px; background-color: #eeeeee; border: #cccccc 1px solid;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br><a href="http://www.CodeHighlighter.com/" target="_blank">http://www.CodeHighlighter.com/</a><br><br>--><span style="color: #000000;">dualPlayer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Manager.createPlayer(ds);<br />dualPlayer.addControllerListener(</span><span style="color: #0000ff;">this</span><span style="color: #000000;">);<br />dualPlayer.start();<br /></span></div>
</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 宋体;">小结</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';"></span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Java </span><span style="font-size: 10pt; font-family: 宋体;">多媒体框架是一个很好的多媒体编程工具。在这篇文章中我只是简单介绍了</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF</span><span style="font-size: 10pt; font-family: 宋体;">的一些基本功能。如果有兴趣的话可以仔细阅读一下</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Sun</span><span style="font-size: 10pt; font-family: 宋体;">公司的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Java</span><span style="font-size: 10pt; font-family: 宋体;">网站上</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">提供的</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMStudio</span><span style="font-size: 10pt; font-family: 宋体;">的例子。在</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMStudio</span><span style="font-size: 10pt; font-family: 宋体;">中不仅实现了简单的播放和视频／音频截取功能，还实现了从互联网下载和向互联网上传多媒体数据流的功</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';"> </span><span style="font-size: 10pt; font-family: 宋体;">能。而且它还包含了</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMFRegistry</span><span style="font-size: 10pt; font-family: 宋体;">的源代码，将相应的代码移植到你的应用程序中后，你就不需要在运行程序前运行</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMFRegistry</span><span style="font-size: 10pt; font-family: 宋体;">来向</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF </span><span style="font-size: 10pt; font-family: 宋体;">注册设备了。</span><span lang="EN-US" style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
          <br/>
          <span style="color:red;">
            <a href="http://linsl.javaeye.com/blog/187348#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 27 Apr 2008 20:36:20 +0800</pubDate>
        <link>http://linsl.javaeye.com/blog/187348</link>
        <guid>http://linsl.javaeye.com/blog/187348</guid>
      </item>
      <item>
        <title>【转】利用JMF进行多媒体编程 (一)</title>
        <author>linsl</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://linsl.javaeye.com">linsl</a>&nbsp;
          链接：<a href="http://linsl.javaeye.com/blog/187339" style="color:red;">http://linsl.javaeye.com/blog/187339</a>&nbsp;
          发表时间: 2008年04月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Java</span><span style="font-size: 10pt; font-family: 宋体;">媒体框架（</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF</span><span style="font-size: 10pt; font-family: 宋体;">）使你能够编写出功能强大的多媒体程序，却不用关心底层复杂的实现细节。</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF&nbsp;API</span><span style="font-size: 10pt; font-family: 宋体;">的使用相对比较简单，但是能够满足几乎所有多媒体编程的需求。在这篇文章中，我将向你介绍如何用很少的代码就编写出多媒体程序。</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">Java</span><span style="font-size: 10pt; font-family: 宋体;">多媒体框架（</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF</span><span style="font-size: 10pt; font-family: 宋体;">）中包含了许多用于处理多媒体的</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">API</span><span style="font-size: 10pt; font-family: 宋体;">。它是一个相当复杂的系统，完全了解这个系统可能需要花上几周的时间，但是这篇文章将主要介绍</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">JMF</span><span style="font-size: 10pt; font-family: 宋体;">的几个核心接口和类，然后通过一个简单的例子向你展示如何利用该接口进行编程。</span><span style="font-size: 10pt; font-family: 'Verdana','sans-serif';">&nbsp;</span></p>
<p class="MsoNormal" style="text-indent: 21pt;"><span style="font-size: