﻿<?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-&lt;b&gt;BeanSoft's Java Blog&lt;/b&gt;-随笔分类-Open Source World</title><link>http://www.blogjava.net/beansoft/category/17575.html</link><description>&lt;a href="http://www.beansoft.biz/?p=132"&gt;《MyEclipse 6 Java 开发中文教程》完整版书籍代码及配套超高清讲解视频免费下载&lt;/a&gt;</description><language>zh-cn</language><lastBuildDate>Wed, 22 Sep 2010 07:23:13 GMT</lastBuildDate><pubDate>Wed, 22 Sep 2010 07:23:13 GMT</pubDate><ttl>60</ttl><item><title>转: Java 开源条码生成组件 Barcode4J</title><link>http://www.blogjava.net/beansoft/archive/2009/05/04/268783.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Mon, 04 May 2009 03:48:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2009/05/04/268783.html</guid><description><![CDATA[<p><a title="http://sourceforge.net/projects/barcode4j" href="http://sourceforge.net/projects/barcode4j">http://sourceforge.net/projects/barcode4j</a></p> <p>&nbsp;</p> <p>Barcode4J is a flexible generator for barcodes written in Java and available under the Apache License v2.0. Features: Extensions for Apache FOP, Xalan-J and SAXON, Servlet, command-line interface, output to SVG, EPS, Java2D/AWT and bitmaps.</p> <p>&nbsp;</p> <p>相关文章: <a title="http://www.javaresearch.org/article/71081.htm" href="http://www.javaresearch.org/article/71081.htm">http://www.javaresearch.org/article/71081.htm</a>&nbsp;<b>Barcode功能说明</b> <a href="http://annegu.javaeye.com/blog/91632">条形码barcode4j的使用</a></p> <p>&nbsp;</p> <p>2007-06-18 <h5><a href="http://annegu.javaeye.com/blog/91632">条形码barcode4j的使用</a></h5> <p>前几天老大说要我弄下条形码，然后我就上网google了一下，用的比较多的是barbecue和barcode4j。 <br>我先使用的是barbecue，条形码是可以显示出来，可是下面的对应数字却不能显示，当然可以自己手动加上去，不过那就不是一张图片里面的了，排版也不是很好看。因此我就试了一下barcode4j，效果挺好的，所以把使用方法贴上来，给刚接触java的朋友们一点借鉴。 <br>1、 google或者摆渡一下barcode4j要用的东东，下载压缩包barcode4j-2.0alpha2-bin.zip和barcode4j-2.0alpha2-src.zip。 <br>2、 解压barcode4j-2.0alpha2-bin.zip这个包，在build目录下有barcode4j.jar，在lib目录下有avalon-framework-4.2.0.jar， 将barcode4j.jar和avalon-framework-4.2.0.jar添加到项目的lib中，刷新工程，然后在项目配置中将这两个jar包添加到classpath里面去。 <br>3、 解压将barcode4j-2.0alpha2-src.zip，将src\java\org\krysalis\barcode4j\servlet目录下的BarcodeServlet.java类的代码拷出来，修改默认的图片显示方式，BarcodeServlet.java第168行的默认图片显示格式改成jpeg（因为不是所有的浏览器都支持svg格式，也不是所有的浏览者都愿意给自己的浏览器加一个这样的插件） <br>4、 将以下这段servlet配置在web.xml中 <br>&lt;servlet&gt; <br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;BarcodeServlet&lt;/servlet-name&gt; <br>&nbsp;&nbsp;&nbsp; &lt;servlet-class&gt;com.yourname.BarcodeServlet&lt;/servlet-class&gt; <br>&nbsp; &lt;/servlet&gt; <br>&nbsp; &lt;servlet-mapping&gt; <br>&nbsp;&nbsp;&nbsp; &lt;servlet-name&gt;BarcodeServlet&lt;/servlet-name&gt; <br>&nbsp;&nbsp;&nbsp; &lt;url-pattern&gt;/barcode&lt;/url-pattern&gt; <br>&nbsp; &lt;/servlet-mapping&gt; <br>4、 在页面中添加&lt;img src="&lt;%=request.getContextPath() %&gt;/barcode?msg=12345678" height="50px" width=130px/&gt; <br>5、 查看该页面就可以发现条形码为“12345678”的图片了，当然了图片大小就自己设置了。 <br>呵呵，虽然是很简单的东西，但是希望能对需要的朋友有所帮助。  <p>&nbsp;</p> <p><b>Barcode功能说明</b> <p><a href="mailto:xfj.natural@163.com">FengShen_Xia</a> 整理&nbsp;&nbsp; 更新：2007-05-31 13:45:48&nbsp; 版本: 1.0&nbsp;&nbsp;&nbsp; <p>Barcode1.0功能说明<br>一、Barcode项目说明：<br>&nbsp;&nbsp;&nbsp; 利用Barcode4j开源项目开发面向java bs的条形码打印功能。<br>二、Barcode项目功能：<br>&nbsp;&nbsp;&nbsp; 1、利用Barcode4j项目实现8种类型条形码。<br>&nbsp;&nbsp;&nbsp; 2、通过url调用实现web页面显示条形码。<br>&nbsp;&nbsp;&nbsp; 3、通过xml文件配置实现预定义条码类型。<br>&nbsp;&nbsp;&nbsp; 4、实现所见所得的条形码调试、配置功能。<br>三、Barcode实现步骤<br>&nbsp;&nbsp;&nbsp; 1、将barcode4j.jar、barcode.jar复制到\webRoot\WEB-INF\lib目录下。<br>&nbsp;&nbsp;&nbsp; 2、在\webRoot\WEB-INF\web.xml中添加BarCodeServlet<br>&lt;servlet&gt;<br>&lt;servlet-name&gt;barcode-invoker&lt;/servlet-name&gt;<br>&lt;servlet-class&gt;barcode.servlet.BarCodeServlet&lt;/servlet-class&gt;<br>&lt;init-param&gt;<br>&nbsp; &lt;param-name&gt;conf&lt;/param-name&gt;<br>&nbsp; &lt;param-value&gt;/conf/barcode_conf.xml&lt;/param-value&gt;<br>&lt;/init-param&gt;<br>&lt;load-on-startup&gt;1&lt;/load-on-startup&gt;<br>&lt;/servlet&gt;<br>&lt;servlet-mapping&gt;<br>&nbsp; &lt;servlet-name&gt;barcode-invoker&lt;/servlet-name&gt;<br>&nbsp; &lt;url-pattern&gt;*.barcode&lt;/url-pattern&gt;<br>&lt;/servlet-mapping&gt;<br>BarCodeServlet说明：<br>1、conf参数用来设置预定义条码类型，不设置没有预定义类型。<br>2、/conf/barcode_conf.xml为预定义条码类型配置文件。文件放在\webRoot\WEB-INF\classes\conf\目录下。<br>3、*.barcode为要显示条码的url识别。<br>3、在web页面中调用url。<br>案例:<br>1、&lt;img src=” CODE39.barcode?code=123456789”&gt;<br>2、&lt;img src=” _a1.barcode?code=123456789”&gt;<br>URL说明：<br>[类型*]. barcode?code**=...&amp;其他参数***<br>*：类型分固定类型（10种）和预定义类型（类型前加_）。<br>**：code是必要参数。<br>***：其他参数用来丰富条码显示效果。<br>四、参数说明：<br>名称&nbsp;&nbsp;&nbsp; 类型&nbsp;&nbsp;&nbsp; 默认值&nbsp;&nbsp;&nbsp; 说明<br>解析度:&nbsp;&nbsp;&nbsp; dpi&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; 150&nbsp;&nbsp;&nbsp; 值越大条码越长，分辨率越高。<br>留空白&nbsp;&nbsp;&nbsp; quietZone&nbsp;&nbsp;&nbsp; boolean&nbsp;&nbsp;&nbsp; false&nbsp;&nbsp;&nbsp; 条码两端是否加空白<br>取反&nbsp;&nbsp;&nbsp; antiAlias&nbsp;&nbsp;&nbsp; boolean&nbsp;&nbsp;&nbsp; false&nbsp;&nbsp;&nbsp; 条码内取反，具体功能不详<br>图片反转&nbsp;&nbsp;&nbsp; orientation&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 旋转条码,可选为[0, 90, 180, 270, -90, -180 ,-270]<br>高度&nbsp;&nbsp;&nbsp; barHeight&nbsp;&nbsp;&nbsp; double&nbsp;&nbsp;&nbsp; 15&nbsp;&nbsp;&nbsp; 条码显示高度，为比例数<br>字体显示&nbsp;&nbsp;&nbsp; hrp&nbsp;&nbsp;&nbsp; int&nbsp;&nbsp;&nbsp; 2&nbsp;&nbsp;&nbsp; 字体显示位置，为0时候屏蔽fontName、fontSize参数。<br>0=HRP_NONE<br>1=HRP_TOP<br>2=HRP_BOTTOM<br>字体名称&nbsp;&nbsp;&nbsp; fontName&nbsp;&nbsp;&nbsp; String&nbsp;&nbsp;&nbsp; Helvetica&nbsp;&nbsp;&nbsp; 跟随条码的字体类型，比如：宋体、黑体等等<br>字体大小&nbsp;&nbsp;&nbsp; fontSize&nbsp;&nbsp;&nbsp; double&nbsp;&nbsp;&nbsp; 2.8&nbsp;&nbsp;&nbsp; 跟随条码的字体大小，为比例数<br>五、xml文件说明：<br>&lt;?xml version="1.0" encoding="GBK"?&gt;<br>&lt;barcode_conf&gt;<br>&lt;a3 fontSize="4" fontName="黑体" hrp="0" barHeight="23" orientation="0" antiAlias="false" quietZone="false" dpi="200" type="CODE39"/&gt;<br>&lt;a2 type="CODE39"/&gt;<br>&lt;a1 type="CODE39"/&gt;<br>&lt;/barcode_conf&gt;<br>案例中定义了a1、a2、a3三个预定义类型。可以设置9种参数，其中<br>type是必要参数并对应10种基本条码类型。<br>注意URL、参数和xml文件node属性的大小写!<br>六、条码调试程序功能说明：<br>1、显示图片：根据填写的10个参数动态显示条码。打印代码和类型为必选条件。<br>2、保存设置：对调试的条码样式比较满意后，赐予编号后保存在下面列表里供以后调用显示或生成配置。注意编号不能重复。<br>3、列表显示：可以将保存的配置重新显示。<br>4、列表删除：删除该行配置。<br>5、显示全部：将保存的所有条码配置显示出来，以供打印校验使用。<br>6、显示配置：将保存的所有条码配置显示为预定义xml格式。<br>7、资源下载：为bs项目集成barcode提供资源样例下载。<br>8、复制URL：将当前显示条码的url路径复制的系统粘贴板上（only IE）。<br>9、原始比例：将条码图形缩放比例恢复到100%（only IE）。<br>10、条码缩放：在选中条码缩放框的情况下，点击条码图片后可以用鼠标滚轮实现20%-500%图片缩放功能（only IE）。<br>以上功能在IE、firefox下调试成功。<br>七、图例<br>类型&nbsp;&nbsp;&nbsp; Barcode type&nbsp;&nbsp;&nbsp; PNG graphic<br>CODE39&nbsp;&nbsp;&nbsp; Code 39&nbsp;&nbsp;&nbsp;&nbsp; <br>CODE128&nbsp;&nbsp;&nbsp; Code 128&nbsp;&nbsp;&nbsp;&nbsp; <br>INT2OF5&nbsp;&nbsp;&nbsp; Interleaved 2 of 5&nbsp;&nbsp;&nbsp;&nbsp; <br>CODABAR&nbsp;&nbsp;&nbsp; Codabar&nbsp;&nbsp;&nbsp;&nbsp; <br>UPCA&nbsp;&nbsp;&nbsp; UPC-A&nbsp;&nbsp;&nbsp;&nbsp; <br>UPCE&nbsp;&nbsp;&nbsp; UPC-E&nbsp;&nbsp;&nbsp;&nbsp; <br>EAN13&nbsp;&nbsp;&nbsp; EAN-13&nbsp;&nbsp;&nbsp;&nbsp; <br>EAN8&nbsp;&nbsp;&nbsp; EAN-8&nbsp;&nbsp;&nbsp;&nbsp; <br>PDF417&nbsp;&nbsp;&nbsp; PDF417&nbsp;&nbsp;&nbsp;&nbsp; <br>DATAMATRIX&nbsp;&nbsp;&nbsp; DataMatrix&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </p><img src ="http://www.blogjava.net/beansoft/aggbug/268783.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2009-05-04 11:48 <a href="http://www.blogjava.net/beansoft/archive/2009/05/04/268783.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Apache BeanUtils 妙用</title><link>http://www.blogjava.net/beansoft/archive/2009/04/29/268206.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Wed, 29 Apr 2009 11:19:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2009/04/29/268206.html</guid><description><![CDATA[<p>1) 从 FormBean 复制值到 JavaBean 或者互相复制.<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TdepartmentForm deptForm = (TdepartmentForm) form;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tdepartment tdepartment = new Tdepartment();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanUtils.copyProperties(tdepartment, deptForm);<br>2) 复制实体(实体一般是动态的代理类)为 ValueObject 防止原始实体的值被更新掉<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Tproviderbill billVO = new Tproviderbill();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BeanUtils.copyProperties(billVO, dao.getBill(1));// 复制属性, 防止原实体被修改<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(billVO.xxx == xxx) {<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; billVO.setName(“aaaa”);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 保存查询结果<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; request.setAttribute("bill", billVO);  <p>不过, 又有人指出 CGLIB 复制 Bean 速度更快, 效率更高(目前尚未做相关测试)!  <p>static BeanCopier copy = BeanCopier.create(Bean.class, Bean2.class, false);  <p>void beanCopies(Object source , Object target)｛ <br>&nbsp;&nbsp;&nbsp; copy.copy(source, target, null); <br>}</p><img src ="http://www.blogjava.net/beansoft/aggbug/268206.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2009-04-29 19:19 <a href="http://www.blogjava.net/beansoft/archive/2009/04/29/268206.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>用开源软件edtftpj实现FTP文件上传下载,无中文问题</title><link>http://www.blogjava.net/beansoft/archive/2008/11/26/242872.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Wed, 26 Nov 2008 12:57:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/11/26/242872.html</guid><description><![CDATA[<p>上周给某单位做了一次开发培训, 学员们希望学习用FTP上传下载的Java实现. 上网找了下, 最后找到了两个, 一个是 Apache的Jakarta Commons Net来实现, 其设置选项还是挺多的, 网上的资料也很多, Google一下一大把, 另一个则是<a title="http://www.enterprisedt.com/" href="http://www.enterprisedt.com/">http://www.enterprisedt.com/</a> 开发的一个开源和商业版本的FTP类库, 商业版本支持批量目录的上传和下载. 用的过程中发现了中文问题, 不过最后还是胜利解决了.</p> <p>&nbsp;&nbsp;&nbsp; 先说一下搭建测试FTP服务器, 一般Windows下用的多的有Server-U(收费)等, 开源的有FileZilla FTP Server(经测试貌似无法上传超过100MB的文件, 不知道哪里有设置, 最后否定了), 目前使用的是一款免费绿色小巧的FTP服务器来做测试: TYPSoft FTP Server. 下载后直接解压缩即可运行, 不过如果要显示中文界面的话, 请修改config.ini:</p> <blockquote> <p>LangFile=chineses</p></blockquote> <p>之后建立用户进行测试就可以了. 界面如下所示:</p> <p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/edtftpjFTP_11AE8/image_2.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="419" alt="image" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/edtftpjFTP_11AE8/image_thumb.png" width="430" border="0"></a> </p> <p>&nbsp;</p> <p>一般的客户端连接中文Windows下的FTP服务器, 默认编码是GB2312, 因此不加设置的话很容易无法上传和下载中文附件. 网上有一些代码片段讨论Jakarta Commons Net, 但是看起来正确的解决此问题的代码不多. 其实FtpClient类已经提供了设置的方法, 调用:</p> <blockquote> <p>ftpClient.setControlEncoding("gb2312"); </p></blockquote> <p>即可, 这样在打开Socket的时候都会才用正确的reader和writer了. 相关的源码片段如下:</p> <div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none"><span style="color: #008000">/**</span>
<span style="color: #008000"> * Sets the character encoding used by the FTP control connection.</span>
<span style="color: #008000"> * Some FTP servers require that commands be issued in a non-ASCII</span>
<span style="color: #008000"> * encoding like UTF-8 so that filenames with multi-byte character</span>
<span style="color: #008000"> * representations (e.g, Big 8) can be specified.</span>
<span style="color: #008000"> *</span>
<span style="color: #008000"> * @param encoding The new character encoding for the control connection.</span>
<span style="color: #008000"> */</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> setControlEncoding(String encoding) {
    _controlEncoding = encoding;
}


