天天看点

JAVA+Ftpclient操作

最近再做个ftp上传、下载的项目,用到的包是sun.net.ftp.FtpClient。本地开发测试一切正常,放到服

务器测试,程序开始罢工。无奈之下,只能逐步输出日志,查找原因,现做个小结。

环境:

本地的开发环境是win7+jdk1.5,另本地搭建一个ftp服务器,软件使用的是serv_U。

服务器上的环境是linux+jdk1.5.

经过分析发现,linux环境与win环境的ftp操作有以下差别:

1、文件中的数据回车换行符不同

win的回车换行时:/r/n

linux的回车换行是:/n

解决办法是:

1)由于unix和windows系统参数的差别,故不使用硬编码进行换行,通过使用System.getProperties

("line.separator");获取换行符

2)也可通过使用out.newLine();实现

2、ftp的根路径不同

加入:ftp用户名:user,密码:11111

根目录:win:c://upload;linux:/data/upload

子目录:win:c://upload/abc;linux:/data/upload/abc

win系统中,以ftp的用户名和密码登陆后,可直接进入cd(/abc),即可进入到abc目录

但是,在linux系统中,以ftp的用户名和密码登陆后,需要cd完整的路径才可以进入目录,即:cd(/data

/upload/abc),不可使用cd(/abc)。

所以,要注意linux系统的文件操作时要完整的绝对路径,而不能使用相对路径。

3、问题总结:

由该问题可延伸至操作系统常用参数的差别,如:

line.separator(windows:"/r/n";unix:"/n");

file.separator(windows:"/";unix:"/");

path.separator(windows:";";unix:":");

4、 FTP的ASCII和Binary两种传输方式有何不同

    ASCII模式和Binary模式的区别是回车换行的处理,Binary模式不对数据进行任何处理,ASCII模式将

回车换行转换为本机的回车字符,比如:UNIX下是/n,Windows下是/r/n,Mac下是/r。

    ASCII模式下会转换文件,不能说是不同系统对回车换行解释不同,而是不同的系统有不同的行结束符

。UNIX系统下行结束符是一个字节,即十六进制的0A,而Windows的系统是两个字节,即十六进制的0D0A,

所以当你用ASCII方式从UNIX的FTP Server下载文件到Windows系统上时(不管是二进制或者文本文件),每

检测到一个字节是0A,就会自动插入一个0D,所以如果你的文件是二进制文件,比如可执行文件、压缩包

什么的,就肯定不能用了。如果你的文件就是UNIX下的文本文件,你用ASCII模式是正确的,要是误用了

Binary模式,你在Windows上看这个文件是没有换行的,里面是一个个的黑方块,也就是当你的文件是文本

文件时,建议使用ASCII模式,这样可以使用得不同的平台传上去的文件到另一平台时能正确显示换行情况

,而对于可执行文件或压缩文件等其它非文本文件,最好用Binary方式,因为这个传上去的和本机的一模

一样,只要你在同一个平台上就可以打开它,或都你将你的FTP服务器放在UNIX平台上,而用户使用

windows平台,那么上传上去的非文本文件,用户只要下载到windows平台一般就可以打开它。

    一般来说,我们最好都用Binary方式,这样可以保证不出错。如果有文本格式转换的问题,即UNIX格

式的文本和DOS格式的文本之间的转换,有很多工具可以做的,不要在ftp传输的时候冒险,尤其是你如果

对这些东西不是非常清楚的话。

PS:java的System.getProperty()方法可以获取的值:

java.version  Java 运行时环境版本

java.vendor  Java 运行时环境供应商

java.vendor.url  Java 供应商的 URL

java.home  Java 安装目录

java.vm.specification.version  Java 虚拟机规范版本

java.vm.specification.vendor  Java 虚拟机规范供应商

java.vm.specification.name  Java 虚拟机规范名称

java.vm.version  Java 虚拟机实现版本

java.vm.vendor  Java 虚拟机实现供应商

java.vm.name  Java 虚拟机实现名称

java.specification.version  Java 运行时环境规范版本

java.specification.vendor  Java 运行时环境规范供应商

java.specification.name  Java 运行时环境规范名称

java.class.version  Java 类格式版本号

java.class.path  Java 类路径

java.library.path  加载库时搜索的路径列表  7款发型秀出完美脸型

java.io.tmpdir  默认的临时文件路径

java.compiler  要使用的 JIT 编译器的名称

java.ext.dirs  一个或多个扩展目录的路径

os.name  操作系统的名称

os.arch  操作系统的架构

os.version  操作系统的版本

file.separator  文件分隔符(在 UNIX 系统中是“/”)

path.separator  路径分隔符(在 UNIX 系统中是“:”)

line.separator  行分隔符(在 UNIX 系统中是“/n”)

user.name  用户的账户名称

user.home  用户的主目录

user.dir  用户的当前工作目录