读取ftp上文件,生成excel,再上传到ftp
import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.SocketException;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import javax.annotation.Resource;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import com.base.util.DateUtils;
import com.ibatis.sqlmap.client.SqlMapClient;
public class Reconciliation {
@Resource
private SqlMapClient sqlMapClient;
private static String ip = "*******";
private static int port = 21;
private static String userName = "***"; // 用户名
private static String userPwd = "****"; // 密码
public void reconciliation() throws IOException {
InputStream fin = this.getClass().getClassLoader()
.getResourceAsStream("template/reconciliation.xls");
HSSFWorkbook wb = new HSSFWorkbook(fin);// 解析xls格式
// 生成对账文件
creatFile(wb);
}
/**
* 功能:Java读取txt文件的内容 步骤:1:先获得文件句柄 2:获得文件句柄当做是输入一个字节码流,需要对这个输入流进行读取
* 3:读取到输入流后,需要读取生成字节流 4:一行一行的输出。readline()。 备注:需要考虑的是异常情况
*
* @param filePath
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public void creatFile(HSSFWorkbook wb) {
ArrayList list = new ArrayList();
// 连接ftp服务器
FTPClient ftpClient = connectServer(ip, port, userName, userPwd, null);
int reply = ftpClient.getReplyCode();
if (!FTPReply.isPositiveCompletion(reply)) {
try {
ftpClient.disconnect();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return;
}
/**这行要加上,FTPClient.enterLocalPassiveMode();这个方法的意思就
*是每次数据连接之前,ftp client告诉ftp server开通一个端口来传输数据。为什么要这样
*做呢,因为ftp server可能每次开启不同的端口来传输数据,但是在linux上或者其他服务器*上面,由于安全限制,可能某些端口没有开启,就会出现阻塞。
*/
ftpClient.enterLocalPassiveMode();
// 文件名称,当前日期前一天
SimpleDateFormat sFormat = new SimpleDateFormat("yyyyMMdd");
String fileName = "11610000" + sFormat.format(DateUtils.getLastDay());
InputStream ins = null;
BufferedReader reader = null;
ByteArrayOutputStream os= null;
try {
// 从服务器上读取指定的文件
ins = ftpClient.retrieveFileStream(fileName + ".cvs");
reader = new BufferedReader(new InputStreamReader(ins, "GBK"));
// 从第二行开始写数据
int i = 1;
String line;
Sheet sheet = wb.getSheetAt(0);
while ((line = reader.readLine()) != null) {
creatRow(sheet, i, line);
String[] textconten = line.split("\\|");
Map param = new HashMap();
param.put("TXNTM", textconten[1]);
param.put("TXNAMT", textconten[4]);
param.put("INSADR", textconten[11]);
param.put("LOGNO", textconten[13]);
int cnt = queryRecord(param);
if (cnt == 0) {
list.add(line);
}
i++;
}
// 主动调用一次getReply()把接下来的226消费掉. 这样做是可以解决这个返回null问题
ftpClient.getReply();
// 对账有差异的数据,写入到第二个sheet中
writeSecondSheet(wb, list);
// 设置为流传输
ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE);
// 输出流转为输入流,上传到ftp
os = new ByteArrayOutputStream();
wb.write(os);
byte[] b = os.toByteArray();
ByteArrayInputStream in = new ByteArrayInputStream(b);
ftpClient.storeFile(fileName + ".xls", in);
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (ins != null) {
ins.close();
}
if (reader != null) {
reader.close();
}
if(os != null){
os.close();
}
// 关闭ftp连接
closeServer(ftpClient);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
private int queryRecord(Map param) {
int cnt = 0;
try {
cnt = (Integer) sqlMapClient.queryForObject(
"selectCntReconciliation", param);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return cnt;
}
/**
* 对账有差异的数据,写入到第二个sheet中
*
* @param wb
* @param list
*/
private void writeSecondSheet(Workbook wb, ArrayList list) {
Sheet sheet = wb.getSheetAt(1);
for (int i = 0; i < list.size(); i++) {
creatRow(sheet, i + 1, (String) list.get(i));
}
}
/**
* 每列数据
*
* @param wb
* @param list
*/
private void creatRow(Sheet sheet, int i, String line) {
Row row = sheet.createRow(i);
String[] textconten = line.split("\\|");
if (textconten != null) {
for (int j = 0; j < textconten.length; j++) {
String content = textconten[j];
Cell cell = row.createCell(j);
cell.setCellValue(content);
}
}
}
/**
* @param ip
* @param port
* @param userName
* @param userPwd
* @param path
* @throws SocketException
* @throws IOException
* function:连接到服务器
*/
public FTPClient connectServer(String ip, int port, String userName,
String userPwd, String path) {
FTPClient ftpClient = new FTPClient();
try {
// 连接
ftpClient.connect(ip, port);
// 登录
ftpClient.login(userName, userPwd);
if (path != null && path.length() > 0) {
// 跳转到指定目录
ftpClient.changeWorkingDirectory(path);
}
} catch (SocketException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return ftpClient;
}
/**
* @throws IOException
* function:关闭连接
*/
public void closeServer(FTPClient ftpClient) {
if (ftpClient.isConnected()) {
try {
ftpClient.logout();
ftpClient.disconnect();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
分享到:
相关推荐
用C#实现文件上传到FTP,从ftp下载,读取文件
winfrom连接FTP站点上传文件,并能读取FTp站点内文件,
启动前读取配置文件ftp_upload.ini. */ func main() { // 读取配置文件 iniConfig := new(util.Config) iniConfig.InitConfig("./ftp_upload.ini") host := iniConfig.Read("ftp","host") // ftp地址 port :=...
FTP上传文件,FTP解决乱码问题 解决乱码讲new String(s.getBytes("gbk"),"ISO8859-1");//其转换后还是乱码 改成国际中文标准码就行了
JAVA获取FTP文件列表,功能齐全。包括:链接到服务器,上传文件到FTP服务器,从FTP服务器上下载文件并返回下载文件长度,返回FTP目录下的文件列表,删除FTP上的文件及目录,关闭链接。
一款由java实现ftp自动上传整个磁盘所有文件,包括目录,下面的JTextArea读取Log4j及命令行的信息,采用第三方ftpClient.不过下载的部分还没有时间去做.
java ftp上传进行文件的读取和上传 上传单个文件的文件流 创建远程服务器目录 删除指定文件 上传单个文件 获取指定ftp目录下文件名
完整实现ftp上传与下载并解析csv文件,并实现对文件内容进行分析及错误信息的提示及保存日志,并可以实现多个文件同时下载,并且同时解析
java的ftp类,可实现ftp服务器间拷贝文件,读写、上传、下载等功能。上传和下载部分参考了其它程序员的代码,表示感谢。
Java ftp工具类,可以实现ftp上传,读取,目录切换,内容创建,目录创建、检查文件是否存在,支持主动方式和被动方式读取
引用FTP通道上传文件,将FTP上传通道主要封装在 ftpupload.jar 包内,将要引用FTP通道上传文件的项目引入ftpupload.jar包即可,具体的引用方法可双击ftpupload.jar查看!
已经测试 完全没问题 大可以满足你的简单需求 修改液很容易 里面有详细的注释说明
通过winform、C#代码来获取ftp服务器的文件列表,从而进行下载或者判断文件是否上传成功。
对FTP服务器文件的基本操做:上传下载递归目录遍历等。
MFC下FTP上传文件夹工具,支持读取配置文件
FTP文件上传下载源码 Properties配置文件读取 日志配置和使用 命令调用
在WINFORM 框架下,实现对FTP服务器的图片上传,在线浏览和删除操作。 本代码为本人原创,希望对大家有帮助。
怎样用VB实现在FTP上生成目录及把此FTP上的一些文件复制到此目录下
构建了一个ftp服务器,通过命令ftp可登录,登录后,无法下载,上传,ls也无法执行。 通过 passive 开启和关闭 PASV模式,再ls 也是同样的问题, # 主动模式 $ pftp -v -A -d 211.159.185.xxx Connected to 211...