<span style="color: #008000">/**</span>
<span style="color: #008000"> * @return The character encoding used to communicate over the</span>
<span style="color: #008000"> * control connection.</span>
<span style="color: #008000"> */</span>
<span style="color: #0000ff">public</span> String getControlEncoding() {
    <span style="color: #0000ff">return</span> _controlEncoding;
}</pre></div>
<p></p>
<p>&nbsp;</p>
<p>下面要说的是edtftpj, 去其官方网站下载得到ZIP, 解压缩后即可运行其自带的例子, 不过默认清空下不支持汉字. 例子及压缩包内容如下图所示:</p>
<p><a href="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/edtftpjFTP_11AE8/image_4.png"><img title="image" style="border-right: 0px; border-top: 0px; display: inline; border-left: 0px; border-bottom: 0px" height="359" alt="image" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/edtftpjFTP_11AE8/image_thumb_1.png" width="292" border="0"></a> </p>
<p>可见支持的功能还是挺全面的, 要看的例子就是upload_download_and_delete_a_file, 现在新建一个Java项目, 把lib\edtftpj.jar加入项目即可,然后将例子复制进来编译运行, 如下所示:</p>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">import com.enterprisedt.net.ftp.FileTransferClient;
import com.enterprisedt.util.debug.Level;
import com.enterprisedt.util.debug.Logger;
import java.io.File;

