(本文纯属是在工作中笔记,只是实现了基本的操作,在遍历数据去重复的那块代码写的不怎么好,数据量大了很耗时(需要大家自己实现),建议使用c3p0-0.9.5.2.bin第三方库进行管理数据库与服务器的频繁连接,有不妥的地方请大家多多包涵........
SFTP概念:
是Secure File Transfer Protocol的缩写,安全文件传送协议。可以为传输文件提供一种安全的网络的加密方法。
SFTP需要的jar包:
由于jar包无法上传把需要所需要的jar包名称在这里标注好了点击这里进行下载对应的jar包,
不会下载的小伙伴附上教程。
SFTP上文件代码:
package text;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.HashMap;
import java.util.Map;
import com.jcraft.jsch.ChannelSftp;
/**
*
* @author 文件上传
*
*/
public class SFTPTest {
public SFTPChannel getSFTPChannel() {
return new SFTPChannel();
}
public static void main(String[] args) throws Exception {
SFTPTest test = new SFTPTest();
Map sftpDetails = new HashMap();
// 设置主机ip,端口,用户名,密码
sftpDetails.put(SFTPConstants.SFTP_REQ_HOST, "你远程服务器ip地址");
sftpDetails.put(SFTPConstants.SFTP_REQ_USERNAME, "远程服务器用户名");
sftpDetails.put(SFTPConstants.SFTP_REQ_PASSWORD, "远程服务器密码");
sftpDetails.put(SFTPConstants.SFTP_REQ_PORT, "端口号");
String src =""; // 本地文件名
String dst =""; // 目标文件名
//初始化配置
SFTPChannel channel = test.getSFTPChannel();
ChannelSftp chSftp = channel.getChannel(sftpDetails, 响应时间);
File file = new File(src);
long fileSize = file.length();
OutputStream out = chSftp.put(dst, new FileProgressMonitor(fileSize), ChannelSftp.OVERWRITE); // 使用OVERWRITE模式 数据传输的模式
byte[] buff = new byte[1024 * 256]; // 设定每次传输的数据块大小为256KB
int read;
if (out != null) {
System.out.println("Start to read input stream");
InputStream is = new FileInputStream(src);
do {
read = is.read(buff, 0, buff.length);
if (read > 0) {
out.write(buff, 0, read);
}
out.flush();
} while (read >= 0);
System.out.println("input stream read done.");
}
//chSftp.put(src, dst, new FileProgressMonitor(fileSize), ChannelSftp.OVERWRITE); // 代码段2
// chSftp.put(new FileInputStream(src), dst, new FileProgressMonitor(fileSize), ChannelSftp.OVERWRITE); // 代码段3
chSftp.quit();
channel.closeChannel();
}
}
SFTP下载文件:
package download;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Properties;
import java.util.Vector;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.ChannelSftp.LsEntry;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;
/**
*
* @author 优化后的代码 配合.properties(配置文件)使用 使用配置文件的目的:使代码更加灵活
*
*/
public class SFTPDownload {
private static String SERVER_IP,SERVER_USER_NAME,SERVER_USER_PASSWORD,SERVER_SFTPPATH,SERVER_LOCALPATH,SERVER_Url,LOCAl_URL,MYSQL_URL,MYSQL_USERNAME,MYSQL_USERPASSWORD;
private static final int TIMOUT=10000;
private static List list;
private Session sshSession = null;
private static Channel channel = null;
private static ChannelSftp sftp = null;
private String host;// 服务器连接ip
private String username;// 用户名
private String password;// 密码
private int timout;//请求时间
private int port = 8822;
@SuppressWarnings("static-access")
public static void main(String[] args) {
config();
// 连接服务器
/*SFTPDownload sftp = null;
if (sftp == null) {
sftp = new SFTPDownload(SERVER_IP, SERVER_USER_NAME, SERVER_USER_PASSWORD,TIMOUT);
sftp.connect();
//遍历服务器指定文件内容
System.out.println("-----------遍历服务器数据---------");
sftp.batchDownLoadFile(SERVER_SFTPPATH, SERVER_LOCALPATH, "ASSESS", ".txt");
}*/
}
public static void config(){
// 创建属性文件对象
Properties p = new Properties();
//配置文件存在本地的路径
String path = "";
InputStream in = null;
try {
in = new BufferedInputStream(new FileInputStream(path));
p.load(in);
//远程服务器IP地址
SERVER_IP=p.getProperty("IP");
//名称
SERVER_USER_NAME=p.getProperty("USER_NAME");
//密码
SERVER_USER_PASSWORD=p.getProperty("USER_PASSWORD");
//远程服务器地址
SERVER_SFTPPATH=p.getProperty("sftpPath");
//保存到本地的地址
SERVER_LOCALPATH=p.getProperty("localPath");
//查找出远程服务器里面最新文件的地址
SERVER_Url=p.getProperty("serverUrl");
//保存到本地地址的路径
LOCAl_URL=p.getProperty("localUrl");
//mysql数据库的地址
MYSQL_URL=p.getProperty("mysql_url");
//mysql数据库的用户名
MYSQL_USERNAME=p.getProperty("mysql_username");
//mysql数据库的密码
MYSQL_USERPASSWORD=p.getProperty("mysql_userpassword");
System.out.println("数据库地址:"+MYSQL_URL);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
/**
* 遍历服务器指定文件夹下最新的文件
*/
@SuppressWarnings("unused")
public static String batchDownLoadFile(String remotePath, String localPath,String fileFormat, String fileEndFormat) {
String pathend = null;
try {
// 变量服务器指定文件夹内容
Vector v = listFiles(remotePath);
if (v.size() > 0) {
System.out.println("本次处理文件个数不为零,开始下载...fileSize=" + v.size());
Iterator it = v.iterator();
while (it.hasNext()) {
LsEntry entry = (LsEntry) it.next();
String filename = entry.getFilename();
//SftpATTRS attrs = entry.getAttrs();
System.out.println("获取文件名字:------" + filename);
// System.out.println("获取文件属性:------"+attrs);
//截取最新文件的时间戳
String news = filename.substring(filename.indexOf("_") + 1,filename.indexOf("."));
if (list==null) {
list = new ArrayList();
} else {
list.add(news);
}
}
//下载到本地进行备份
System.out.println("------------开始下载文件-----------");
//拼接出远程最新文件的地址
String SERVER_PATH = SERVER_Url+ list.get(list.size() - 1) + ".txt";
sftp.get(SERVER_PATH, SERVER_LOCALPATH, new MyProgressMonitor());
//保存到本地地址
sftp.quit();
if (channel != null) {
channel.disconnect();
}
//遍历出最新文件
Collections.sort(list);
pathend = list.get(list.size() - 1);
System.out.println("遍历出最新的文件:" + pathend);
// 插入数据库
if (!list.isEmpty()) {
String DOWN_PATH = LOCAl_URL + list.get(list.size() - 1)+ ".txt";
System.out.println("输出最新的文件:" + DOWN_PATH);
readTxtFile(DOWN_PATH);
}
}
} catch (SftpException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return pathend;
}
/**
* 把本地数据保存到数据库里面
*/
public static void readTxtFile(String filePath) {
try {
BufferedReader bufferedReader = null;
Connection conn = null;
String driver = "com.mysql.jdbc.Driver";
Statement stmt = null;
try {
Class.forName(driver);
conn = DriverManager.getConnection(MYSQL_URL, MYSQL_USERNAME,MYSQL_USERPASSWORD);// 账户和密码
String encoding = "utf-8";
File file = new File(filePath);
// 判断文件是否存在
if (file.isFile() && file.exists()) {
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
bufferedReader = new BufferedReader(read);
String lineTxt = null;
int line = 0;
while ((lineTxt = bufferedReader.readLine()) != null) {
line++;
// 跳出第一行汉字
if (line == 1) {
continue;
}
String[] strs = lineTxt.split(",");
System.out.println("数组的长度:" + strs.length);
System.out.println("----------------------------开始导入数据----------------------------------");
String sql = "insert 数据表名() values()";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 0);// id
pstmt.setString(2, strs[0]);// 券码
System.out.println("券号是:" + strs[0]);
pstmt.setDouble(3, Double.parseDouble(strs[1]));// 没打折前的价格
System.out.println("没打折前的价格是:" + strs[1]);
pstmt.setString(4, " ");
pstmt.setString(5, " ");
pstmt.setString(6, strs[3]);
System.out.println("汽油:" + strs[3]);
pstmt.setDouble(7, 0.0);// amount
pstmt.setDouble(8, Double.parseDouble("0"));
System.out.println("消费:" + strs[5]);
pstmt.setInt(9, 0);// uid
pstmt.setInt(10, 0);
pstmt.setString(11, " ");
pstmt.setString(12, " ");
pstmt.setString(13, " ");
pstmt.setString(14, " ");
pstmt.setString(15, " ");
pstmt.setInt(16, 0);
pstmt.setString(17, " ");
pstmt.setInt(18, 0);
pstmt.executeUpdate();
}
read.close();
} else {
System.out.println("找不到指定的文件");
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
conn.close();
bufferedReader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
}
/**
* 通过SFTP连接服务器
*/
public void connect() {
try {
JSch jsch = new JSch();
jsch.getSession(host, username,port);
sshSession = jsch.getSession(username, host, port);
sshSession.setPassword(password);
Properties sshConfig = new Properties();
sshConfig.put("StrictHostKeyChecking", "no");
sshSession.setConfig(sshConfig);
sshSession.setTimeout(TIMOUT);
sshSession.connect();
channel = sshSession.openChannel("sftp");
channel.connect();
System.out.println("JSch版本号:" + sshSession.getClientVersion());
sftp = (ChannelSftp) channel;
} catch (Exception e) {
e.printStackTrace();
}
}
public static Vector listFiles(String directory) throws SftpException {
return sftp.ls(directory);
}
public SFTPDownload(String host, String username, String password,int timout) {
this.host = host;
this.timout=timout;
this.username = username;
this.password = password;
}
}
配置文件:
在这里写配置文件的原因是:代码更灵活 把程序打包成jar包时 在配置文件中修改所需要的信息就可以
配置文件的名称以.properties命名最为规范
在这需要注意的是:配置文件格式是已经key-value的形式存在 key字段不允许改变 只允许改变value值
还有一个坑在往数据库插入数据的时候你要检查表字段是否是mysql的关键字 以下错误就是表字段与mysql关键字重名
SFTP服务器部署本地环境:
点击详细教程
用Xshell连接远程服务器:
一. 输入:vi /etc/profile命令
二. 在命令行输入G后出现:配置环境变量文件详细信息
配置完成后用命令 java javac java-version 进行检查环境变量是否成功
注意:PATH=$PATH后面的变量是 系统全局命令的路径,不配置linux系统下的命令不能用
三.在命令输入小写i后进行编辑
四.按Ese键--------insert-------字样消失
五.在输入框内输入:x进行保存并退出
程序打包成可执行的.jar文件在这里是用eclipse进行打包的
现在运行一下打包成.jar文件