最近使用java 写一个ftp上传文件的功能,发现 commons-net 3.5 中ftp客户端,在jdk7(jdk1.0.79)下面报:
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)
at java.net.SocketOutputStream.write(SocketOutputStream.java:159)
at sun.nio.cs.StreamEncoder.writeBytes(StreamEncoder.java:221)
at sun.nio.cs.StreamEncoder.implFlushBuffer(StreamEncoder.java:291)
at sun.nio.cs.StreamEncoder.implFlush(StreamEncoder.java:295)
at sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:141)
at java.io.OutputStreamWriter.flush(OutputStreamWriter.java:229)
at java.io.BufferedWriter.flush(BufferedWriter.java:254)
at org.apache.commons.net.ftp.FTP.__send(FTP.java:525)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:499)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:628)
at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:602)
at org.apache.commons.net.ftp.FTP.quit(FTP.java:884)
at org.apache.commons.net.ftp.FTPClient.logout(FTPClient.java:1152)
at com.aebiz.bas.util.ftp.FtpUtil.close(FtpUtil.java:149)
at com.aebiz.bas.util.ftp.FtpUtil.ftp(FtpUtil.java:136)
at com.aebiz.bas.util.ftp.FtpUtil.main(FtpUtil.java:188)
但是在jdk6下面可以正常工作。
我门生产系使用的jdk7,只好用jdk7 自带的客户端,编写ftp 的上传功能了。
使用commons-net 3.5 编写代码如下:
package com.aebiz.bas.util.ftp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import com.aebiz.pub.logs.PubLogs;
import com.aebiz.pub.util.DateUtil;
import com.aebiz.pub.util.StringUtil;
/**
* ftp 工具类
* apache 支持jdk6,不支持 jdk7
* @author dell
*
*/
public class FtpUtil {
//超时时间
private static final int FTP_TIME_OUT = 5000000;
private static FTPClient ftp;
/**
* 连接ftp 服务器,并且登录
* @return
*/
public static boolean connect(){
boolean flag = false;
ftp = new FTPClient();
try {
String serverIp = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_IP);
int port = FtpResource.getInstane().getIntKey(FtpResource.FTP_SERVER_PORT);
String user = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_USER);
String pwd = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_PWD);
// ftp.setDefaultTimeout(FTP_TIME_OUT);
// ftp.setDataTimeout(FTP_TIME_OUT);
ftp.connect(serverIp, port);
flag = ftp.login(user, pwd);
//传送文件类型
ftp.setFileType(FTP.BINARY_FILE_TYPE);
} catch (SocketException e) {
//e.printStackTrace();
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("文件上传连接出现SocketException异常=");
sbLog.append(e.getMessage());
PubLogs.printLogError(sbLog, null);
return flag;
} catch (Exception e) {
e.printStackTrace();
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("文件上传连接出现Exception异常=");
sbLog.append(e.getMessage());
PubLogs.printLogError(sbLog, null);
return flag;
}
int reply = 0;
try {
reply = ftp.getReplyCode();
System.out.println("code="+reply);
if (!FTPReply.isPositiveCompletion(reply))
{
ftp.disconnect();
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("FTP server refused connection.");
sbLog.append(";退出服务");
PubLogs.printLogError(sbLog, null);
}
} catch (Exception e) {
e.printStackTrace();
}
return flag;
}
/**
* 上传文件
* @param path
* @param fileName
* @return
*/
public static boolean ftp(final String path,final String fileName){
InputStream local =null;
boolean result = false;
if(StringUtil.isEmpty(fileName)){
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("fileName 参数为空,无法上传文件");
PubLogs.printLogError(sbLog, null);
return result;
}
try {
local = new FileInputStream(path+File.separator+fileName);
String serverPath = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_PATH);
result =ftp.storeFile(serverPath+fileName, local);
} catch (FileNotFoundException e) {
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("没有发现文件异常=");
sbLog.append(e.getMessage());
PubLogs.printLogError(sbLog, null);
}catch (IOException e) {
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("没有发现文件异常=");
sbLog.append(e.getMessage());
PubLogs.printLogError(sbLog, null);
}finally{
if(null != local){
try {
local.close();
} catch (IOException e) {
e.printStackTrace();
}
}
close();
}
return result;
}
//关闭ftp
public static void close(){
if (ftp!=null && ftp.isConnected()) {
try {
ftp.logout();
ftp.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
// boolean result = FtpUtil.connect();
// if(result){
// String path=FtpResource.getInstane().getStrKey(FtpResource.CLIENT_FILE_PATH);
// System.out.println(FtpUtil.ftp(path,"noinfo.txt"));
// }
//OrderBO bo = new OrderBO();
//查询未进行结算的订单
List list = new ArrayList();
list.add("==================ddd");
//生成结算文件
WriteFile wf = new WriteFile();
//路径
String path = FtpResource.getInstane().getStrKey(FtpResource.CLIENT_FILE_PATH);
//文件名称
String fileName =DateUtil.DateToString(Calendar.getInstance().getTime(), DateUtil.DATE_FORMAT_DATEONLYNOSP);
boolean result = wf.write(list, path, fileName);
//上传对账文件
if(result){
boolean ftpResult = FtpUtil.connect();
if(ftpResult){
boolean ftpfile = FtpUtil.ftp(path,fileName);
if(ftpfile){
StringBuffer log = new StringBuffer(60);
log.append("上文件成功,名称:");
log.append(fileName);
PubLogs.autoLogInfo(log, null);
}else{
StringBuffer log = new StringBuffer(60);
log.append("上文件成功,名称:");
log.append(fileName);
PubLogs.autoLogInfo(log, null);
}
}
}else{
StringBuffer log = new StringBuffer(60);
log.append("生成对账文件时失败,对账文件名称:");
log.append(fileName);
PubLogs.autoLogError(log, null);
}
}
}
########################################################################
jdk7 自带的ftp 编写代码如下:
package com.aebiz.bas.util.ftp;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.net.InetSocketAddress;
import java.net.SocketException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Iterator;
import java.util.List;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
import sun.net.ftp.FtpDirEntry;
import sun.net.ftp.FtpProtocolException;
import com.aebiz.pub.logs.PubLogs;
import com.aebiz.pub.util.DateUtil;
import com.aebiz.pub.util.StringUtil;
/**
* jdk7 版文件上传功能
* 只支持jdk7
* @author dell
*
*/
public class FtpJava {
/**
*
* FTP客户端
*/
private FtpClient ftpClient;
/**
* 连接ftp 服务器,并且登录
* @return
*/
public boolean connect(){
boolean flag = false;
try {
String serverIp = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_IP);
int port = FtpResource.getInstane().getIntKey(FtpResource.FTP_SERVER_PORT);
String user = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_USER);
String pwd = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_PWD);
ftpClient =FtpClient.create();
ftpClient.connect(new InetSocketAddress(serverIp, port));
ftpClient.login(user,pwd.toCharArray());
// 设置成2进制传输
ftpClient.setBinaryType();
System.out.println("login success!");
flag = true;
} catch (SocketException e) {
//e.printStackTrace();
flag = false;
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("文件上传连接出现SocketException异常=");
sbLog.append(e.getMessage());
PubLogs.printLogError(sbLog, null);
return flag;
} catch (Exception e) {
flag = false;
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("文件上传连接出现Exception异常=");
sbLog.append(e.getMessage());
PubLogs.printLogError(sbLog, null);
return flag;
}
return flag;
}
/**
* 上传文件
* @param path
* @param fileName
* @return
*/
public boolean ftp(final String path,final String fileName){
InputStream local =null;
boolean result = false;
try {
String serverPath = FtpResource.getInstane().getStrKey(FtpResource.FTP_SERVER_PATH);
if (!StringUtil.isEmpty(serverPath)){
// 把远程系统上的目录切换到参数path所指定的目录
ftpClient.changeDirectory(serverPath);
}
Iterator<FtpDirEntry> it = ftpClient.listFiles(fileName);
//如果文件已经存在删除
if(it.hasNext()){
ftpClient.deleteFile(fileName);
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("删除重复提交文件=");
sbLog.append(fileName).append(";result=");
sbLog.append(ftpClient.getLastResponseString());
PubLogs.printLogError(sbLog, null);
}
} catch (FtpProtocolException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
if(StringUtil.isEmpty(fileName)){
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("fileName 参数为空,无法上传文件");
PubLogs.printLogError(sbLog, null);
return result;
}
TelnetOutputStream os = null;
try {
local = new FileInputStream(path+File.separator+fileName);
// 将远程文件加入输出流中
os = (TelnetOutputStream) ftpClient.putFileStream(fileName, true);
// 创建一个缓冲区
byte[] bytes = new byte[1024];
int c;
while ((c = local.read(bytes)) != -1)
{
os.write(bytes, 0, c);
}
} catch (FileNotFoundException e) {
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("没有发现文件异常=");
sbLog.append(e.getMessage());
PubLogs.printLogError(sbLog, null);
}catch (Exception e) {
StringBuffer sbLog = new StringBuffer(60);
sbLog.append("没有发现文件异常=");
sbLog.append(e.getMessage());
PubLogs.printLogError(sbLog, null);
}finally{
if(null != local){
try {
local.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(null !=os){
try {
os.close();
} catch (Exception e2) {
e2.printStackTrace();
}
}
close();
}
return result;
}
//关闭ftp
public void close(){
if (ftpClient!=null && ftpClient.isConnected()) {
try {
ftpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void main(String[] args) {
//查询未进行结算的订单
List list = new ArrayList();
list.add("=66==========99=====456==ddd");
//生成结算文件
WriteFile wf = new WriteFile();
//路径
String path = FtpResource.getInstane().getStrKey(FtpResource.CLIENT_FILE_PATH);
//文件名称
String fileName =DateUtil.DateToString(Calendar.getInstance().getTime(), DateUtil.DATE_FORMAT_DATEONLYNOSP);
boolean result = wf.write(list, path, fileName);
//上传对账文件
if(result){
FtpJava ftpJava = new FtpJava();
boolean ftpResult = ftpJava.connect();
if(ftpResult){
boolean ftpfile = ftpJava.ftp(path,fileName);
if(ftpfile){
StringBuffer log = new StringBuffer(60);
log.append("上文件成功,名称:");
log.append(fileName);
PubLogs.autoLogInfo(log, null);
}else{
StringBuffer log = new StringBuffer(60);
log.append("上文件成功,名称:");
log.append(fileName);
PubLogs.autoLogInfo(log, null);
}
}
}else{
StringBuffer log = new StringBuffer(60);
log.append("生成对账文件时失败,对账文件名称:");
log.append(fileName);
PubLogs.autoLogError(log, null);
}
}
}
相关推荐
FTP是一种用于在互联网上传输文件的标准协议,它的主要功能包括下载、上传文件,以及管理远程服务器上的文件。Apache Commons Net库提供了一套完整的API,使得Java程序员可以方便地实现这些功能,而无需关心底层的...
赠送jar包:commons-net-3.3.jar; 赠送原API文档:commons-net-3.3-javadoc.jar; 赠送源代码:commons-net-3.3-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
- Commons Net提供了完善的FTP客户端实现,可以进行文件的上传、下载、删除等操作,支持FTP、FTPS(FTP over SSL/TLS)和SFTP(SSH File Transfer Protocol)。 - 在不同版本中,FTP客户端的性能和稳定性得到了...
commons-csv-1.4.jar java生成CSV文件jar包,jdk1.6可用 commons-csv-1.4.jar java生成CSV文件jar包,jdk1.6可用 commons-csv-1.4.jar java生成CSV文件jar包,jdk1.6可用 commons-csv-1.4.jar java生成CSV文件jar包...
apache.commons.compress 第三方开源软件。能解压,压缩文件。里面包括commons-compress-1.9、commons-compress-1.2.1的版本。 当遇到这种错误,应该重点关注Caused by:后面的内容 Caused by:xxx Unsupported major....
在web项目中经常会用到json数据(如...json-lib-2.4-jdk15.jar json所依赖的jar如下: commons-beanutils-1.8.0.jar commons-collections-3.2.1.jar commons-lang-3.7.jar commons-logging-1.1.1.jar ezmorph-1.0.6.jar
Apache Commons Net 1.4.1提供了一个全面的Java实现,支持FTP的各种操作,包括上传、下载、列出目录、创建和删除文件等。这个库不仅简化了FTP交互,还处理了许多底层的网络细节,如连接管理和错误处理,使得开发者...
赠送jar包:commons-codec-1.15.jar; 赠送原API文档:commons-codec-1.15-javadoc.jar; 赠送源代码:commons-codec-1.15-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:commons-beanutils-1.9.4.jar; 赠送原API文档:commons-beanutils-1.9.4-javadoc.jar; 赠送源代码:commons-beanutils-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:istack-commons-runtime-3.0.12.jar; 赠送原API文档:istack-commons-runtime-3.0.12-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
压缩包子文件的文件名称列表包括"jdk-7u80-linux-x64.tar.gz"和"linux下使用.txt"。前者是JDK的安装包,后者可能是一个指南或说明文档,指导用户如何在Linux环境下安装和配置JDK。在Linux中,安装JDK通常涉及以下...
它引入了许多新特性,旨在提高开发效率、增强语言功能和提升性能。以下是一些关键的Java 7特性: 1. **多 catch 语句**:允许在一个try-catch块中捕获多个异常类型,使得代码更加简洁。 2. **二进制整数和浮点数字...
赠送jar包:istack-commons-runtime-3.0.12.jar; 赠送原API文档:istack-commons-runtime-3.0.12-javadoc.jar; 赠送源代码:istack-...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
赠送jar包:commons-csv-1.8.jar; 赠送原API文档:commons-csv-1.8-javadoc.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。 双语对照,边学技术、边学英语。
赠送jar包:commons-io-2.7.jar; 赠送原API文档:commons-io-2.7-javadoc.jar; 赠送源代码:commons-io-2.7-sources.jar;...人性化翻译,文档中的代码和结构保持不变,注释和说明精准翻译,请放心使用。
这个文件包含了JDK的所有组成部分,如Java编译器(javac)、Java虚拟机(JVM)、Java运行时环境(JRE)、开发者工具(如javadoc和jconsole)以及其他必要的库和文件。使用tar.gz格式是为了在Linux上节省磁盘空间并...
- 更新了JavaFX SDK,增强了其多媒体功能和支持。 - 对Java API进行了微调,修复了一些已知的问题。 #### 四、JDK 7 Linux x64 版本安装指南 ##### 4.1 下载JDK 7 Linux x64 根据提供的网盘链接...
总的来说,"jdk-7u80-windows-x64.rar"文件对于Java开发者而言是一个重要的资源,它包含了运行和开发Java应用程序所需的全部组件。通过正确安装和配置,开发者可以利用JDK 7 Update 80的特性来构建高效、安全且跨...
标题中的"commons-httpclient3.1.jar,commons-codec1.3.jar,commons-logging1.1.1.jar"指的是三个关键的Java库文件,它们是Apache HttpClient项目的一部分,用于在Java应用程序中实现HTTP通信。这些JAR(Java ...
Java开发工具JDK(Java Development Kit)是Oracle公司提供的用于编写和运行Java应用程序的重要软件包。JDK 1.7,也称为Java SE 7(Java Standard Edition 7),是Java编程语言的一个重要版本,发布于2011年,包含了...