<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> UploadDownloadFiles {

    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) {

        <span style="color: #008000">// we want remote host, user name and password</span>
        <span style="color: #0000ff">if</span> (args.length &lt; 3) {
            System.<span style="color: #0000ff">out</span>
                    .println(<span style="color: #006080">"Usage: run remote-host username password"</span>);
            System.exit(1);
        }

        <span style="color: #008000">// extract command-line arguments</span>
        String host = args[0];
        String username = args[1];
        String password = args[2];
        String filename = <span style="color: #006080">"UploadDownloadFiles.java"</span>;

        <span style="color: #008000">// set up logger so that we get some output</span>
        Logger log = Logger.getLogger(UploadDownloadFiles.<span style="color: #0000ff">class</span>);
        Logger.setLevel(Level.INFO);

        FileTransferClient ftp = <span style="color: #0000ff">null</span>;

        <span style="color: #0000ff">try</span> {
            <span style="color: #008000">// create client</span>
            log.info(<span style="color: #006080">"Creating FTP client"</span>);
            ftp = <span style="color: #0000ff">new</span> FileTransferClient();

            <span style="color: #008000">// set remote host</span>
            ftp.setRemoteHost(host);
            ftp.setUserName(username);
            ftp.setPassword(password);

            <span style="color: #008000">// connect to the server</span>
            log.info(<span style="color: #006080">"Connecting to server "</span> + host);
            ftp.connect();
            log.info(<span style="color: #006080">"Connected and logged in to server "</span> + host);

            log.info(<span style="color: #006080">"Uploading file"</span>);
            ftp.uploadFile(filename, filename);
            log.info(<span style="color: #006080">"File uploaded"</span>);

            log.info(<span style="color: #006080">"Downloading file"</span>);
            ftp.downloadFile(filename + <span style="color: #006080">".copy"</span>, filename);
            log.info(<span style="color: #006080">"File downloaded"</span>);

            log.info(<span style="color: #006080">"Deleting remote file"</span>);
            ftp.deleteFile(filename);
            log.info(<span style="color: #006080">"Deleted remote file"</span>);

            File file = <span style="color: #0000ff">new</span> File(filename + <span style="color: #006080">".copy"</span>);
            file.delete();
            log.info(<span style="color: #006080">"Deleted local file copy"</span>);

            <span style="color: #008000">// Shut down client</span>
            log.info(<span style="color: #006080">"Quitting client"</span>);
            ftp.disconnect();

            log.info(<span style="color: #006080">"Example complete"</span>);

        } <span style="color: #0000ff">catch</span> (Exception e) {
            e.printStackTrace();
        }
    }

}</pre></div>
<div>具体操作包括上传,下载,不过当文件名为中文时候, 上传和下载都会出现问题, 报错提示服务器找不到文件. 最终解决方法是继承FileTransferClient,然后获取连接时的配置信息然后修改交互时的字符集:</div>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">import com.enterprisedt.net.ftp.FileTransferClient;

