﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-paulwong-随笔分类-J2SE</title><link>http://www.blogjava.net/paulwong/category/11300.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 20 May 2022 01:15:01 GMT</lastBuildDate><pubDate>Fri, 20 May 2022 01:15:01 GMT</pubDate><ttl>60</ttl><item><title>openJDK无法进行jmap</title><link>http://www.blogjava.net/paulwong/archive/2022/05/19/450751.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 19 May 2022 05:53:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/05/19/450751.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/450751.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/05/19/450751.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/450751.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/450751.html</trackback:ping><description><![CDATA[<a href="https://blog.csdn.net/qq_32447301/article/details/85109014" target="_blank">https://blog.csdn.net/qq_32447301/article/details/85109014</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/450751.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2022-05-19 13:53 <a href="http://www.blogjava.net/paulwong/archive/2022/05/19/450751.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>API接口中的敏感数据的加密与解密</title><link>http://www.blogjava.net/paulwong/archive/2022/05/11/450742.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 11 May 2022 06:37:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2022/05/11/450742.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/450742.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2022/05/11/450742.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/450742.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/450742.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 签名为防止request中的json在传输过程中被更改，     需要在传送双方保存一个字符串sinature-key     用SHA256 hash请求中的json字符串，结果为hash1     {"payload":hash1}以此为字符和sinature-key用JWS HS256算法进行签名，得到sinature1     在请求的json中加入字段："sina...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2022/05/11/450742.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/450742.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2022-05-11 14:37 <a href="http://www.blogjava.net/paulwong/archive/2022/05/11/450742.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>免注册JDK下载</title><link>http://www.blogjava.net/paulwong/archive/2021/08/25/435953.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 25 Aug 2021 08:17:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/08/25/435953.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435953.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/08/25/435953.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435953.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435953.html</trackback:ping><description><![CDATA[<a href="https://repo.huaweicloud.com/java/jdk/" target="_blank">https://repo.huaweicloud.com/java/jdk/</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435953.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-08-25 16:17 <a href="http://www.blogjava.net/paulwong/archive/2021/08/25/435953.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSR-303 Bean Validation - @Size和@Max@Min的区别</title><link>http://www.blogjava.net/paulwong/archive/2021/04/29/435867.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 29 Apr 2021 01:55:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/04/29/435867.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435867.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/04/29/435867.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435867.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435867.html</trackback:ping><description><![CDATA[<p style="margin-top: 0px; margin-right: 0px; margin-bottom: var(--s-prose-spacing); margin-left: 0px; padding: 0px; border: 0px; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-stretch: inherit; line-height: inherit; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 15px; vertical-align: baseline; box-sizing: inherit; clear: both; color: #242729; background-color: #ffffff;"><code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">@Min</code>&nbsp;and&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">@Max</code>&nbsp;are used for validating numeric fields which could be&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">String</code>(representing number),&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">int</code>,&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">short</code>,&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">byte</code>&nbsp;etc and their respective primitive wrappers.<br /><br /></p><p style="margin-top: 0px; margin-right: 0px; margin-bottom: var(--s-prose-spacing); margin-left: 0px; padding: 0px; border: 0px; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-stretch: inherit; line-height: inherit; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 15px; vertical-align: baseline; box-sizing: inherit; clear: both; color: #242729; background-color: #ffffff;"><code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">@Size</code>&nbsp;is used to check the length constraints on the fields.<br /><br /></p><p style="margin: 0px; padding: 0px; border: 0px; font-variant-numeric: inherit; font-variant-east-asian: inherit; font-stretch: inherit; line-height: inherit; font-family: Arial, &quot;Helvetica Neue&quot;, Helvetica, sans-serif; font-size: 15px; vertical-align: baseline; box-sizing: inherit; clear: both; color: #242729; background-color: #ffffff;">As per documentation&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">@Size</code>&nbsp;supports&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">String</code>,&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">Collection</code>,&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">Map</code>&nbsp;and&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">arrays</code>&nbsp;while&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">@Min</code>&nbsp;and&nbsp;<code style="margin: 0px; padding: 2px 4px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: Consolas, Menlo, Monaco, &quot;Lucida Console&quot;, &quot;Liberation Mono&quot;, &quot;DejaVu Sans Mono&quot;, &quot;Bitstream Vera Sans Mono&quot;, &quot;Courier New&quot;, monospace, sans-serif; font-size: 13px; vertical-align: baseline; box-sizing: inherit; background-color: var(--black-075); white-space: pre-wrap; color: var(--black-800); border-radius: 3px;">@Max</code>&nbsp;supports primitives and their wrappers. See the&nbsp;<a href="http://docs.jboss.org/hibernate/stable/validator/reference/en-US/html_single/" rel="noreferrer" style="margin: 0px; padding: 0px; border: 0px; font-style: inherit; font-variant: inherit; font-weight: inherit; font-stretch: inherit; line-height: inherit; font-family: inherit; vertical-align: baseline; box-sizing: inherit; cursor: pointer; user-select: auto;">documentation</a>.</p><img src ="http://www.blogjava.net/paulwong/aggbug/435867.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-04-29 09:55 <a href="http://www.blogjava.net/paulwong/archive/2021/04/29/435867.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java泛型 方法返回值带有泛型 &lt;T&gt;</title><link>http://www.blogjava.net/paulwong/archive/2021/03/19/435828.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 19 Mar 2021 07:10:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/03/19/435828.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435828.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/03/19/435828.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435828.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435828.html</trackback:ping><description><![CDATA[<p style="box-sizing: border-box; outline: 0px; --tw-shadow:0 0 #0000 ; --tw-ring-inset:var(--tw-empty, ); --tw-ring-offset-width:0px; --tw-ring-offset-color:#fff; --tw-ring-color:rgba(66, 153, 225, 0.5); --tw-ring-offset-shadow:0 0 #0000; --tw-ring-shadow:0 0 #0000 ; margin: 0px 0px 16px; padding: 0px; font-size: 16px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word; font-family: -apple-system, &quot;SF UI Text&quot;, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif, SimHei, SimSun; background-color: #ffffff; line-height: 26px !important;"><img src="https://img-blog.csdn.net/20181010111503937?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MjA3MTg3NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70" alt="" /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><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: #808080; ">@param</span><span style="color: #008000; ">&nbsp;&lt;T&gt;声明此方法持有一个类型T，也可以理解为声明此方法为泛型方法<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;clazz&nbsp;作用是指明泛型T的具体类型<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; ">&nbsp;指明该方法的返回值为类型T<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;InstantiationException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;IllegalAccessException<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;&lt;T&gt;&nbsp;T&nbsp;getObject(Class&lt;T&gt;&nbsp;clazz)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;InstantiationException,&nbsp;IllegalAccessException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T&nbsp;t&nbsp;=&nbsp;clazz.newInstance();<span style="color: #008000; ">//</span><span style="color: #008000; ">创建对象</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;t;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</div><p style="box-sizing: border-box; outline: 0px; --tw-shadow:0 0 #0000 ; --tw-ring-inset:var(--tw-empty, ); --tw-ring-offset-width:0px; --tw-ring-offset-color:#fff; --tw-ring-color:rgba(66, 153, 225, 0.5); --tw-ring-offset-shadow:0 0 #0000; --tw-ring-shadow:0 0 #0000 ; margin: 0px 0px 16px; padding: 0px; font-size: 16px; color: #4d4d4d; overflow: auto hidden; overflow-wrap: break-word; font-family: -apple-system, &quot;SF UI Text&quot;, Arial, &quot;PingFang SC&quot;, &quot;Hiragino Sans GB&quot;, &quot;Microsoft YaHei&quot;, &quot;WenQuanYi Micro Hei&quot;, sans-serif, SimHei, SimSun; background-color: #ffffff; line-height: 26px !important;">方法返回值前的&lt;T&gt;的左右是告诉编译器，当前的方法的值传入类型可以和类初始化的泛型类不同，也就是该方法的泛型类可以自定义，不需要跟类初始化的泛型类相同</p><img src ="http://www.blogjava.net/paulwong/aggbug/435828.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-03-19 15:10 <a href="http://www.blogjava.net/paulwong/archive/2021/03/19/435828.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSR-303 Bean Validation - Date String Validation </title><link>http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 25 Feb 2021 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435810.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435810.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435810.html</trackback:ping><description><![CDATA[@Past @Future只针对Date类型的验证，如果是String类型的验证，则不适用。<br />其实可以新加一个方法返回Date类型，再配合@Future@Past&nbsp;进行验证。<br /><br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->@Future(message&nbsp;=&nbsp;"Invalid&nbsp;CN_ID_INFO.EXPIRE_DATE.")<br /><span style="color: #0000FF; ">private</span>&nbsp;LocalDate&nbsp;getValidExpireDate()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;LocalDate.parse(this.dateString,&nbsp;DateTimeFormatter.ofPattern("yyyy-MM-dd"));<br />&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />}</div><br />此方法对dateString进行解释，返回LocalDate，如果dateString为空或格式错误，则返回空，再配合@Future&nbsp;进行是否未来日期的验证。<br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435810.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-02-25 09:44 <a href="http://www.blogjava.net/paulwong/archive/2021/02/25/435810.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSR-303 Bean Validation - Conditional Validation</title><link>http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 25 Feb 2021 01:24:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435809.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435809.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435809.html</trackback:ping><description><![CDATA[bean validation的注释是针对单个变量的，如果要针对多个变量的联动，则不行，需要用到这个注释。<br />这种方法避免了自定义校验器而增加类。<br /><a href="https://www.chkui.com/article/java/java_bean_validation" target="_blank">https://www.chkui.com/article/java/java_bean_validation</a><br /><br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->@AssertTrue(message&nbsp;=&nbsp;"Missing&nbsp;BANK_CARD_IMG_INFO.IMG")<br />
<span style="color: #0000FF; ">private</span>&nbsp;Boolean&nbsp;getValidImg()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>(YNEnum.Y.code.equals(<span style="color: #0000FF; ">super</span>.getNeedChecked()))&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;StringUtils.hasText(<span style="color: #0000FF; ">this</span>.img);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<span style="color: #008000; ">//</span><span style="color: #008000; ">igore&nbsp;checking.</span><span style="color: #008000; "><br />
</span>}</div><br />这个是当needChecked为Y的时候才执行检查img变量是否为空。<br />有几点注意：<br /><ol><li>方法名称要以get开头<br /></li><li>返回类型用Boolean，而不用boolean<br /></li><li>返回值有三种：true,false,null如果是null则当成通过，与true的结果一样</li></ol><img src ="http://www.blogjava.net/paulwong/aggbug/435809.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-02-25 09:24 <a href="http://www.blogjava.net/paulwong/archive/2021/02/25/435809.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java8中文件转Base64和Base64转文件</title><link>http://www.blogjava.net/paulwong/archive/2021/01/07/435767.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 07 Jan 2021 01:44:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2021/01/07/435767.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435767.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2021/01/07/435767.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435767.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435767.html</trackback:ping><description><![CDATA[有几个项目中，都需要将图片或者数字证书的文件转为Base64，昨天写代码的时候，发现在jdk8中本就含有关于Base64的API。<br /><br />从此后不再需要其他的jar包来转换Base64了!!!<br /><br />据说是JDK8加入的。<br /><br /><br />先是将文件转为Base64：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;encryptToBase64(String&nbsp;filePath)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(filePath&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;b&nbsp;=&nbsp;Files.readAllBytes(Paths.get(filePath));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;Base64.getEncoder().encodeToString(b);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />Files、Paths类是JDK7里加入的，读取文件不再需要调用IO包里的FileInputStream，简单便捷。<br />字符串参数filePath是文件的路径。<br /><br />首先是将文件读成二进制码，然后通过Base64.getEncoder().encodeToString()方法将二进制码转换为Base64值。<br /><br /><br />然后是将Base64转为文件：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;decryptByBase64(String&nbsp;base64,&nbsp;String&nbsp;filePath)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(base64&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;filePath&nbsp;==&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"生成文件失败，请给出相应的数据。";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Files.write(Paths.get(filePath),&nbsp;Base64.getDecoder().decode(base64),StandardOpenOption.CREATE);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"指定路径下生成文件成功！";<br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />字符串参数base64指的是文件的Base64值，filePath是指的文件将要保存的位置。<br />通过Files.write()方法轻松将文件写入指定位置，不再调用FileOutStream方法。<br /><br />第三个参数StandardOpenOption.CREATE是处理文件的方式，我设置的是不管路径下有或没有，都创建这个文件，有则覆盖。<br /><br />在StandardOpenOption类中有很多参数可调用，不再累赘。<img src ="http://www.blogjava.net/paulwong/aggbug/435767.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2021-01-07 09:44 <a href="http://www.blogjava.net/paulwong/archive/2021/01/07/435767.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开始日期与结束日期的用法</title><link>http://www.blogjava.net/paulwong/archive/2020/12/29/435759.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 29 Dec 2020 02:37:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/12/29/435759.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435759.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/12/29/435759.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435759.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435759.html</trackback:ping><description><![CDATA[通常要用到取某个时间段内的数据，那么时间段要如何定义？<br />
取2020-12-01这天的数据，"2020-12-01 00:00:00" &lt;= time &lt; "2020-12-02 00:00:00"。<br />
apache common3中提供了相应的方法：<br />
<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->startDate&nbsp;=&nbsp;DateUtils.parseDate(startDateStr,&nbsp;DATE_PATTERN);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />String&nbsp;endDateStr&nbsp;=&nbsp;args.getOptionValues(END_DATE).get(0);<br />endDate&nbsp;=&nbsp;DateUtils.parseDate(endDateStr,&nbsp;DATE_PATTERN);<br /><br /><span style="color: #008000; ">//</span><span style="color: #008000; ">清零开始日期，返回类似2020-12-01&nbsp;00:00:00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; "><br /></span>startDate&nbsp;=&nbsp;DateUtils.truncate(startDate,&nbsp;Calendar.DATE);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">取结束日期的上限，返回隔天的时间，2020-12-02&nbsp;00:00:00</span><span style="color: #008000; "><br /></span>endDate&nbsp;=&nbsp;DateUtils.ceiling(endDate,&nbsp;Calendar.DATE);"。<br />apache&nbsp;common3中提供了相应的方法：</div><img src ="http://www.blogjava.net/paulwong/aggbug/435759.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-12-29 10:37 <a href="http://www.blogjava.net/paulwong/archive/2020/12/29/435759.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java的BIO和NIO很难懂？用代码实践给你看，再不懂我转行！</title><link>http://www.blogjava.net/paulwong/archive/2020/12/02/435737.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 02 Dec 2020 00:52:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/12/02/435737.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435737.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/12/02/435737.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435737.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435737.html</trackback:ping><description><![CDATA[<a href="http://www.52im.net/thread-2846-1-1.html" target="_blank">http://www.52im.net/thread-2846-1-1.html</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435737.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-12-02 08:52 <a href="http://www.blogjava.net/paulwong/archive/2020/12/02/435737.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Pretty print JSON using org.json library in Java</title><link>http://www.blogjava.net/paulwong/archive/2020/10/28/435709.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 28 Oct 2020 09:17:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/10/28/435709.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435709.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/10/28/435709.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435709.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435709.html</trackback:ping><description><![CDATA[<h2>Syntax</h2><pre notranslate=""  prettyprinted"="" style="font-family: monospace, monospace; font-size: 0.95em; background-color: #f7f7f7; border: 1px solid #dedede; padding: 5px; overflow: auto; margin-top: 15px; margin-bottom: 10px; border-radius: 0px; color: rgba(0, 0, 0, 0.87); background-image: initial !important; background-position: initial !important; background-size: initial !important; background-repeat: initial !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important;"><span style="color: #000088;">public</span><span style="color: #000000;"> java</span><span style="color: #666600;">.</span><span style="color: #000000;">lang</span><span style="color: #666600;">.</span><span style="color: #660066;">String</span><span style="color: #000000;"> toString</span><span style="color: #666600;">(</span><span style="color: #000088;">int</span><span style="color: #000000;"> indentFactor</span><span style="color: #666600;">)</span> <span style="color: #000088;">throws</span> <span style="color: #660066;">JSONException</span></pre><h2>Example</h2><pre notranslate=""  prettyprinted"="" style="font-family: monospace, monospace; font-size: 0.95em; background-color: #f7f7f7; border: 1px solid #dedede; padding: 5px; overflow: auto; margin-top: 15px; margin-bottom: 10px; border-radius: 0px; color: rgba(0, 0, 0, 0.87); background-image: initial !important; background-position: initial !important; background-size: initial !important; background-repeat: initial !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span><span style="color: #000000; ">&nbsp;org.json.</span><span style="color: #000000; ">*</span><span style="color: #000000; ">;<br /></span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">class</span><span style="color: #000000; ">&nbsp;JSONPrettyPrintTest&nbsp;{<br />&nbsp;&nbsp;&nbsp;</span><span style="color: #0000FF; ">public</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">static</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">void</span><span style="color: #000000; ">&nbsp;main(String&nbsp;args[])&nbsp;</span><span style="color: #0000FF; ">throws</span><span style="color: #000000; ">&nbsp;JSONException&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;json&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">{</span><span style="color: #000000; ">"</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Name&nbsp;:&nbsp;Jai,</span><span style="color: #000000; ">"</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Age&nbsp;:&nbsp;25,&nbsp;</span><span style="color: #000000; ">"</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Salary:&nbsp;25000.00&nbsp;</span><span style="color: #000000; ">"</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;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #000000; ">"</span><span style="color: #000000; ">}</span><span style="color: #000000; ">"</span><span style="color: #000000; ">;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;JSONObject&nbsp;jsonObj&nbsp;</span><span style="color: #000000; ">=</span><span style="color: #000000; ">&nbsp;</span><span style="color: #0000FF; ">new</span><span style="color: #000000; ">&nbsp;JSONObject(json);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(</span><span style="color: #000000; ">"</span><span style="color: #000000; ">Pretty&nbsp;Print&nbsp;of&nbsp;JSON:</span><span style="color: #000000; ">"</span><span style="color: #000000; ">);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(jsonObj.toString(</span><span style="color: #000000; ">4</span><span style="color: #000000; ">));&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;pretty&nbsp;print&nbsp;json</span><span style="color: #008000; "><br /></span><span style="color: #000000; ">&nbsp;&nbsp;&nbsp;}<br />}</span></div></pre><h2>Output</h2><pre notranslate"="" style="font-family: monospace, monospace; font-size: 0.95em; background-color: #f7f7f7; border: 1px solid #dedede; padding: 5px; overflow: auto; margin-top: 0px; margin-bottom: 0px; border-radius: 0px; color: rgba(0, 0, 0, 0.87); background-image: initial !important; background-position: initial !important; background-size: initial !important; background-repeat: initial !important; background-attachment: initial !important; background-origin: initial !important; background-clip: initial !important;"><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #000000; ">Pretty&nbsp;Print&nbsp;of&nbsp;JSON:<br />{<br />&nbsp;&nbsp;&nbsp;"Salary":&nbsp;25000,<br />&nbsp;&nbsp;&nbsp;"Age":&nbsp;25,<br />&nbsp;&nbsp;&nbsp;"Name":&nbsp;"Jai"<br />}</span></div></pre><img src ="http://www.blogjava.net/paulwong/aggbug/435709.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-10-28 17:17 <a href="http://www.blogjava.net/paulwong/archive/2020/10/28/435709.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Scheduling a task in Java within a CompletableFuture</title><link>http://www.blogjava.net/paulwong/archive/2020/08/24/435646.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 24 Aug 2020 01:06:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/08/24/435646.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435646.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/08/24/435646.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435646.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435646.html</trackback:ping><description><![CDATA[<p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">When we want to do something later in our Java code, we often turn to the&nbsp;<a href="https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/util/concurrent/ScheduledExecutorService.html" style="box-sizing: inherit; border-width: 0px 0px 1px; border-top-style: initial; border-right-style: initial; border-bottom-style: solid; border-left-style: initial; border-top-color: initial; border-right-color: initial; border-bottom-color: #333333; border-left-color: initial; border-image: initial; font-family: inherit; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; text-decoration-line: none;">ScheduledExecutorService</a>. This class has a method called&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">schedule()</tt>, and we can pass it some code to be run later like this:<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->ScheduledExecutorService&nbsp;executor&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;Executors.newScheduledThreadPool(4);<br />executor.schedule(<br />&nbsp;&nbsp;&nbsp;&nbsp;()&nbsp;-&gt;&nbsp;{System.out.println("..later");},<br />&nbsp;&nbsp;&nbsp;&nbsp;1,<br />&nbsp;&nbsp;&nbsp;&nbsp;TimeUnit.SECONDS<br />);<br />System.out.println("do<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />");<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;(Don't&nbsp;forget&nbsp;to&nbsp;shut&nbsp;down&nbsp;the&nbsp;executor&nbsp;later<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />)</span></div><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">The above code prints &#8220;do&#8230;&#8221; and then one second later it prints &#8220;&#8230;later&#8221;.</p><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">We can even write code that does some work and returns a result in a similar way:<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;(Make&nbsp;the&nbsp;executor&nbsp;as&nbsp;above.)</span><span style="color: #008000; "><br /></span>ScheduledFuture&nbsp;future&nbsp;=&nbsp;executor.schedule(<br />&nbsp;&nbsp;&nbsp;&nbsp;()&nbsp;-&gt;&nbsp;10&nbsp;+&nbsp;25,&nbsp;1,&nbsp;TimeUnit.SECONDS);<br />System.out.println("answer="&nbsp;+&nbsp;future.get())</div><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;"><br />The above code prints &#8220;answer=35&#8221;. When we call&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">get()</tt>&nbsp;it blocks waiting for the scheduler to run the task and mark the&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">ScheduledFuture</tt>&nbsp;as complete, and then returns the answer to the sum (10 + 25) when it is ready.</p><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">This is all very well, but you may note that the Future returned from&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">schedule()</tt>&nbsp;is a&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">ScheduledFuture</tt>, and a&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">ScheduledFuture</tt>&nbsp;is not a&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">CompletableFuture</tt>.</p><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">Why do you care? Well, you might care if you want to do something after the scheduled task is completed. Of course, you can call get(), and block, and then do something, but if you want to react asynchronously without blocking, this won&#8217;t work.</p><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">The normal way to run some code after a Future has completed is to call one of the &#8220;then*&#8221; or &#8220;when*&#8221; methods on the Future, but these methods are only available on&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">CompletableFuture</tt>, not&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">ScheduledFuture</tt>.</p><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">Never fear, we have figured this out for you. We present a small wrapper for schedule that transforms your&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">ScheduledFuture</tt>&nbsp;into a&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">CompletableFuture</tt>. Here&#8217;s how to use it:<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CompletableFuture&lt;Integer&gt;&nbsp;future&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;ScheduledCompletable.schedule(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executor,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;()&nbsp;-&gt;&nbsp;10&nbsp;+&nbsp;25,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TimeUnit.SECONDS<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);<br />future.thenAccept(<br />&nbsp;&nbsp;&nbsp;&nbsp;answer&nbsp;-&gt;&nbsp;{System.out.println(answer);}<br />);<br />System.out.println("Answer&nbsp;coming<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />")</div><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;"><br />The above code prints &#8220;Answer coming&#8230;&#8221; and then &#8220;35&#8221;, so we can see that we don&#8217;t block the main thread waiting for the answer to come back.</p><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">So far, we have scheduled a synchronous task to run in the background after a delay, and wrapped its result in a&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">CompletableFuture</tt>&nbsp;to allow us to chain more tasks after it.</p><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">In fact, what we often want to do is schedule a delayed task that is itself asynchronous, and already returns a&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">CompletableFuture</tt>. In this case it feels particularly natural to get the result back as a&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">CompletableFuture</tt>, but with the current&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">ScheduledExecutorService</tt>&nbsp;interface we can&#8217;t easily do it.</p><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">It&#8217;s OK, we&#8217;ve figured that out too:<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Supplier&lt;CompletableFuture&lt;Integer&gt;&gt;&nbsp;asyncTask&nbsp;=&nbsp;()&nbsp;-&gt;<br />&nbsp;&nbsp;&nbsp;&nbsp;CompletableFuture.completedFuture(10&nbsp;+&nbsp;25);<br />CompletableFuture&lt;Integer&gt;&nbsp;future&nbsp;=<br />&nbsp;&nbsp;&nbsp;&nbsp;ScheduledCompletable.scheduleAsync(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;executor,&nbsp;asyncTask,&nbsp;1,&nbsp;TimeUnit.SECONDS);<br />future.thenAccept(<br />&nbsp;&nbsp;&nbsp;&nbsp;answer&nbsp;-&gt;&nbsp;{System.out.println(answer);}<br />);<br />System.out.println("Answer&nbsp;coming<img src="http://www.blogjava.net/Images/dot.gif"  alt="" />")</div><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;"><br />The above code prints &#8220;Answer coming&#8230;&#8221; and then &#8220;35&#8221;, so we can see that our existing asynchronous task was scheduled in the background, and we didn&#8217;t have to block the main thread waiting for it. Also, under the hood, we are not blocking the&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">ScheduledExecutorService</tt>&#8216;s thread (from its pool) while the async task is running &#8211; that task just runs in whatever thread it was assigned when it was created. (Note: in our example we don&#8217;t really run an async task at all, but just immediately return a completed Future, but this does work for real async tasks.)</p><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">I know you&#8217;re wondering how we achieved all this. First, here&#8217;s how we run a simple blocking task in the background and wrap it in a&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">CompletableFuture</tt>:</p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;&lt;T&gt;&nbsp;CompletableFuture&lt;T&gt;&nbsp;schedule(<br />&nbsp;&nbsp;&nbsp;&nbsp;ScheduledExecutorService&nbsp;executor,<br />&nbsp;&nbsp;&nbsp;&nbsp;Supplier&lt;T&gt;&nbsp;command,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;delay,<br />&nbsp;&nbsp;&nbsp;&nbsp;TimeUnit&nbsp;unit<br />)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;CompletableFuture&lt;T&gt;&nbsp;completableFuture&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CompletableFuture&lt;&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;executor.schedule(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(()&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;completableFuture.complete(command.get());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Throwable&nbsp;t)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;completableFuture.completeExceptionally(t);<br />&nbsp;&nbsp;&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;&nbsp;&nbsp;delay,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;completableFuture;<br />}</div><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;"><br />And here&#8217;s how we delay execution of an async task but still return its result in a&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">CompletableFuture</tt>:<br /><br /></p><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;&lt;T&gt;&nbsp;CompletableFuture&lt;T&gt;&nbsp;scheduleAsync(<br />&nbsp;&nbsp;&nbsp;&nbsp;ScheduledExecutorService&nbsp;executor,<br />&nbsp;&nbsp;&nbsp;&nbsp;Supplier&lt;CompletableFuture&lt;T&gt;&gt;&nbsp;command,<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;delay,<br />&nbsp;&nbsp;&nbsp;&nbsp;TimeUnit&nbsp;unit<br />)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;CompletableFuture&lt;T&gt;&nbsp;completableFuture&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CompletableFuture&lt;&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;executor.schedule(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(()&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;command.get().thenAccept(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;-&gt;&nbsp;{completableFuture.complete(t);}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.exceptionally(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t&nbsp;-&gt;&nbsp;{completableFuture.completeExceptionally(t);<span style="color: #0000FF; ">return</span>&nbsp;<span style="color: #0000FF; ">null</span>;}<br />&nbsp;&nbsp;&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;&nbsp;&nbsp;delay,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;unit<br />&nbsp;&nbsp;&nbsp;&nbsp;);<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;completableFuture;<br />}</div><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px 0px 1.6842em; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;"><br />Note that this should all work to run methods like&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">exceptionally()</tt>,&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">thenAccept()</tt>,&nbsp;<tt style="box-sizing: inherit; border: 0px; font-family: Inconsolata, monospace; font-style: inherit; font-weight: inherit; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; hyphens: none;">whenComplete()</tt>&nbsp;etc.</p><p style="box-sizing: inherit; border: 0px; font-family: &quot;Noto Sans&quot;, sans-serif; font-size: 19px; margin: 0px; outline: 0px; padding: 0px; vertical-align: baseline; color: #333333; background-color: #ffffff;">Feedback and improvements welcome!</p><br /><a href="https://www.artificialworlds.net/blog/2019/04/05/scheduling-a-task-in-java-within-a-completablefuture/" target="_blank">https://www.artificialworlds.net/blog/2019/04/05/scheduling-a-task-in-java-within-a-completablefuture/</a><img src ="http://www.blogjava.net/paulwong/aggbug/435646.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-08-24 09:06 <a href="http://www.blogjava.net/paulwong/archive/2020/08/24/435646.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CompletableFuture</title><link>http://www.blogjava.net/paulwong/archive/2020/08/14/435641.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 14 Aug 2020 03:46:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/08/14/435641.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435641.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/08/14/435641.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435641.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435641.html</trackback:ping><description><![CDATA[很久以前多线程是这样创建：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Thread&nbsp;t1&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Thread();<br />Thread&nbsp;t2&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Thread();<br />t1.start();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;启动新线程</span><span style="color: #008000; "><br /></span>t2.start();&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;启动新线程</span></div><br />由于创建和销毁线程是非常耗资源，因此改成线程建好后不销毁，可以重用，用户只需提供run方法的具体实现：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExecutorService&nbsp;executor&nbsp;=&nbsp;Executors.newSingleThreadExecutor();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Future&lt;String&gt;&nbsp;stringFuture&nbsp;=&nbsp;executor.submit(<span style="color: #0000FF; ">new</span>&nbsp;Callable&lt;String&gt;()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;call()&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(2000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"async&nbsp;thread";<br />&nbsp;&nbsp;&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;&nbsp;&nbsp;Thread.sleep(1000);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("main&nbsp;thread");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(stringFuture.get());<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}</div><br />但如果很多线程被创建，并且线程间有依赖，即按流程和条件执行线程，实现起来就有点复杂，于是CompletableFuture横空出世。一共有50各方法可供使用。<br /><div>CompletableFuture.supplyAsync()，相当于创建了ExecutorService，同时也创建了Callable，然后提交到线程池中执行。</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->CompletableFuture&lt;String&gt;&nbsp;futureA&nbsp;=&nbsp;CompletableFuture.supplyAsync(()&nbsp;-&gt;&nbsp;"任务A");<br />CompletableFuture&lt;String&gt;&nbsp;futureB&nbsp;=&nbsp;CompletableFuture.supplyAsync(()&nbsp;-&gt;&nbsp;"任务B");<br />CompletableFuture&lt;String&gt;&nbsp;futureC&nbsp;=&nbsp;futureB.thenApply(b&nbsp;-&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("执行任务C.");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("参数:"&nbsp;+&nbsp;b);<span style="color: #008000; ">//</span><span style="color: #008000; ">参数:任务B</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"a";<br />});</div><br /><br />!!How to use CompletableFuture and Callable in Java<br /><a href="https://ducmanhphan.github.io/2020-02-10-How-to-use-CompletableFuture-Callable-in-Java/" target="_blank">https://ducmanhphan.github.io/2020-02-10-How-to-use-CompletableFuture-Callable-in-Java/</a><br /><br />使用CompletableFuture优化你的代码执行效率<br /><a href="https://www.cnblogs.com/fingerboy/p/9948736.html" target="_blank">https://www.cnblogs.com/fingerboy/p/9948736.html</a><br /><br />CompletableFuture 使用详解<br /><a href="https://www.jianshu.com/p/6bac52527ca4" target="_blank">https://www.jianshu.com/p/6bac52527ca4</a><br /><br />使用CompletableFuture<br /><a href="https://www.liaoxuefeng.com/wiki/1252599548343744/1306581182447650" target="_blank">https://www.liaoxuefeng.com/wiki/1252599548343744/1306581182447650</a><br /><br /><br /><a href="https://github.com/eugenp/tutorials/blob/master/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java" target="_blank">https://github.com/eugenp/tutorials/blob/master/core-java-modules/core-java-concurrency-basic/src/test/java/com/baeldung/completablefuture/CompletableFutureLongRunningUnitTest.java</a><img src ="http://www.blogjava.net/paulwong/aggbug/435641.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-08-14 11:46 <a href="http://www.blogjava.net/paulwong/archive/2020/08/14/435641.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Springboot+proguard+maven 混淆</title><link>http://www.blogjava.net/paulwong/archive/2020/08/13/435639.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 13 Aug 2020 02:53:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/08/13/435639.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435639.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/08/13/435639.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435639.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435639.html</trackback:ping><description><![CDATA[<a href="https://blog.csdn.net/qq_35981283/article/details/78529929" target="_blank">https://blog.csdn.net/qq_35981283/article/details/78529929</a><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435639.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-08-13 10:53 <a href="http://www.blogjava.net/paulwong/archive/2020/08/13/435639.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Different ways to create objects in Java</title><link>http://www.blogjava.net/paulwong/archive/2020/08/07/435631.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Fri, 07 Aug 2020 02:04:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/08/07/435631.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435631.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/08/07/435631.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435631.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435631.html</trackback:ping><description><![CDATA[<a href="https://www.geeksforgeeks.org/different-ways-create-objects-java/" target="_blank">https://www.geeksforgeeks.org/different-ways-create-objects-java/</a><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435631.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-08-07 10:04 <a href="http://www.blogjava.net/paulwong/archive/2020/08/07/435631.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>为啥文件的CHECKSUM中SHA512比MD5高级？</title><link>http://www.blogjava.net/paulwong/archive/2020/06/16/435513.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 16 Jun 2020 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/06/16/435513.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435513.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/06/16/435513.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435513.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435513.html</trackback:ping><description><![CDATA[<a href="https://stackoverflow.com/questions/2117732/reasons-why-sha512-is-superior-to-md5" target="_blank">https://stackoverflow.com/questions/2117732/reasons-why-sha512-is-superior-to-md5</a><br /><img src ="http://www.blogjava.net/paulwong/aggbug/435513.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-06-16 10:21 <a href="http://www.blogjava.net/paulwong/archive/2020/06/16/435513.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>各种获取JVM DUMP的方法</title><link>http://www.blogjava.net/paulwong/archive/2020/02/24/435157.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 24 Feb 2020 14:03:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2020/02/24/435157.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/435157.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2020/02/24/435157.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/435157.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/435157.html</trackback:ping><description><![CDATA[<p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">JVM 的线程堆栈 dump 也称 core dump，内容为文本，主要包含当时 JVM 的线程堆栈，堆 dump 也称 heap dump，内容为二进制格式，主要包含当时 JVM 堆内存中的内容。由于各个操作系统、各个 JVM 实现不同，即使同一 JVM 实现，各个版本也有差异，本文描述的方法都基于 64 位 Linux 操作系统环境，Java 8 Oracle HotSpot JVM 实现。</p><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">堆栈和堆的内容在定位问题的时候，都是非常重要的信息。线程堆栈 dump 可以了解当时 JVM 中所有线程的运行情况，比如线程的状态和当前正在运行的代码行。堆 dump 可以了解当时堆的使用情况，各个类实例的数量及各个实例所占用的空间大小。</p><h1>线程堆栈</h1><h2>使用 jstack</h2><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">jstack 是 JDK 自带的工具，用于 dump 指定进程 ID(PID)的 JVM 的线程堆栈信息。</p><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#&nbsp;打印堆栈信息到标准输出&nbsp;jstack&nbsp;PID&nbsp;&nbsp;<br />#&nbsp;打印堆栈信息到标准输出，会打印关于锁的信息&nbsp;jstack&nbsp;-l&nbsp;PID&nbsp;&nbsp;<br />强制打印堆栈信息到标准输出，如果使用&nbsp;jstack&nbsp;PID&nbsp;没有响应的情况下(此时&nbsp;JVM&nbsp;进程可能挂起)，<br />加&nbsp;-F&nbsp;参数&nbsp;jstack&nbsp;-F&nbsp;PID&nbsp;</div></pre></div><h2>使用 jcmd</h2><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">jcmd 是 JDK 自带的工具，用于向 JVM 进程发送命令，根据命令的不同，可以代替或部分代替 jstack、jmap 等。可以发送命令&nbsp;<code>Thread.print</code>&nbsp;来打印出 JVM 的线程堆栈信息。</p><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#&nbsp;下面的命令同等于&nbsp;jstack&nbsp;PID&nbsp;<br />jcmd&nbsp;PID&nbsp;Thread.print&nbsp;&nbsp;<br /><br />#&nbsp;同等于&nbsp;jstack&nbsp;-l&nbsp;PID&nbsp;<br />jcmd&nbsp;PID&nbsp;Thread.print&nbsp;-l&nbsp;</div></pre></div><h2>使用 kill -3</h2><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">kill 可以向特定的进程发送信号(SIGNAL)，缺省情况是发送终止(TERM) 的信号 ，即 kill PID 与 kill -15 PID 或 kill -TERM PID 是等价的。JVM 进程会监听 QUIT 信号(其值为 3)，当收到这个信号时，会打印出当时的线程堆栈和堆内存使用概要，相比 jstack，此时多了堆内存的使用概要情况。但 jstack 可以指定 -l 参数，打印锁的信息。</p><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->kill&nbsp;-3&nbsp;PID&nbsp;<br />#&nbsp;或&nbsp;kill&nbsp;-QUIT&nbsp;PID&nbsp;</div></pre></div><h1>堆</h1><h2>-XX:+HeapDumpOnOutOfMemoryError</h2><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">添加 JVM 参数 -XX:+HeapDumpOnOutOfMemoryError 后，当发生 OOM(OutOfMemory)时，自动堆 dump。缺省情况下，JVM 会创建一个名称为 java_pidPID.hprof 的堆 dump 文件在 JVM 的工作目录下。但可以使用参数 -XX:HeapDumpPath=PATH 来指定 dump 文件的保存位置。</p><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#&nbsp;JVM&nbsp;发生&nbsp;OOM&nbsp;时，会自动在&nbsp;/var/log/abc&nbsp;目录下产生堆&nbsp;dump&nbsp;文件&nbsp;java_pidPID.hprof&nbsp;<br />java&nbsp;-XX:+HeapDumpOnOutOfMemoryError&nbsp;-XX:HeapDumpPath=/var/log/abc/&nbsp;</div></pre></div><h2>jmap</h2><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">jmap 也是 JDK 自带的工具，主要用于获取堆相关的信息。</p><h3>堆 dump</h3><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#&nbsp;将&nbsp;JVM&nbsp;的堆&nbsp;dump&nbsp;到指定文件，如果堆中对象较多，需要的时间会较长，子参数&nbsp;format&nbsp;只支持&nbsp;b，<br />即二进制格式<br />jmap&nbsp;-dump:format=b,file=FILE_WITH_PATH<br /><br />#&nbsp;如果&nbsp;JVM&nbsp;进程未响应命令，可以加上参数&nbsp;-F&nbsp;尝试<br />jmap&nbsp;-F&nbsp;-dump:format=b,file=FILE_WITH_PATH<br /><br />#&nbsp;可以只&nbsp;dump&nbsp;堆中的存活对象，加上&nbsp;live&nbsp;子参数，但使用&nbsp;-F&nbsp;时不支持&nbsp;live<br />jmap&nbsp;-dump:live,format=b,file=FILE_WITH_PATH</div></pre></div><h3>获取堆概要信息</h3><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#&nbsp;-heap&nbsp;参数用于查看指定&nbsp;JVM&nbsp;进程的堆的信息，包括堆的各个参数的值，堆中新生代、年老代的内存大小、使用率等&nbsp;<br />jmap&nbsp;-heap&nbsp;PID&nbsp;&nbsp;<br /><br />#&nbsp;同样，如果&nbsp;JVM&nbsp;进程未响应命令，可以加上参数&nbsp;-F&nbsp;尝试&nbsp;<br />jmap&nbsp;-F&nbsp;-heap&nbsp;PID&nbsp;</div></pre></div><p style="font-size: medium; font-family: &quot;Times New Roman&quot;;">一个实例输出如下：</p><div style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->Attaching&nbsp;to&nbsp;process&nbsp;ID&nbsp;68322,&nbsp;please&nbsp;wait<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />Debugger&nbsp;attached&nbsp;successfully.<br />Server&nbsp;compiler&nbsp;detected.<br />JVM&nbsp;version&nbsp;is&nbsp;25.112-b16<br /><br />using&nbsp;thread-local&nbsp;object&nbsp;allocation.<br />Parallel&nbsp;GC&nbsp;with&nbsp;4&nbsp;thread(s)<br /><br />Heap&nbsp;Configuration:<br />&nbsp;&nbsp;&nbsp;MinHeapFreeRatio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0<br />&nbsp;&nbsp;&nbsp;MaxHeapFreeRatio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;100<br />&nbsp;&nbsp;&nbsp;MaxHeapSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;268435456&nbsp;(256.0MB)<br />&nbsp;&nbsp;&nbsp;NewSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;8388608&nbsp;(8.0MB)<br />&nbsp;&nbsp;&nbsp;MaxNewSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;89128960&nbsp;(85.0MB)<br />&nbsp;&nbsp;&nbsp;OldSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;16777216&nbsp;(16.0MB)<br />&nbsp;&nbsp;&nbsp;NewRatio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;2<br />&nbsp;&nbsp;&nbsp;SurvivorRatio&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;8<br />&nbsp;&nbsp;&nbsp;MetaspaceSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;21807104&nbsp;(20.796875MB)<br />&nbsp;&nbsp;&nbsp;CompressedClassSpaceSize&nbsp;=&nbsp;1073741824&nbsp;(1024.0MB)<br />&nbsp;&nbsp;&nbsp;MaxMetaspaceSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;17592186044415&nbsp;MB<br />&nbsp;&nbsp;&nbsp;G1HeapRegionSize&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0&nbsp;(0.0MB)<br /><br />Heap&nbsp;Usage:<br />PS&nbsp;Young&nbsp;Generation<br />Eden&nbsp;Space:<br />&nbsp;&nbsp;&nbsp;capacity&nbsp;=&nbsp;41943040&nbsp;(40.0MB)<br />&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;1701504&nbsp;(1.6226806640625MB)<br />&nbsp;&nbsp;&nbsp;free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;40241536&nbsp;(38.3773193359375MB)<br />&nbsp;&nbsp;&nbsp;4.05670166015625%&nbsp;used<br />From&nbsp;Space:<br />&nbsp;&nbsp;&nbsp;capacity&nbsp;=&nbsp;4194304&nbsp;(4.0MB)<br />&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0&nbsp;(0.0MB)<br />&nbsp;&nbsp;&nbsp;free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;4194304&nbsp;(4.0MB)<br />&nbsp;&nbsp;&nbsp;0.0%&nbsp;used<br />To&nbsp;Space:<br />&nbsp;&nbsp;&nbsp;capacity&nbsp;=&nbsp;5242880&nbsp;(5.0MB)<br />&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;0&nbsp;(0.0MB)<br />&nbsp;&nbsp;&nbsp;free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;5242880&nbsp;(5.0MB)<br />&nbsp;&nbsp;&nbsp;0.0%&nbsp;used<br />PS&nbsp;Old&nbsp;Generation<br />&nbsp;&nbsp;&nbsp;capacity&nbsp;=&nbsp;30408704&nbsp;(29.0MB)<br />&nbsp;&nbsp;&nbsp;used&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;12129856&nbsp;(11.56793212890625MB)<br />&nbsp;&nbsp;&nbsp;free&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&nbsp;18278848&nbsp;(17.43206787109375MB)<br />&nbsp;&nbsp;&nbsp;39.889421134159484%&nbsp;used<br /><br />16658&nbsp;interned&nbsp;Strings&nbsp;occupying&nbsp;1428472&nbsp;bytes.</div><span style="font-family: verdana, &quot;courier new&quot;; font-size: 14px;"><br />获取堆中的类实例统计</span></pre></div><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#&nbsp;打印&nbsp;JVM&nbsp;堆中的类实例统计信息，以占用内存的大小排序，同样，如果&nbsp;JVM&nbsp;未响应命令，也可以使用&nbsp;-F&nbsp;参数&nbsp;<br />jmap&nbsp;-histo&nbsp;PID&nbsp;&nbsp;<br /><br />#&nbsp;也可以只统计堆中的存活对象，加上&nbsp;live&nbsp;子参数，但使用&nbsp;-F&nbsp;时不支持&nbsp;live&nbsp;<br />jmap&nbsp;-histo:live&nbsp;PID&nbsp;</div></pre></div><h2>使用 jcmd</h2><div highlighter-rouge"="" style="font-size: medium; font-family: &quot;Times New Roman&quot;;"><pre><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->#&nbsp;等同&nbsp;jmap&nbsp;-dump:live,format=b,file=FILE_WITH_PATH<br />jcmd&nbsp;PID&nbsp;GC.heap_dump&nbsp;FILE_WITH_PATH<br /><br />#&nbsp;等同&nbsp;jmap&nbsp;-dump:format=b,file=FILE_WITH_PATH<br />jcmd&nbsp;PID&nbsp;GC.heap_dump&nbsp;-all&nbsp;FILE_WITH_PATH<br /><br />#&nbsp;等同&nbsp;jmap&nbsp;-histo:live&nbsp;PID<br />jcmd&nbsp;PID&nbsp;GC.class_histogram<br /><br />#&nbsp;等同&nbsp;jmap&nbsp;-histo&nbsp;PID<br />jcmd&nbsp;PID&nbsp;GC.class_histogram&nbsp;-all</div></pre></div><img src ="http://www.blogjava.net/paulwong/aggbug/435157.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2020-02-24 22:03 <a href="http://www.blogjava.net/paulwong/archive/2020/02/24/435157.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>CountDownLatch、CyclicBarrier和Semaphore</title><link>http://www.blogjava.net/paulwong/archive/2019/09/24/434696.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 24 Sep 2019 02:18:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/09/24/434696.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434696.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/09/24/434696.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434696.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434696.html</trackback:ping><description><![CDATA[<div>CountDownLatch、CyclicBarrier和Semaphore这三个并发辅助类，可以在线程中呼叫，使得线程暂停等，但各有不同。<br />
<br />
<ul>
     <li>CountDownLatch</li>