<span style="color: #008000">/**</span>
<span style="color: #008000"> * 可以设置连接时的字符集的FTP客户端.</span>
<span style="color: #008000"> * @author BeanSoft</span>
<span style="color: #008000"> * 2008-11</span>
<span style="color: #008000"> */</span>
<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> SetEncodingFileTransferClient extends FileTransferClient {
    <span style="color: #008000">/**</span>
<span style="color: #008000">     * 设置连接时的字符集, 默认值是US-ASCII.</span>
<span style="color: #008000">     * @param controlEncoding 字符集名, 如GB2312等</span>
<span style="color: #008000">     */</span>
    <span style="color: #0000ff">public</span> synchronized <span style="color: #0000ff">void</span> setControlEncoding(String controlEncoding) {
        super.masterContext.setControlEncoding(controlEncoding);
   }
}</pre></div>
<p>相应的测试代码是:</p>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">import java.io.File;

import com.enterprisedt.util.debug.Level;
import com.enterprisedt.util.debug.Logger;

<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> UploadDownloadFiles {

    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) {
        <span style="color: #008000">// extract command-line arguments</span>
        String host = <span style="color: #006080">"localhost"</span>;
        String username = <span style="color: #006080">"test"</span>;
        String password = <span style="color: #006080">"test"</span>;
        String filename = <span style="color: #006080">"图片输出.gif"</span>;

        <span style="color: #008000">// set up logger so that we get some output</span>
        Logger log = Logger.getLogger(UploadDownloadFiles.<span style="color: #0000ff">class</span>);
        Logger.setLevel(Level.INFO);

        SetEncodingFileTransferClient ftp = <span style="color: #0000ff">null</span>;

        <span style="color: #0000ff">try</span> {
            <span style="color: #008000">// create client</span>
            log.info(<span style="color: #006080">"Creating FTP client"</span>);
            ftp = <span style="color: #0000ff">new</span> SetEncodingFileTransferClient();

            <span style="color: #008000">// set remote host</span>
            ftp.setRemoteHost(host);
            ftp.setUserName(username);
            ftp.setPassword(password);
            ftp.setControlEncoding(<span style="color: #006080">"GB2312"</span>);

            <span style="color: #008000">// connect to the server</span>
            log.info(<span style="color: #006080">"Connecting to server "</span> + host);
            ftp.connect();
            log.info(<span style="color: #006080">"Connected and logged in to server "</span> + host);

            log.info(<span style="color: #006080">"Uploading file"</span>);
            ftp.uploadFile(filename, filename);
            log.info(<span style="color: #006080">"File uploaded"</span>);

            log.info(<span style="color: #006080">"Downloading file"</span>);
            ftp.downloadFile(filename + <span style="color: #006080">".copy"</span>, filename);
            log.info(<span style="color: #006080">"File downloaded"</span>);

            log.info(<span style="color: #006080">"Deleting remote file"</span>);
            <span style="color: #008000">//ftp.deleteFile(filename);</span>
            log.info(<span style="color: #006080">"Deleted remote file"</span>);

            File file = <span style="color: #0000ff">new</span> File(filename + <span style="color: #006080">".copy"</span>);
           <span style="color: #008000">// file.delete();</span>
            log.info(<span style="color: #006080">"Deleted local file copy"</span>);

            <span style="color: #008000">// Shut down client</span>
            log.info(<span style="color: #006080">"Quitting client"</span>);
            ftp.disconnect();

            log.info(<span style="color: #006080">"Example complete"</span>);

        } <span style="color: #0000ff">catch</span> (Exception e) {
            e.printStackTrace();
        }
    }

}</pre></div>
<p>运行后服务器可看到正确的文件名, 而本机则可以下载到正确的文件副本.</p>
<p>输出日志为:</p>
<blockquote>
<p>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.203 : Creating FTP client<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.359 : Connecting to server localhost<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.546 : Connected and logged in to server localhost<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.546 : Uploading file<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.703 : File uploaded<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.703 : Downloading file<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.734 : File downloaded<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.734 : Deleting remote file<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.734 : Deleted remote file<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.734 : Deleted local file copy<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.734 : Quitting client<br>INFO [ftp.UploadDownloadFiles] 26 十一月 2008 21:02:48.734 : Example complete</p></blockquote>
<p></p>
<p></p>
<p></p>
<p>运行后一切正常, 非常好. 而此软件包的付费版本可支持目录批量上传和下载(Apache Commons Net 貌似不支持), 当然了, 许可证就要自己想办法Crack了:</p>
<div><pre style="padding-right: 0px; padding-left: 0px; font-size: 8pt; padding-bottom: 0px; margin: 0em; overflow: visible; width: 100%; color: black; border-top-style: none; line-height: 12pt; padding-top: 0px; font-family: consolas, 'Courier New', courier, monospace; border-right-style: none; border-left-style: none; background-color: #f4f4f4; border-bottom-style: none">import com.enterprisedt.net.ftp.FTPClient;
import com.enterprisedt.net.ftp.pro.ProFTPClient;
import com.enterprisedt.util.debug.Level;
import com.enterprisedt.util.debug.Logger;
import java.io.File;