</ul>
1、初始化，并传入计数器<br />
2、向不同的线程传入CountDownLatch实例<br />
3、如果在某一线程中呼叫await()，则此线程被挂起，直到计数器为0，才往下执行<br />
4、如果在某一线程中呼叫countDown()，计数器减1<br />
5、最终如果计数器值为0时，则CountDownLatch实例不再起作用了，即为一次性的<br />
<br />
<ul>
     <li>CyclicBarrier</li>
</ul>
1、初始化，并传入计数器值，也可传入一个Runnable类，会在计数器为0时，被执行<br />
2、向不同的线程传入CyclicBarrier实例<br />
3、如果在某一线程中呼叫await()，则此线程被挂起，直到计数器为0，才往下执行<br />
4、其他线程呼叫await()，则此线程被挂起，直到计数器为0，才往下执行<br />
5、最终如果计数器值为0时，则CyclicBarrier实例会将计数器值恢复，又可重用<br />
<br />
<ul>
     <li>Semaphore</li>
</ul>
1、初始化，并传入计数器值<br />
2、向不同的线程传入Semaphore实例<br />
3、如果在某一线程中呼叫acquire()，则Semaphore实例会将计数器值减1，如果计数器值为-1，则将计数器值置为0，此线程被挂起，直到计数器值大于1时，才往下执行<br />
4、此线程需呼叫release()，使得计数器值+1，以便其他线程在计数器值为0时不受阻<br />
<br />
<br />
CountDownLatch&nbsp;例子：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Test&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;CountDownLatch&nbsp;latch&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CountDownLatch(2);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Thread(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(3000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;latch.countDown();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Thread(){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("子线程"+Thread.currentThread().getName()+"正在执行");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(3000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("子线程"+Thread.currentThread().getName()+"执行完毕");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;latch.countDown();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}.start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("等待2个子线程执行完毕<img src="http://www.blogjava.net/Images/dot.gif" alt="" />");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;latch.await();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("2个子线程已经执行完毕");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("继续执行主线程");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<br />
结果：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->线程Thread-0正在执行<br />
线程Thread-1正在执行<br />
等待2个子线程执行完毕<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
线程Thread-0执行完毕<br />
线程Thread-1执行完毕<br />
2个子线程已经执行完毕<br />
继续执行主线程</div>
<br />
<br />
CyclicBarrier例子：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Test&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&nbsp;=&nbsp;4;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CyclicBarrier&nbsp;barrier&nbsp;&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CyclicBarrier(N,<span style="color: #0000FF; ">new</span>&nbsp;Runnable()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("当前线程"+Thread.currentThread().getName());&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&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;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;N;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Writer(barrier).start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Writer&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Thread{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;CyclicBarrier&nbsp;cyclicBarrier;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Writer(CyclicBarrier&nbsp;cyclicBarrier)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.cyclicBarrier&nbsp;=&nbsp;cyclicBarrier;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("线程"+Thread.currentThread().getName()+"正在写入数据<img src="http://www.blogjava.net/Images/dot.gif" alt="" />");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(5000);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">以睡眠来模拟写入数据操作</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("线程"+Thread.currentThread().getName()+"写入数据完毕，等待其他线程写入完毕");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cyclicBarrier.await();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<span style="color: #0000FF; ">catch</span>(BrokenBarrierException&nbsp;e){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("所有线程写入完毕，继续处理其他任务<img src="http://www.blogjava.net/Images/dot.gif" alt="" />");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<br />
执行结果：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->线程Thread-0正在写入数据<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
线程Thread-1正在写入数据<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
线程Thread-2正在写入数据<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
线程Thread-3正在写入数据<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
线程Thread-0写入数据完毕，等待其他线程写入完毕<br />
线程Thread-1写入数据完毕，等待其他线程写入完毕<br />
线程Thread-2写入数据完毕，等待其他线程写入完毕<br />
线程Thread-3写入数据完毕，等待其他线程写入完毕<br />
当前线程Thread-3<br />
所有线程写入完毕，继续处理其他任务<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
所有线程写入完毕，继续处理其他任务<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
所有线程写入完毕，继续处理其他任务<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
所有线程写入完毕，继续处理其他任务<img src="http://www.blogjava.net/Images/dot.gif" alt="" /></div>
<br />
<br />
Semaphore例子：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Test&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;N&nbsp;=&nbsp;8;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">工人数</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Semaphore&nbsp;semaphore&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Semaphore(5);&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">机器数目</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>(<span style="color: #0000FF; ">int</span>&nbsp;i=0;i&lt;N;i++)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;Worker(i,semaphore).start();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;Worker&nbsp;<span style="color: #0000FF; ">extends</span>&nbsp;Thread{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">int</span>&nbsp;num;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Semaphore&nbsp;semaphore;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;Worker(<span style="color: #0000FF; ">int</span>&nbsp;num,Semaphore&nbsp;semaphore){<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.num&nbsp;=&nbsp;num;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.semaphore&nbsp;=&nbsp;semaphore;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@Override<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;run()&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;semaphore.acquire();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("工人"+<span style="color: #0000FF; ">this</span>.num+"占用一个机器在生产<img src="http://www.blogjava.net/Images/dot.gif" alt="" />");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Thread.sleep(2000);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("工人"+<span style="color: #0000FF; ">this</span>.num+"释放出机器");<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;semaphore.release();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InterruptedException&nbsp;e)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}</div>
<br />
执行结果：<br />
<div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->工人0占用一个机器在生产<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
工人1占用一个机器在生产<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
工人2占用一个机器在生产<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
工人4占用一个机器在生产<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
工人5占用一个机器在生产<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
工人0释放出机器<br />
工人2释放出机器<br />
工人3占用一个机器在生产<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
工人7占用一个机器在生产<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
工人4释放出机器<br />
工人5释放出机器<br />
工人1释放出机器<br />
工人6占用一个机器在生产<img src="http://www.blogjava.net/Images/dot.gif" alt="" /><br />
工人3释放出机器<br />
工人7释放出机器<br />
工人6释放出机器</div>
<br />
<a href="https://www.cnblogs.com/dolphin0520/p/3920397.html" target="_blank">https://www.cnblogs.com/dolphin0520/p/3920397.html<br />
<br />
</a></div>
<a href="https://juejin.im/post/5aeec3ebf265da0ba76fa327" target="_blank">https://juejin.im/post/5aeec3ebf265da0ba76fa327</a><img src ="http://www.blogjava.net/paulwong/aggbug/434696.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-09-24 10:18 <a href="http://www.blogjava.net/paulwong/archive/2019/09/24/434696.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>使用 Awaitility 测试异步代码</title><link>http://www.blogjava.net/paulwong/archive/2019/08/01/434327.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 01 Aug 2019 02:06:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/08/01/434327.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/434327.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/08/01/434327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/434327.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/434327.html</trackback:ping><description><![CDATA[<div>自动化工具 异步校验工具 awaitility 快速入门</div><a href="https://testerhome.com/topics/7408" target="_blank">https://testerhome.com/topics/7408</a><br /><br /><br /><a href="https://yanbin.blog/test-asyn-call-with-awaitility/" target="_blank">https://yanbin.blog/test-asyn-call-with-awaitility/</a><br /><br /><div>Introduction to Awaitlity</div><a href="https://www.baeldung.com/awaitlity-testing" target="_blank">https://www.baeldung.com/awaitlity-testing</a><br /><br /><br /><br /><br /><img src ="http://www.blogjava.net/paulwong/aggbug/434327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-08-01 10:06 <a href="http://www.blogjava.net/paulwong/archive/2019/08/01/434327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>zip4j</title><link>http://www.blogjava.net/paulwong/archive/2019/06/10/433851.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 10 Jun 2019 08:47:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/06/10/433851.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433851.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/06/10/433851.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433851.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433851.html</trackback:ping><description><![CDATA[缩解压ZIP之Zip4j<br /><a href="https://rensanning.iteye.com/blog/1836727" target="_blank">https://rensanning.iteye.com/blog/1836727</a><br /><br /> <img src ="http://www.blogjava.net/paulwong/aggbug/433851.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-06-10 16:47 <a href="http://www.blogjava.net/paulwong/archive/2019/06/10/433851.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA 8  TIME</title><link>http://www.blogjava.net/paulwong/archive/2019/05/09/433761.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Thu, 09 May 2019 02:15:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2019/05/09/433761.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/433761.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2019/05/09/433761.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/433761.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/433761.html</trackback:ping><description><![CDATA[<div>Java 8新特性（四）：新的时间和日期API</div><a href="https://lw900925.github.io/java/java8-newtime-api.html" target="_blank">https://lw900925.github.io/java/java8-newtime-api.html</a><br />&nbsp;<img src ="http://www.blogjava.net/paulwong/aggbug/433761.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2019-05-09 10:15 <a href="http://www.blogjava.net/paulwong/archive/2019/05/09/433761.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>SHARDING-JDBC</title><link>http://www.blogjava.net/paulwong/archive/2016/03/29/429870.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 29 Mar 2016 13:26:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2016/03/29/429870.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/429870.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2016/03/29/429870.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/429870.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/429870.html</trackback:ping><description><![CDATA[<a href="https://github.com/dangdangdotcom/sharding-jdbc/" target="_blank">https://github.com/dangdangdotcom/sharding-jdbc/</a><img src ="http://www.blogjava.net/paulwong/aggbug/429870.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2016-03-29 21:26 <a href="http://www.blogjava.net/paulwong/archive/2016/03/29/429870.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java 中正确使用 hashCode 和 equals 方法</title><link>http://www.blogjava.net/paulwong/archive/2015/12/01/428439.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 01 Dec 2015 02:52:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/12/01/428439.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428439.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/12/01/428439.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428439.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428439.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 在这篇文章中，我将告诉大家我对hashCode和equals方法的理解。我将讨论他们的默认实现，以及如何正确的重写他们。我也将使用Apache Commons提供的工具包做一个实现。&nbsp;目录：hashCode()和equals()的用法重写默认实现使用Apache Commons Lang包重写hashCode()和equals()需要注意记住的事情当使用ORM的时候特别要注意的hashC...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2015/12/01/428439.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/428439.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-12-01 10:52 <a href="http://www.blogjava.net/paulwong/archive/2015/12/01/428439.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>javax.crypto.IllegalBlockSizeException: Data must not be longer than 256 bytes 解决办法</title><link>http://www.blogjava.net/paulwong/archive/2015/11/18/428264.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 18 Nov 2015 07:27:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/11/18/428264.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428264.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/11/18/428264.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428264.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428264.html</trackback:ping><description><![CDATA[如果用RSA加密数据的话，会有数据长度的要求，否则会抛异常：<br />
<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
-->javax.crypto.IllegalBlockSizeException:&nbsp;Data&nbsp;must&nbsp;not&nbsp;be&nbsp;longer&nbsp;than&nbsp;256&nbsp;bytes</div>
<br />
推荐的做法：<br />
<br />
<ol>
     <li>随机生成一个密钥，用作对称密钥UUID<br />
     </li>
     <li>用此对称密钥，用对称加密法AES加密数据<br />
     </li>
     <li>用RSA的公钥加密此对称密钥<br />
     </li>
     <li>发送加密后的对称密钥和加密数据<br />
     </li>
     <li>用RSA私钥解密加密后的对称密钥<br />
     </li>
     <li>用解密密后的对称密钥，解密数据<br />
     </li>
     <li>完成</li>
</ol>
<div>AESSecurityUtil.java</div>
<div style="font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all; background-color: #eeeeee;"><span style="color: #0000FF; ">import</span>&nbsp;java.security.Key;<br />
<span style="color: #0000FF; ">import</span>&nbsp;java.util.UUID;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.Cipher;<br />
<span style="color: #0000FF; ">import</span>&nbsp;javax.crypto.spec.SecretKeySpec;<br />
<br />
<span style="color: #0000FF; ">import</span>&nbsp;sun.misc.BASE64Decoder;<br />
<span style="color: #0000FF; ">import</span>&nbsp;sun.misc.BASE64Encoder;<br />
<br />
<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;AESSecurityUtil&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;加密算法</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; ">&nbsp;指定加密算法为RSA&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;ALGORITHM&nbsp;=&nbsp;"AES";<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;加密密钥<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;private&nbsp;static&nbsp;final&nbsp;byte[]&nbsp;keyValue&nbsp;=&nbsp;new&nbsp;byte[]&nbsp;{&nbsp;'T',&nbsp;'h',&nbsp;'e',<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;'B','e',&nbsp;'s',&nbsp;'t',&nbsp;'S',&nbsp;'e',&nbsp;'c',&nbsp;'r',&nbsp;'e',&nbsp;'t',&nbsp;'K',&nbsp;'e',&nbsp;'y'&nbsp;};<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;16位的加密密钥<br />
</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;private&nbsp;byte[]&nbsp;keyValue;</span><span style="color: #008000; "><br />
</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;用来进行加密的操作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;Data<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;encrypt(String&nbsp;keyString,&nbsp;String&nbsp;data)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key&nbsp;key&nbsp;=&nbsp;generateKey(keyString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;c&nbsp;=&nbsp;Cipher.getInstance(ALGORITHM);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.init(Cipher.ENCRYPT_MODE,&nbsp;key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;encVal&nbsp;=&nbsp;c.doFinal(data.getBytes());<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encryptedValue&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BASE64Encoder().encode(encVal);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;encryptedValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;用来进行解密的操作<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@param</span><span style="color: #008000; ">&nbsp;encryptedData<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;decrypt(String&nbsp;keyString,&nbsp;String&nbsp;encryptedData)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key&nbsp;key&nbsp;=&nbsp;generateKey(keyString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Cipher&nbsp;c&nbsp;=&nbsp;Cipher.getInstance(ALGORITHM);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;c.init(Cipher.DECRYPT_MODE,&nbsp;key);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;decordedValue&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BASE64Decoder().decodeBuffer(encryptedData);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">byte</span>[]&nbsp;decValue&nbsp;=&nbsp;c.doFinal(decordedValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;decryptedValue&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(decValue);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;decryptedValue;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;generateKeyString()<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">必须长度为16</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;UUID.randomUUID().toString().replaceAll("-",&nbsp;"").substring(0,&nbsp;16);<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/**</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;根据密钥和算法生成Key<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@return</span><span style="color: #008000; "><br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;</span><span style="color: #808080; ">@throws</span><span style="color: #008000; ">&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">*/</span><br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Key&nbsp;generateKey(String&nbsp;keyString)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Key&nbsp;key&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;SecretKeySpec(keyString.getBytes(),&nbsp;ALGORITHM);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;key;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String&nbsp;[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />
&nbsp;&nbsp;&nbsp;&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;keyString&nbsp;=&nbsp;generateKeyString();<br />
<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;keyString&nbsp;=&nbsp;"1234567890123456";</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("密钥："&nbsp;+&nbsp;keyString);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;source&nbsp;=&nbsp;"恭喜发财!";<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;要加密的字符串</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("准备用密钥加密的字符串为："&nbsp;+&nbsp;source);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;cryptograph&nbsp;=&nbsp;encrypt(keyString,&nbsp;source);<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;生成的密文</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("用密钥加密后的结果为:"&nbsp;+&nbsp;cryptograph);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;target&nbsp;=&nbsp;decrypt(keyString,&nbsp;cryptograph);<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;解密密文</span><span style="color: #008000; "><br />
</span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println("用密钥解密后的字符串为："&nbsp;+&nbsp;target);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
}</div><br /><br /><div>CryptoUtil.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><span style="color: #0000FF; ">import</span>&nbsp;com.tcl.project7.boss.common.crypto.CryptoData;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.tcl.project7.boss.common.util.JsonManager;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.tcl.project7.boss.common.util.file.FileUtil;<br /><span style="color: #0000FF; ">import</span>&nbsp;com.tcl.project7.boss.gameapplication.yearendactivities.bigwheelgame.player.valueobject.BigWheelGameRequest;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CryptoUtil&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;CryptoData&nbsp;encrypt(String&nbsp;data)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">1、产生AES密钥</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;keyString&nbsp;=&nbsp;AESSecurityUtil.generateKeyString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">2、用AES法加密数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;cryptograph&nbsp;=&nbsp;AESSecurityUtil.encrypt(keyString,&nbsp;data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">3、用RSA加密AES密钥</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;finalKey&nbsp;=&nbsp;RSASecurityUtil.encrypt(keyString);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("用RSA加密AES密钥为:"&nbsp;+&nbsp;finalKey);<br /></span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print("加密数据:"&nbsp;+&nbsp;cryptograph);</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CryptoData&nbsp;cryptoData&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;CryptoData();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cryptoData.setKey(finalKey);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cryptoData.setContent(cryptograph);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">4、返回数据</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;cryptoData;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;String&nbsp;decrypt(String&nbsp;keyString,&nbsp;String&nbsp;data)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">1、解密密钥</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;decryptKeyString&nbsp;=&nbsp;RSASecurityUtil.decrypt(keyString);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">2、解密内容</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;decryptData&nbsp;=&nbsp;AESSecurityUtil.decrypt(decryptKeyString,&nbsp;data);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">3、返回</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;decryptData;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String&nbsp;[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;aFilePath&nbsp;=&nbsp;"DATA/TESTING-FILE/TOCRYPTO/tocrypto.txt";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;source&nbsp;=&nbsp;FileUtil.getContents(aFilePath);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CryptoData&nbsp;cryptoData&nbsp;=&nbsp;encrypt(source);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(cryptoData);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;target&nbsp;=&nbsp;decrypt(cryptoData.getKey(),&nbsp;cryptoData.getContent());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(target);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BigWheelGameRequest&nbsp;bigWheelGameRequest&nbsp;=&nbsp;JsonManager.getBean(target,&nbsp;BigWheelGameRequest.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(bigWheelGameRequest);<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br /><br /><div>CryptoData.java</div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.io.Serializable;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;CryptoData&nbsp;<span style="color: #0000FF; ">implements</span>&nbsp;Serializable{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;<span style="color: #0000FF; ">long</span>&nbsp;serialVersionUID&nbsp;=&nbsp;-4774469372648172844L;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;key;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;String&nbsp;content;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getKey()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;key;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setKey(String&nbsp;key)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.key&nbsp;=&nbsp;key;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;getContent()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;content;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;setContent(String&nbsp;content)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">this</span>.content&nbsp;=&nbsp;content;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;String&nbsp;toString()&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;"CryptoData&nbsp;[key="&nbsp;+&nbsp;key&nbsp;+&nbsp;",&nbsp;content="&nbsp;+&nbsp;content&nbsp;+&nbsp;"]";<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br /></div><img src ="http://www.blogjava.net/paulwong/aggbug/428264.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-11-18 15:27 <a href="http://www.blogjava.net/paulwong/archive/2015/11/18/428264.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JSON转JAVA BEAN</title><link>http://www.blogjava.net/paulwong/archive/2015/11/18/428258.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 18 Nov 2015 05:30:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/11/18/428258.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/428258.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/11/18/428258.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/428258.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/428258.html</trackback:ping><description><![CDATA[<div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.codehaus.jackson.JsonParseException;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.codehaus.jackson.map.DeserializationConfig;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.codehaus.jackson.map.JsonMappingException;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.codehaus.jackson.map.ObjectMapper;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.codehaus.jackson.type.TypeReference;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.junit.Test;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br /><br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ColumnControllerTest&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;LoggerFactory.getLogger(ColumnControllerTest.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;@Test<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;testTest()<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ObjectMapper&nbsp;mapper&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ObjectMapper();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">AnnotationIntrospector&nbsp;introspector&nbsp;=&nbsp;new&nbsp;JaxbAnnotationIntrospector();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;make&nbsp;deserializer&nbsp;use&nbsp;JAXB&nbsp;annotations&nbsp;(only)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapper.getDeserializationConfig().setAnnotationIntrospector(introspector);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;make&nbsp;serializer&nbsp;use&nbsp;JAXB&nbsp;annotations&nbsp;(only)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapper.getSerializationConfig().setAnnotationIntrospector(introspector);</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mapper.configure(DeserializationConfig.Feature.FAIL_ON_UNKNOWN_PROPERTIES,&nbsp;<span style="color: #0000FF; ">false</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;userStr&nbsp;=&nbsp;"{\"username\":\"paul\",\"email\":\"paul@paul.com\"}";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TypeReference&lt;TestUser&gt;&nbsp;temp&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;TypeReference&lt;TestUser&gt;(){};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;TestUser&nbsp;testUser&nbsp;=&nbsp;mapper.readValue(userStr,&nbsp;temp);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(testUser.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;result&nbsp;=&nbsp;mapper.writeValueAsString(testUser);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(result);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(JsonParseException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(JsonMappingException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;TODO&nbsp;Auto-generated&nbsp;catch&nbsp;block</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><img src ="http://www.blogjava.net/paulwong/aggbug/428258.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-11-18 13:30 <a href="http://www.blogjava.net/paulwong/archive/2015/11/18/428258.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Java NIO核心概念及基本读写</title><link>http://www.blogjava.net/paulwong/archive/2015/05/10/424980.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Sun, 10 May 2015 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/05/10/424980.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/424980.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/05/10/424980.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/424980.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/424980.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 面向流的I/O系统一次一个字节地处理数据。一个输入流产生一个字节的数据，一个输出流消费一个字节的数据。为流式数据创建过滤器非常容易。链接几个过滤器，以便每个过滤器只负责单个复杂处理机制的一部分，这样也是相对简单的。不利的一面是，面向流的I/O通常相当慢。&nbsp;&nbsp;&nbsp; NIO与原来的I/O有同样的作用和目的，但是它使用块I/O的处理方式。每一个操作都在一步中产生或者消费一个数...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2015/05/10/424980.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/424980.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-05-10 20:55 <a href="http://www.blogjava.net/paulwong/archive/2015/05/10/424980.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>开源中国 2014 最受关注开源软件排行榜 TOP 50</title><link>http://www.blogjava.net/paulwong/archive/2015/01/07/422097.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Tue, 06 Jan 2015 16:08:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2015/01/07/422097.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/422097.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2015/01/07/422097.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/422097.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/422097.html</trackback:ping><description><![CDATA[<div style="color: #2e415c; font-family: Arial, Helvetica, sans-serif; line-height: normal; clear: both;"></div><div id="article_contents_inner_4016847419" dir="ltr" style="font-family: Arial, Helvetica, sans-serif; line-height: 1.5; max-width: 650px; padding-top: 10px; padding-bottom: 10px; padding-left: 12px; color: #2e415c;"><p>开源中国 2014 年最受关注软件排行榜 TOP 50 正式出炉！2014 年结束了，我们来了解一下过去一年里开源中国最受欢迎的 50 款软件。此榜单是根据过去一年的用户访问、交流分享和项目本身的更新频度等诸多角度对收录于开源中国 33000+ 款开源软件进行统计，从而得出前 50 名最受欢迎的开源软件，仅供参考。</p><p>本排行榜主要是针对开源中国社区在 2014 年度最受欢迎的 50 款热门开源项目根据用户访问量、讨论和关注等角度进行筛选，从而得出前 50 名开源软件列表：</p><h2>1.&nbsp;<a target="_blank" href="http://www.oschina.net/p/jfinal" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">JFinal</a></h2><p>JFinal 是基于 Java 语言的极速 WEB + ORM 框架，其核心设计目标是开发迅速、代码量少、学习简单、功能强大、轻量级、易扩展、Restful。在拥有Java语言所有优势的同时再拥有ruby、python、php等动态语言的开发效率！</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="http://git.oschina.net/jfinal/jfinal" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.oschina.net/jfinal/jfinal</a></p><h2>2.&nbsp;<a target="_blank" href="http://www.oschina.net/p/angularjs" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">AngularJS</a></h2><p>Angular JS (Angular.JS) 是一组用来开发Web页面的框架、模板以及数据绑定和丰富UI组件。它支持整个开发进程，提供web应用的架构，无需进行手工DOM操作。 AngularJS很小，只有60K，兼容主流浏览器，与 jQuery 配合良好。</p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="https://github.com/angular/angular.js" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/angular/angular.js</a></p><h2>3.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/bootstrap" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Bootstrap</a></h2><p>Bootstrap是快速开发Web应用程序的前端工具包。它是一个CSS和HTML的集合，它使用了最新的浏览器技术，给你的Web开发提供了时尚的版式，表单，buttons，表格，网格系统等等。</p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="https://github.com/twbs/bootstrap" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/twbs/bootstrap</a></p><h2>4.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/dubbo" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Dubbo</a></h2><p>Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架，使得应用可通过高性能的 RPC 实现服务的输出和输入功能，可以和&nbsp;<a href="http://www.oschina.net/p/spring" rel="nofollow" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Spring</a>&nbsp;框架无缝集成。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="https://github.com/alibaba/dubbo" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/alibaba/dubbo</a></p><h2>5.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/hadoop" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Hadoop</a></h2><p>Hadoop 是一个分布式系统基础架构，由Apache基金会开发。用户可以在不了解分布式底层细节的情况下，开发分布式程序。充分利用集群的威力高速运算和存储。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="http://mirror.bit.edu.cn/apache/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://mirror.bit.edu.cn/apache/</a></p><h2>6.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/jquerymobile" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">jQuery Mobile</a></h2><p>jQuery Mobile（jQueryMobile） 是&nbsp;<a href="http://www.oschina.net/p/jquery" rel="nofollow" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">jQuery</a>&nbsp;在手机上和平板设备上的版本。jQuery Mobile 不仅会给主流移动平台带来jQuery核心库，而且会发布一个完整统一的jQuery移动UI框架。支持全球主流的移动平台。</p><p>授权协议：MIT/GPL<br />源码下载：<a target="_blank" href="https://github.com/jquery/jquery-mobile" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/jquery/jquery-mobile</a></p><h2>7.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/nginx" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Nginx</a></h2><p>Nginx（发音同 engine x）是一款轻量级的Web 服务器／反向代理服务器及电子邮件（IMAP/POP3）代理服务器。其特点是占有内存少，并发能力强，事实上nginx的并发能力确实在同类型的网页伺服器中表现较好。</p><p>授权协议：BSD<br />源码下载：<a target="_blank" href="http://nginx.org/en/download.html" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://nginx.org/en/download.html</a></p><h2>8.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/qt" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Qt</a></h2><p>Qt 是一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的，很容易扩展，并且允许真正地组件编程。</p><p>授权协议：GPL/LGPL/QPL<br />源码下载：<a target="_blank" href="http://www.qt.io/download-open-source/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://www.qt.io/download-open-source/</a></p><h2>9.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/zentaopms" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">禅道</a></h2><p>禅道是第一款国产的开源项目管理软件，她的核心管理思想基于敏捷方法scrum，内置了产品管理和项目管理，同时又根据国内研发现状补充了测试管理、计划 管理、发布管理、文档管理、事务管理等功能，在一个软件中就可以将软件研发中的需求、任务、bug、用例、计划、发布等要素有序的跟踪管理起来，完整地覆 盖了项目管理的核心流程。</p><p>授权协议：LGPL<br />源码下载：<a target="_blank" href="http://git.oschina.net/wwccss/zentaopms" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.oschina.net/wwccss/zentaopms</a></p><h2>10.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/redmine" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Redmine</a></h2><p>Redmine 是一个开源的、基于Web的项目管理和缺陷跟踪工具。它用日历和甘特图辅助项目及进度可视化显示。同时它又支持多项目管理。Redmine是一个自由开放 源码软件解决方案，它提供集成的项目管理功能，问题跟踪，并为多个版本控制选项的支持。</p><p>授权协议：GPL<br />源码下载：<a target="_blank" href="https://github.com/redmine/redmine" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/redmine/redmine</a></p><h2>11.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/ckeditor" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">CKEditor</a></h2><p>CKEditor 是新一代的&nbsp;<a href="http://www.oschina.net/p/fckeditor" rel="nofollow" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">FCKeditor</a>，是一个重新开发的版本。CKEditor是全球最优秀的网页在线文字编辑器之一，因其惊人的性能与可扩展性而广泛的被运用于各大网站。</p><p>授权协议：GPL/LGPL/MPL<br />源码下载：<a target="_blank" href="http://ckeditor.com/download" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://ckeditor.com/download</a></p><h2>12.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/teamtalk" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">TeamTalk</a><br /></h2><p>TeamTalk 是由蘑菇街开发的开源即时通讯解决方案，适用于中小型企业，提供可靠的消息传递机制；支持文字、图片、语音等富文本信息；文件收发等。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="https://github.com/mogutt" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/mogutt</a></p><h2>13.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/afinal" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Afinal</a></h2><p>Afinal 是一个 Android 的 Sqlite ORM 和 IOC 框架。同时封装了Android 中的 HTTP 框架，使其更加简单易用。Afinal 的宗旨是简洁，快速。约定大于配置的方式。尽量一行代码完成所有事情。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="http://git.oschina.net/fuhai/afinal" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.oschina.net/fuhai/afinal</a></p><h2>14.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/echarts" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">ECharts</a></h2><p>ECharts 开源来自百度商业前端数据可视化团队，基于html5 Canvas，是一个纯Javascript图表库，提供直观，生动，可交互，可个性化定制的数据可视化图表。创新的拖拽重计算、数据视图、值域漫游等特 性大大增强了用户体验，赋予了用户对数据进行挖掘、整合的能力。</p><p>授权协议：BSD<br />源码下载：<a target="_blank" href="https://github.com/ecomfe/echarts" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/ecomfe/echarts</a><br /></p><h2>15.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/semantic-ui" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Semantic UI</a></h2><p>Semantic UI &#8212; 完全语义化的前端界面开发框架，跟&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/bootstrap" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Bootstrap</a>&nbsp;和&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/foundation" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Foundation</a>&nbsp;比起来，还是有些不同的，在功能特性上、布局设计上、用户体验上均存在很多差异。</p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="https://github.com/Semantic-Org/Semantic-UI" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/Semantic-Org/Semantic-UI</a></p><h2>16.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/swfupload" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">SWFUpload</a></h2><p>SWFUpload&nbsp;是一个客户端文件上传工具，最初由Vinterwebb.se开发，它通过整合Flash与JavaScript技术为WEB开发者提供了一个具有丰富功能继而超越传统 &lt;input type="file"/&gt; 标签的文件上传模式。</p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="https://github.com/WordPress/secure-swfupload" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/WordPress/secure-swfupload</a></p><h2>17.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/goagent" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">GoAgent</a></h2><p><a target="_blank" href="http://www.oschina.net/p/goagent" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">GoAgent</a>&nbsp;是一个使用Python和Google Appengine SDK编写的代理软件，goagent的初衷是弥补<a href="http://www.oschina.net/p/gappproxy" target="_blank" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">gappproxy</a>的不足。</p><p>授权协议：GPL<br />源码下载：<a target="_blank" href="http://git.oschina.net/goagent/goagent" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.oschina.net/goagent/goagent</a></p><h2>18.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/android-studio" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Android Studio</a></h2><p>Android Studio 是一个全新的 Android 开发环境，基于 IntelliJ IDEA. 类似 Eclipse ADT，Android Studio 提供了集成的 Android 开发工具用于开发和调试。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="http://developer.android.com/sdk/index.html" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://developer.android.com/sdk/index.html</a></p><h2>19.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/druid" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Druid</a></h2><p>Druid 是一个JDBC组件，它包括三部分：DruidDriver 代理Driver，能够提供基于Filter－Chain模式的插件体系；DruidDataSource 高效可管理的数据库连接池；SQLParser。<br /></p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="http://git.oschina.net/wenshao/druid" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.oschina.net/wenshao/druid</a><br /></p><h2>20.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/nagios" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Nagios</a></h2><p>Nagios是一个监视系统运行状态和网络信息的监视系统。Nagios能监视所指定的本地或远程主机以及服务，同时提供异常通知功能等。</p><p>授权协议：GPL<br />源码下载：<a target="_blank" href="http://www.nagios.org/download/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://www.nagios.org/download/</a></p><h2>21.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/amazeui" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Amaze UI</a></h2><p>Amaze UI 是中国首个开源 HTML5 跨屏前端框架。Amaze UI 是一个轻量级、Mobile first的前端框架， 基于开源社区流行前端框架编写。</p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="http://git.oschina.net/amazeui/amazeui" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.oschina.net/amazeui/amazeui</a></p><h2>22.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/docker" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Docker</a></h2><p>Docker 是一个开源的应用容器引擎，让开发者可以打包他们的应用以及依赖包到一个可移植的容器中，然后发布到任何流行的 Linux 机器上，也可以实现虚拟化。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="https://github.com/docker/docker" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/docker/docker</a></p><h2>23.&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/fastjson" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">fastjson</a></h2><p>fastjson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器，来自阿里巴巴的工程师开发。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="http://git.oschina.net/wenshao/fastjson" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.oschina.net/wenshao/fastjson</a></p><h2>24.&nbsp;<a target="_blank" href="http://www.oschina.net/p/crossapp" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">CrossApp</a></h2><p>CrossApp是一款完全开源、免费、跨平台的移动应用开发引擎 。CrossApp 采用 C++ 开发（即将支持 JS 和 Lua 编写），可直接导出 iOS 和 Android 原生应用，拥有高性能，多控件，开发速度快的优势。</p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="http://git.oschina.net/9miao/CrossApp" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.oschina.net/9miao/CrossApp</a><br /></p><h2>25.&nbsp;<a target="_blank" href="http://www.oschina.net/p/sonar" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Sonar</a></h2><p>Sonar (SonarQube)是一个开源平台，用于管理源代码的质量。Sonar 不只是一个质量数据报告工具，更是代码质量管理平台。支持的语言包括：Java、PHP、C#、C、Cobol、PL/SQL、Flex 等。</p><p>授权协议：LGPL<br />源码下载：<a target="_blank" href="https://github.com/SonarSource/sonarqube" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/SonarSource/sonarqube</a></p><h2>26.&nbsp;<a target="_blank" href="http://www.oschina.net/p/xutils" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">xUtils</a></h2><p>xUtils 最初源于&nbsp;&nbsp;<a target="_blank" href="http://www.oschina.net/p/afinal" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Afinal</a>&nbsp;框架，进行了大量重构，使得 xUtils 支持大文件上传，更全面的 http 请求协议支持(10 种谓词)，拥有更加灵活的 ORM，更多的事件注解支持且不受混淆影响...</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="https://github.com/wyouflf/xUtils" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/wyouflf/xUtils</a></p><h2>27.&nbsp;<a target="_blank" href="http://www.oschina.net/p/teamlab" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">TeamLab</a></h2><p>TeamLab 是一个免费开源的商业协作和项目管理的平台。TeamLab 主要功能包括：项目管理、里程碑管理、任务、报表、事件、博客、论坛、书签、Wiki、即时消息等等。</p><p>授权协议：AGPL<br />源码下载：<a target="_blank" href="http://sourceforge.net/projects/teamlab/files/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://sourceforge.net/projects/teamlab/files/</a></p><h2>28.&nbsp;<a target="_blank" href="http://www.oschina.net/p/memcached" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">memcached</a></h2><p>memcached 是 一套分布式的快取系统，当初是Danga Interactive为了LiveJournal所发展的，但目前被许多软件（如MediaWiki）所使用。memcached具有多种语言的客户端 开发包，包括：Perl/PHP/JAVA/C/Python/Ruby/C#/MySQL/。</p><p>授权协议：BSD<br />源码下载：<a target="_blank" href="https://code.google.com/p/memcached/downloads/list" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://code.google.com/p/memcached/downloads/list</a></p><h2>29.&nbsp;<a target="_blank" href="http://www.oschina.net/p/magnolia" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;"><span style="line-height: 1.5; font-size: 10pt;">Magnolia</span></a></h2><p><span style="line-height: 1.5; font-size: 10pt;">Magnolia CMS 是一家瑞士公司自</span><span style="line-height: 1.5; font-size: 10pt;">&nbsp;2003 年起发布的一个基于&nbsp;</span><span style="line-height: 1.5; font-size: 10pt;">Java 的开源内容管理系统。它适合且已被使用在以下领域：</span><span style="line-height: 1.5; font-size: 10pt;">电子商务</span><span style="line-height: 1.5; font-size: 10pt;">、银行</span><span style="line-height: 1.5; font-size: 10pt;">、媒体娱乐</span><span style="line-height: 1.5; font-size: 10pt;">、<span style="font-size: 10pt; line-height: 1.5;">政府</span>、旅游、航空航天</span><span style="line-height: 1.5; font-size: 10pt;">、工业制造、</span><span style="line-height: 1.5; font-size: 10pt;">教育</span><span style="line-height: 1.5; font-size: 10pt;">和保险</span><span style="line-height: 1.5; font-size: 10pt;">。</span></p><p>授权协议：GPL<br />源码下载：<a target="_blank" href="http://git.magnolia-cms.com/gitweb/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.magnolia-cms.com/gitweb/</a></p><h2>30.&nbsp;<a target="_blank" href="http://www.oschina.net/p/django" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Django</a></h2><p>Django 项目是一个定制 Python WEB 框架，它源自一个在线新闻 Web 站点，于 2005 年以开源的形式被释放出来。</p><p>授权协议：BSD<br />源码下载：<a target="_blank" href="https://www.djangoproject.com/download/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://www.djangoproject.com/download/</a></p><h2>31.&nbsp;<a target="_blank" href="http://www.oschina.net/p/zabbix" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">zabbix</a></h2><p>zabbix是一个基于WEB界面的提供分布式系统监视以及网络监视功能的企业级的开源解决方案。zabbix能监视各种网络参数，保证服务器系统的安全运营；并提供柔软的通知机制以让系统管理员快速定位/解决存在的各种问题。</p><p>授权协议：GPL<br />源码下载：<a target="_blank" href="http://www.zabbix.com/download.php" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://www.zabbix.com/download.php</a></p><h2>32.&nbsp;<a target="_blank" href="http://www.oschina.net/p/kettle" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Kettle</a></h2><p>Kettle是一款国外开源的etl工具，纯java编写，绿色无需安装，数据抽取高效稳定(数据迁移工具)。Kettle中有两种脚本文件，transformation和job，transformation完成针对数据的基础转换，job则完成整个工作流的控制。</p><p>授权协议：LGPL<br />源码下载：<a target="_blank" href="http://sourceforge.net/projects/pentaho/files/Data%20Integration/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://sourceforge.net/projects/pentaho/files/Data%20Integration/</a></p><h2>33.&nbsp;<a target="_blank" href="http://www.oschina.net/p/nodejs" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Node.js</a></h2><p>Node.js 是一套用来编写高性能网络服务器的 JavaScript 工具包，一系列的变化由此开始。比较独特的是，Node.js 会假设你是在 POSIX 环境下运行它 Linux 或 Mac OS X。</p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="http://nodejs.org/download/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://nodejs.org/download/</a></p><h2>34.&nbsp;<a target="_blank" href="http://www.oschina.net/p/mybatis" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">MyBatis</a></h2><p>MyBatis 的前身就是&nbsp;<a href="http://www.oschina.net/p/ibatis" rel="nofollow" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">iBatis</a>&nbsp;。是一个数据持久层(ORM)框架。在线Javadoc：<a target="_blank" href="http://tool.oschina.net/apidocs/apidoc?api=mybatis-3.1.1" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://tool.oschina.net/apidocs/apidoc?api=mybatis-3.1.1</a></p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="https://github.com/mybatis/mybatis-3" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/mybatis/mybatis-3</a></p><h2>35.&nbsp;<a target="_blank" href="http://www.oschina.net/p/tortoisegit" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">TortoiseGit</a></h2><p>TortoiseGit (海龟Git)是<a href="http://www.oschina.net/p/tortoisesvn" rel="nofollow" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">TortoiseSVN</a>的<a href="http://www.oschina.net/p/git" rel="nofollow" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Git</a>版本，tortoisegit用于迁移TortoiseSVN到TortoiseGit，一直以来Git在Windows平台没有好用GUI客户端，现在tortoisegit的出现给Windows开发者带来福音。</p><p>授权协议：GPL<br />源码下载：<a target="_blank" href="https://code.google.com/p/tortoisegit/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://code.google.com/p/tortoisegit/</a></p><h2>36.&nbsp;<a target="_blank" href="http://www.oschina.net/p/openfire" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Openfire</a></h2><p>Openfire 是实时的基于WEB的即时消息传输平台，是原来的Jive Messenger。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="http://www.igniterealtime.org/downloads/index.jsp" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://www.igniterealtime.org/downloads/index.jsp</a></p><h2>37.&nbsp;<a target="_blank" href="http://www.oschina.net/p/zui" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">ZUI</a></h2><p>zui 是禅道项目管理软件团队在完善自己产品过程中形成的一个开源前端实践方案，帮助你快速构现代跨屏应用。简单美观，易于使用，快速构建简洁大方的现代web应用。</p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="http://git.oschina.net/wwccss/zui" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.oschina.net/wwccss/zui</a></p><h2>38.&nbsp;<a target="_blank" href="http://www.oschina.net/p/cocos2d-x" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Cocos2d-x</a></h2><p>Cocos2D-X 是全球知名的开源跨平台游戏引擎，易学易用，目前已经支持iOS、Android、Windows桌面、Mac OSX、Linux、BlackBerry、Windows Phone等平台。Cocos2d-JS统一了使用JS进行开发的开发体验，将HTML5引擎与JSB的API高度统一起来<span style="line-height: 1.5; font-size: 10pt;">。</span></p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="http://www.cocos2d-x.org/download?project_id=cocos2d-x" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://www.cocos2d-x.org/download?project_id=cocos2d-x</a></p><h2>39.&nbsp;<a target="_blank" href="http://www.oschina.net/p/d3" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">D3.js</a></h2><p>D3 是最流行的可视化库之一，它被很多其他的表格插件所使用。它允许绑定任意数据到DOM，然后将数据驱动转换应用到Document中。你可以使用它用一个数组创建基本的HTML表格，或是利用它的流体过度和交互，用相似的数据创建惊人的SVG条形图。</p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="https://github.com/mbostock/d3" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/mbostock/d3</a></p><h2>40.&nbsp;<a target="_blank" href="http://www.oschina.net/p/twitter-storm" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Twitter Storm</a></h2><p>Twitter Storm 是一个分布式的、容错的实时计算系统。Storm 为分布式实时计算提供了一组通用原语，可被用于&#8220;流处理&#8221;之中，实时处理消息并更新数据库。这是管理队列及工作者集群的另一种方式。</p><p>授权协议：EPL<br />源码下载：<a target="_blank" href="https://github.com/nathanmarz/storm" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/nathanmarz/storm</a></p><h2>41.&nbsp;<a target="_blank" href="http://www.oschina.net/p/redis" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Redis</a></h2><p>Redis&nbsp;是一个高性能的key-value数据库。 redis的出现，很大程度补偿了<a href="http://www.oschina.net/p/memcached" rel="nofollow" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">memcached</a>这类keyvalue存储的不足，在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python，Ruby，Erlang，PHP客户端，使用很方便。</p><p>授权协议：BSD<br />源码下载：<a target="_blank" href="https://github.com/antirez/redis" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/antirez/redis</a></p><h2>42.&nbsp;<a target="_blank" href="http://www.oschina.net/p/nutch" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Nutch</a></h2><p>Nutch&nbsp;是一个开源Java&nbsp;实现的搜索引擎。它提供了我们运行自己的搜索引擎所需的全部工具。包括全文搜索和Web爬虫。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="http://www.apache.org/dyn/closer.cgi/nutch/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://www.apache.org/dyn/closer.cgi/nutch/</a></p><h2>43.&nbsp;<a target="_blank" href="http://www.oschina.net/p/phonegap" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">PhoneGap</a></h2><p>PhoneGap 是一款 HTML5 平台，通过它，开发商可以使用 HTML、CSS 及 JavaScript 来开发本地移动应用程序。因此，目前开发商可以只编写一次应用程序，然后在 7 个主要的移动平台和应用程序商店 (App Store) 里进行发布。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="https://github.com/phonegap/phonegap" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/phonegap/phonegap</a></p><h2>44.&nbsp;<a target="_blank" href="http://www.oschina.net/p/mono" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Mono</a></h2><p>Mono 是一个由 Novell 公司主持的项目。该项目的目标是创建一系列符合ECMA 标准（Ecma-334 和Ecma-335）的.NET 工具，包括C# 编译器和共通语言执行平台。与微软的.NET Framework 不同，Mono 项目不仅可以运行于Windows 系统上，还可以运行于Linux，FreeBSD，Unix，Mac OS X 和Solaris。</p><p>授权协议：GPL/LGPL/MIT<br />源码下载：<a target="_blank" href="http://www.mono-project.com/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://www.mono-project.com/</a></p><h2>45.&nbsp;<a target="_blank" href="http://www.oschina.net/p/seafile" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Seafile</a></h2><p>Seafile 是新一代的开源云存储软件。它提供更丰富的文件同步和管理功能，以及更好的数据隐私保护和群组协作功能。Seafile 支持 Mac、Linux、Windows 三个桌面平台，支持 Android 和 iOS 两个移动平台。</p><p>授权协议：GPL<br />源码下载：<a target="_blank" href="http://git.oschina.net/lins05/seafile" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://git.oschina.net/lins05/seafile</a></p><h2>46.&nbsp;<a target="_blank" href="http://www.oschina.net/p/elasticsearch" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">ElasticSearch</a></h2><p>Elastic Search 是一个基于<a href="http://www.oschina.net/p/lucene" rel="nofollow" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Lucene</a>构建的开源，分布式，RESTful搜索引擎。设计用于云计算中，能够达到实时搜索，稳定，可靠，快速，安装使用方便。支持通过HTTP使用JSON进行数据索引。</p><p>授权协议：Apache<br />源码下载：<a target="_blank" href="https://github.com/elasticsearch/elasticsearch" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/elasticsearch/elasticsearch</a></p><h2>47.&nbsp;<a target="_blank" href="http://www.oschina.net/p/tor" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Tor</a></h2><p>Tor 是一个帮助你抵御流量分析的软件项目， 流量分析是一种对网络的监视行为。Tor 将你的通信通过一个由遍及全球的志愿者运行的中继（relay）所组成的分布式网络转发， 以此来保护你的安全：它令监视你的 Internet 连接的那些人无法知道你所访问的站点， 它还令你所访问的站点无法知道你的物理位置。</p><p>授权协议：BSD<br />源码下载：<a target="_blank" href="https://www.torproject.org/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://www.torproject.org/</a></p><h2>48.&nbsp;<a target="_blank" href="http://www.oschina.net/p/cacti" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Cacti</a></h2><p>Cacti 是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具。它通过snmpget来获取数据，使用 RRDtool绘画图形，而且你完全可以不需要了解RRDtool复杂的参数。</p><p>授权协议：GPL<br />源码下载：<a target="_blank" href="http://www.cacti.net/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://www.cacti.net/</a></p><h2>49.&nbsp;<a target="_blank" href="http://www.oschina.net/p/gitlab" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">GitLab</a></h2><p>GitLab是一个利用&nbsp;<a href="http://www.oschina.net/p/ruby+on+rails" target="_blank" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Ruby on Rails</a>&nbsp;开发的开源应用程序，实现一个自托管的<a href="http://www.oschina.net/p/git" rel="nofollow" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Git</a>项目仓库，可通过Web界面进行访问公开的或者私人项目。它拥有与<a href="http://www.oschina.net/p/github" rel="nofollow" target="_blank"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Github</a>类似的功能，能够浏览源代码，管理缺陷和注释。</p><p>授权协议：MIT<br />源码下载：<a target="_blank" href="https://github.com/gitlabhq/gitlabhq" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">https://github.com/gitlabhq/gitlabhq</a></p><h2>50.&nbsp;<a target="_blank" href="http://www.oschina.net/p/notepadplusplus" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">Notepad++</a></h2><p>Notepad++ 是一款非常有特色的编辑器，是开源软件，可以免费使用。支持的语言: C, C++ , Java , C#, XML, HTML, PHP, Javascript！</p><p>授权协议：GPL<br />源码下载：<a target="_blank" href="http://notepad-plus-plus.org/" rel="nofollow"  bluelink"="" tabindex="-1" style="border: 0px none; outline: none; color: #296bcc;">http://notepad-plus-plus.org/</a></p></div><img src ="http://www.blogjava.net/paulwong/aggbug/422097.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2015-01-07 00:08 <a href="http://www.blogjava.net/paulwong/archive/2015/01/07/422097.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>解压ZIP文件</title><link>http://www.blogjava.net/paulwong/archive/2014/10/29/419179.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 29 Oct 2014 09:34:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/10/29/419179.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/419179.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/10/29/419179.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/419179.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/419179.html</trackback:ping><description><![CDATA[在pom.xml中加入JAR包<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>commons-io<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>commons-io<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div><br />ZipUtil.java<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.io.File;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.FileInputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.FileOutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.InputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.OutputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.nio.charset.Charset;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.UUID;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.zip.ZipEntry;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.zip.ZipInputStream;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.commons.io.IOUtils;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ZipUtil&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;LoggerFactory.getLogger(ZipUtil.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;extractFolder(InputStream&nbsp;inputStream,&nbsp;String&nbsp;outputFolder)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZipInputStream&nbsp;zis&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Charset&nbsp;GBK&nbsp;=&nbsp;Charset.forName("GBK");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zis&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ZipInputStream(inputStream,&nbsp;GBK);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ZipEntry&nbsp;entry;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">while</span>&nbsp;((entry&nbsp;=&nbsp;zis.getNextEntry())&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;a&nbsp;file&nbsp;on&nbsp;HDD&nbsp;in&nbsp;the&nbsp;destinationPath&nbsp;directory<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;destinationPath&nbsp;is&nbsp;a&nbsp;"root"&nbsp;folder,&nbsp;where&nbsp;you&nbsp;want&nbsp;to&nbsp;extract&nbsp;your&nbsp;ZIP&nbsp;file</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;encoding&nbsp;=&nbsp;System.getProperty("file.encoding");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.info("encoding:"+encoding);&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;fileName&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;String(entry.getName().getBytes("GBK"),&nbsp;encoding);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;entryFile&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;File(outputFolder,&nbsp;fileName);<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;File&nbsp;entryFile&nbsp;=&nbsp;new&nbsp;File(outputFolder,&nbsp;entry.getName());</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(entry.isDirectory())&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(entryFile.exists())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.warn("Directory&nbsp;{0}&nbsp;already&nbsp;exists!",&nbsp;entryFile);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entryFile.mkdirs();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">else</span>&nbsp;{<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Make&nbsp;sure&nbsp;all&nbsp;folders&nbsp;exists&nbsp;(they&nbsp;should,&nbsp;but&nbsp;the&nbsp;safer,&nbsp;the&nbsp;better&nbsp;;-))</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(entryFile.getParentFile()&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>&nbsp;&amp;&amp;&nbsp;!entryFile.getParentFile().exists())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entryFile.getParentFile().mkdirs();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;Create&nbsp;file&nbsp;on&nbsp;disk</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(!entryFile.exists())&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entryFile.createNewFile();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;and&nbsp;rewrite&nbsp;data&nbsp;from&nbsp;stream</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;os&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FileOutputStream(entryFile);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOUtils.copy(zis,&nbsp;os);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">finally</span>&nbsp;{<br /><span style="color: #008000; ">//</span><span style="color: #008000; ">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;os.close();</span><span style="color: #008000; "><br /></span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOUtils.closeQuietly(os);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zis.closeEntry();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">finally</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IOUtils.closeQuietly(zis);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String&nbsp;[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException<br />&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">final</span>&nbsp;String&nbsp;INPUT_ZIP_FILE&nbsp;=&nbsp;"D:TESTING-FILE/ZIP/INPUT/应用.zip";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;OUTPUT_FOLDER&nbsp;=&nbsp;"D:/TESTING-FILE/ZIP/OUTPUT";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;OUTPUT_FOLDER&nbsp;+=&nbsp;File.separator&nbsp;+&nbsp;UUID.randomUUID().toString();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;inputStream&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FileInputStream(<span style="color: #0000FF; ">new</span>&nbsp;File(INPUT_ZIP_FILE));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;extractFolder(inputStream,&nbsp;OUTPUT_FOLDER);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">File&nbsp;file&nbsp;=&nbsp;new&nbsp;File(OUTPUT_FOLDER);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FileUtil.deleteFolder(file);</span><span style="color: #008000; ">*/</span><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br /><img src ="http://www.blogjava.net/paulwong/aggbug/419179.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-10-29 17:34 <a href="http://www.blogjava.net/paulwong/archive/2014/10/29/419179.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>EXCEL转JAVA BEAN</title><link>http://www.blogjava.net/paulwong/archive/2014/10/29/419178.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Wed, 29 Oct 2014 09:25:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/10/29/419178.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/419178.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/10/29/419178.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/419178.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/419178.html</trackback:ping><description><![CDATA[pom.xml回入以下包：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="font-size: 14px;">&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;</span><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>net.sf.jxls<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>jxls-core<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>net.sf.jxls<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>jxls-reader<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span>net.sf.jxls<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">groupId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span>jxls-examples<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">artifactId</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">dependency</span><span style="color: #0000FF; ">&gt;</span></div><br /><br />转换的配置文件：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">workbook</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">worksheet&nbsp;</span><span style="color: #FF0000; ">name</span><span style="color: #0000FF; ">="Sheet1"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">section&nbsp;</span><span style="color: #FF0000; ">startRow</span><span style="color: #0000FF; ">="0"</span><span style="color: #FF0000; ">&nbsp;endRow</span><span style="color: #0000FF; ">="0"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">loop&nbsp;</span><span style="color: #FF0000; ">startRow</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;endRow</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;items</span><span style="color: #0000FF; ">="result"</span><span style="color: #FF0000; ">&nbsp;var</span><span style="color: #0000FF; ">="app"</span><span style="color: #FF0000; ">&nbsp;varType</span><span style="color: #0000FF; ">="n.app.valueobject.App"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">section&nbsp;</span><span style="color: #FF0000; ">startRow</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;endRow</span><span style="color: #0000FF; ">="1"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="0"</span><span style="color: #0000FF; ">&gt;</span>app.title<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="1"</span><span style="color: #0000FF; ">&gt;</span>app.categoryId<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="2"</span><span style="color: #0000FF; ">&gt;</span>app.updateContent<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="3"</span><span style="color: #0000FF; ">&gt;</span>app.rank<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="4"</span><span style="color: #0000FF; ">&gt;</span>app.installedQty<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="5"</span><span style="color: #0000FF; ">&gt;</span>app.installedType<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="6"</span><span style="color: #0000FF; ">&gt;</span>app.discuss<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="7"</span><span style="color: #0000FF; ">&gt;</span>app.summary<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="8"</span><span style="color: #0000FF; ">&gt;</span>app.deviceTypes<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="9"</span><span style="color: #0000FF; ">&gt;</span>app.description<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="10"</span><span style="color: #0000FF; ">&gt;</span>app.newFeatures<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="11"</span><span style="color: #0000FF; ">&gt;</span>app.shortRecommend<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">mapping&nbsp;</span><span style="color: #FF0000; ">row</span><span style="color: #0000FF; ">="1"</span><span style="color: #FF0000; ">&nbsp;col</span><span style="color: #0000FF; ">="12"</span><span style="color: #0000FF; ">&gt;</span>app.appUrl<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">mapping</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">section</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">loopbreakcondition</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">rowcheck&nbsp;</span><span style="color: #FF0000; ">offset</span><span style="color: #0000FF; ">="0"</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;</span><span style="color: #800000; ">cellcheck&nbsp;</span><span style="color: #FF0000; ">offset</span><span style="color: #0000FF; ">="0"</span><span style="color: #FF0000; ">&nbsp;</span><span style="color: #0000FF; ">/&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">rowcheck</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">loopbreakcondition</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">loop</span><span style="color: #0000FF; ">&gt;</span><br />&nbsp;&nbsp;<span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">worksheet</span><span style="color: #0000FF; ">&gt;</span><br /><span style="color: #0000FF; ">&lt;/</span><span style="color: #800000; ">workbook</span><span style="color: #0000FF; ">&gt;</span></div><br /><br /><br />JAVA代码：<br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #0000FF; ">import</span>&nbsp;java.io.BufferedInputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.File;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.FileInputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.IOException;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.io.InputStream;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.ArrayList;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.HashMap;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.List;<br /><span style="color: #0000FF; ">import</span>&nbsp;java.util.Map;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;net.sf.jxls.reader.ReaderBuilder;<br /><span style="color: #0000FF; ">import</span>&nbsp;net.sf.jxls.reader.XLSReader;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;org.apache.poi.openxml4j.exceptions.InvalidFormatException;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.Logger;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.slf4j.LoggerFactory;<br /><span style="color: #0000FF; ">import</span>&nbsp;org.xml.sax.SAXException;<br /><br /><span style="color: #0000FF; ">import</span>&nbsp;application.app.valueobject.App;<br /><br /><span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">class</span>&nbsp;ExcelUtil&lt;T&gt;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">private</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;Logger&nbsp;logger&nbsp;=&nbsp;LoggerFactory.getLogger(ExcelUtil.<span style="color: #0000FF; ">class</span>);<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;List&lt;T&gt;&nbsp;parseExcelFileToBeans(InputStream&nbsp;xlsFileInputStream,&nbsp;InputStream&nbsp;jxlsConfigInputStream)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;IOException,&nbsp;SAXException,&nbsp;InvalidFormatException&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;T&gt;&nbsp;result&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ArrayList&lt;T&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Map&lt;String,&nbsp;Object&gt;&nbsp;beans&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;HashMap&lt;String,&nbsp;Object&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;beans.put("result",&nbsp;result);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;inputStream&nbsp;=&nbsp;<span style="color: #0000FF; ">null</span>;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XLSReader&nbsp;xlsReader&nbsp;=&nbsp;ReaderBuilder.buildFromXML(jxlsConfigInputStream);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputStream&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;BufferedInputStream(xlsFileInputStream);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xlsReader.read(inputStream,&nbsp;beans);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(IOException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(e.getMessage(),&nbsp;e);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(SAXException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(e.getMessage(),&nbsp;e);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(InvalidFormatException&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;logger.error(e.getMessage(),&nbsp;e);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">throw</span>&nbsp;e;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">finally</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">if</span>&nbsp;(inputStream&nbsp;!=&nbsp;<span style="color: #0000FF; ">null</span>)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">try</span>&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;inputStream.close();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<span style="color: #0000FF; ">catch</span>&nbsp;(Exception&nbsp;e)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&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;&nbsp;&nbsp;<span style="color: #0000FF; ">return</span>&nbsp;result;<br />&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">public</span>&nbsp;<span style="color: #0000FF; ">static</span>&nbsp;<span style="color: #0000FF; ">void</span>&nbsp;main(String[]&nbsp;args)&nbsp;<span style="color: #0000FF; ">throws</span>&nbsp;Exception&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;path&nbsp;=&nbsp;"D:/DATA/TESTING-FILE/EXCEL";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;path&nbsp;=&nbsp;System.getProperty("user.home");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExcelUtil&lt;App&gt;&nbsp;util&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;ExcelUtil&lt;App&gt;();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;excelFilePath&nbsp;=&nbsp;path&nbsp;+&nbsp;File.separator&nbsp;+&nbsp;"appData.xls";<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;configInputStream&nbsp;=&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ExcelUtil.<span style="color: #0000FF; ">class</span>.getResourceAsStream("/excel/template/config/app_config.xml");<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;InputStream&nbsp;xlsFileInputStream&nbsp;=&nbsp;<span style="color: #0000FF; ">new</span>&nbsp;FileInputStream(excelFilePath);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List&lt;App&gt;&nbsp;appList&nbsp;=&nbsp;util.parseExcelFileToBeans(xlsFileInputStream,&nbsp;configInputStream);<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000FF; ">for</span>&nbsp;(App&nbsp;app&nbsp;:&nbsp;appList)&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println(app.toString());<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #008000; ">/*</span><span style="color: #008000; ">String&nbsp;[]&nbsp;args2&nbsp;=&nbsp;{""};<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;GroupingSample.main(args2);</span><span style="color: #008000; ">*/</span><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />}</div><br /><br /><a href="http://www.yihaomen.com/article/java/530.htm" target="_blank">http://www.yihaomen.com/article/java/530.htm</a><img src ="http://www.blogjava.net/paulwong/aggbug/419178.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-10-29 17:25 <a href="http://www.blogjava.net/paulwong/archive/2014/10/29/419178.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>JAVA线程池例子</title><link>http://www.blogjava.net/paulwong/archive/2014/09/09/417757.html</link><dc:creator>paulwong</dc:creator><author>paulwong</author><pubDate>Mon, 08 Sep 2014 23:31:00 GMT</pubDate><guid>http://www.blogjava.net/paulwong/archive/2014/09/09/417757.html</guid><wfw:comment>http://www.blogjava.net/paulwong/comments/417757.html</wfw:comment><comments>http://www.blogjava.net/paulwong/archive/2014/09/09/417757.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/paulwong/comments/commentRss/417757.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/paulwong/services/trackbacks/417757.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: 用途及用法&nbsp; &nbsp; &nbsp; &nbsp;网络请求通常有两种形式：第一种，请求不是很频繁，而且每次连接后会保持相当一段时间来读数据或者写数据，最后断开，如文件下载，网络流媒体等。另一种形式是请求频繁，但是连接上以后读/写很少量的数据就断开连接。考虑到服务的并发问题，如果每个请求来到以后服务都为它启动一个线程，那么这对服务的资源可能会造成很大的浪费，特别是第二种情况。因为通常情...&nbsp;&nbsp;<a href='http://www.blogjava.net/paulwong/archive/2014/09/09/417757.html'>阅读全文</a><img src ="http://www.blogjava.net/paulwong/aggbug/417757.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/paulwong/" target="_blank">paulwong</a> 2014-09-09 07:31 <a href="http://www.blogjava.net/paulwong/archive/2014/09/09/417757.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>