<span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> TransferMultipleFilesDirectories {

    <span style="color: #0000ff">public</span> <span style="color: #0000ff">static</span> <span style="color: #0000ff">void</span> main(String[] args) {

        <span style="color: #008000">// we want remote host, user name and password</span>
        <span style="color: #0000ff">if</span> (args.length &lt; 5) {
            System.<span style="color: #0000ff">out</span>
                    .println(<span style="color: #006080">"Usage: run remote-host username password localdir remotedir"</span>);
            System.exit(1);
        }

        <span style="color: #008000">// extract command-line arguments</span>
        String host = args[0];
        String username = args[1];
        String password = args[2];
        String localDir = args[3];
        String remoteDir = args[4];

        <span style="color: #008000">// set up logger so that we get some output</span>
        Logger log = Logger.getLogger(TransferMultipleFilesDirectories.<span style="color: #0000ff">class</span>);
        Logger.setLevel(Level.DEBUG);

        ProFTPClient ftp = <span style="color: #0000ff">null</span>;

        <span style="color: #0000ff">try</span> {
            <span style="color: #008000">// create client</span>
            log.info(<span style="color: #006080">"Creating FTP client"</span>);
            ftp = <span style="color: #0000ff">new</span> ProFTPClient();

            <span style="color: #008000">// set remote host</span>
            log.info(<span style="color: #006080">"Setting remote host"</span>);
            ftp.setRemoteHost(host);

            <span style="color: #008000">// connect to the server</span>
            log.info(<span style="color: #006080">"Connecting to server "</span> + host);
            ftp.connect();
            log.info(<span style="color: #006080">"Connected to server "</span> + host);

            <span style="color: #008000">// log in</span>
            log.info(<span style="color: #006080">"Logging in with username="</span> + username + <span style="color: #006080">" and password="</span>
                    + password);
            ftp.login(username, password);
            log.info(<span style="color: #006080">"Logged in"</span>);

            log.info(<span style="color: #006080">"Uploading directory"</span>);
            ftp.mput(localDir, remoteDir, <span style="color: #006080">"*.html"</span>, <span style="color: #0000ff">true</span>);
            log.info(<span style="color: #006080">"Directory uploaded"</span>);
            
            log.info(<span style="color: #006080">"Downloading directory"</span>);
            ftp.mget(localDir + <span style="color: #006080">".copy"</span>, remoteDir, <span style="color: #006080">"*.html"</span>, <span style="color: #0000ff">true</span>);
            log.info(<span style="color: #006080">"Directory downloaded"</span>);
            
            log.info(<span style="color: #006080">"Deleting remote directory"</span>);
            ftp.rmdir(remoteDir, <span style="color: #0000ff">true</span>);
            log.info(<span style="color: #006080">"Remote directory deleted"</span>);

            <span style="color: #008000">// Shut down client</span>
            log.info(<span style="color: #006080">"Quitting client"</span>);
            ftp.quit();

            log.info(<span style="color: #006080">"Example complete"</span>);

        } <span style="color: #0000ff">catch</span> (Exception e) {
            e.printStackTrace();
        }
    }

}
</pre></div>
<p>至此, 我们的任务已经完成, 可以加上定时器之类的软件或者类库实现定时同步/备份文件等功能. 想获取本项目源代码? 请点击 <a title="http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/java/opensource/javaftp.zip" href="http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/java/opensource/javaftp.zip">http://cid-519b3f7aa2172030.skydrive.live.com/self.aspx/java/opensource/javaftp.zip</a> 138KB 下载(单线程下载, 请不要用下载软件如迅雷).</p><img src ="http://www.blogjava.net/beansoft/aggbug/242872.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-11-26 20:57 <a href="http://www.blogjava.net/beansoft/archive/2008/11/26/242872.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于Flash开源的SparkWeb聊天客户端很神奇</title><link>http://www.blogjava.net/beansoft/archive/2008/08/06/220434.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Wed, 06 Aug 2008 06:20:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/08/06/220434.html</guid><description><![CDATA[
		<p>看到好多公司都使用了在线客服，其实可以考虑试试这个，纯开源，免费，缺点就是现在不知道怎么汉化它。注意只能配合最新版的OpenFire开源Jabber服务器，这两个的下载地址都在<a title="http://www.igniterealtime.org/" href="http://www.igniterealtime.org/">http://www.igniterealtime.org/</a>。据说可以支持语音视频聊天，需要Red5插件，具体没时间去看了。</p>
		<p>登录：</p>
		<p>
				<a href="/images/blogjava_net/beansoft/WindowsLiveWriter/FlashSparkWeb_C835/image_2.png">
						<img title="image" style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="320" alt="image" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/FlashSparkWeb_C835/image_thumb.png" width="529" border="0" />
				</a>
		</p>
		<p>下图显示了两个窗口，一个是Web的Flash客户端，一个是纯Java的客户端。</p>
		<p>
				<a href="/images/blogjava_net/beansoft/WindowsLiveWriter/FlashSparkWeb_C835/image_4.png">
						<img title="image" style="BORDER-TOP-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-RIGHT-WIDTH: 0px" height="407" alt="image" src="http://www.blogjava.net/images/blogjava_net/beansoft/WindowsLiveWriter/FlashSparkWeb_C835/image_thumb_1.png" width="644" border="0" />
				</a>
		</p>
		<p>最后是官方网站的截图：</p>
		<p>
				<img src="http://red5.4ng.net/gtms/sparkweb5.png" />
		</p>
<img src ="http://www.blogjava.net/beansoft/aggbug/220434.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-08-06 14:20 <a href="http://www.blogjava.net/beansoft/archive/2008/08/06/220434.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>sourceforge 无法下载开源软件的解决方法</title><link>http://www.blogjava.net/beansoft/archive/2008/07/04/212604.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 04 Jul 2008 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/07/04/212604.html</guid><description><![CDATA[<p></p> <p>近期,不知道何故,技术人员钟爱的开源软件大本营sf.net(就是<a href="http://www.sourceforge.net">www.sourceforge.net</a>),上面的软件无法下载了,包括JBoss, Spring, Hibernate 等一系列软件都无法更新了, 这怎么办?</p> <p>答案是:</p> <p><a title="ftp://download.sourceforge.net/pub/sourceforge/" href="ftp://download.sourceforge.net/pub/sourceforge/">ftp://download.sourceforge.net/pub/sourceforge/</a></p> <p>试试吧, 很方便的, 可以下载大部分的软件(不是100%可打开).</p> <p>例如 Spring 的下载地址是:</p> <p><a title="ftp://download.sourceforge.net/pub/sourceforge/s/sp/springframework/" href="ftp://download.sourceforge.net/pub/sourceforge/s/sp/springframework/">ftp://download.sourceforge.net/pub/sourceforge/s/sp/springframework/</a></p><img src ="http://www.blogjava.net/beansoft/aggbug/212604.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-07-04 14:53 <a href="http://www.blogjava.net/beansoft/archive/2008/07/04/212604.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>MapEasy 作者更新的 webgis完整功能例子.rar，鹰眼，测距，拖拉缩放[MOVED]</title><link>http://www.blogjava.net/beansoft/archive/2008/05/09/199420.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Fri, 09 May 2008 01:54:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/05/09/199420.html</guid><description><![CDATA[
		<h4>
				<a href="http://www.beansoft.biz/?p=254">MapEasy 作者更新的 webgis完整功能例子.rar，鹰眼，测距，拖拉缩放</a>
		</h4>
<img src ="http://www.blogjava.net/beansoft/aggbug/199420.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-05-09 09:54 <a href="http://www.blogjava.net/beansoft/archive/2008/05/09/199420.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>基于开源软件做个和GTalk聊天的小命令行程序[MOVED]</title><link>http://www.blogjava.net/beansoft/archive/2008/01/26/177886.html</link><dc:creator>BeanSoft</dc:creator><author>BeanSoft</author><pubDate>Sat, 26 Jan 2008 03:34:00 GMT</pubDate><guid>http://www.blogjava.net/beansoft/archive/2008/01/26/177886.html</guid><description><![CDATA[
		<a href="http://www.beansoft.biz/?p=443">http://www.beansoft.biz/?p=443</a>
<img src ="http://www.blogjava.net/beansoft/aggbug/177886.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/beansoft/" target="_blank">BeanSoft</a> 2008-01-26 11:34 <a href="http://www.blogjava.net/beansoft/archive/2008/01/26/177886.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>