往FTP上上传跟下载txt文件。首先要封装一些上传跟下载的方法,然后通过主方法的调用封装的方法,传递相应的参数。
1:封装上传下载类代码如下:
package com.zhao.hangzhou;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.StringTokenizer;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
/**
* ftp上传,下载
* @author QQ372561939 2012-11-12
*
*/
public class FtpUtil {
private String ip = "";
private String username = "";
private String password = "";
private int port = -1;
private String path = "";
FtpClient ftpClient = null;
OutputStream os = null;
FileInputStream is = null;
public FtpUtil(String serverIP, String username, String password) {
this.ip = serverIP;
this.username = username;
this.password = password;
}
public FtpUtil(String serverIP, int port, String username, String password) {
this.ip = serverIP;
this.username = username;
this.password = password;
this.port = port;
}
/**
* 连接ftp服务器
*
* @throws IOException
*/
public boolean connectServer(){
ftpClient = new FtpClient();
try {
if(this.port != -1){
ftpClient.openServer(this.ip,this.port);
}else{
ftpClient.openServer(this.ip);
}
ftpClient.login(this.username, this.password);
if (this.path.length() != 0){
ftpClient.cd(this.path);// path是ftp服务下主目录的子目录
}
ftpClient.binary();// 用2进制上传、下载
System.out.println("已登录到\"" + ftpClient.pwd() + "\"目录");
return true;
}catch (IOException e){
e.printStackTrace();
return false;
}
}
/**
* 断开与ftp服务器连接
*
* @throws IOException
*/
public boolean closeServer(){
try{
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
if (ftpClient != null) {
ftpClient.closeServer();
}
System.out.println("已从服务器断开");
return true;
}catch(IOException e){
e.printStackTrace();
return false;
}
}
/**
* 检查文件夹在当前目录下是否存在
* @param dir
* @return
*/
private boolean isDirExist(String dir){
String pwd = "";
try {
pwd = ftpClient.pwd();
ftpClient.cd(dir);
ftpClient.cd(pwd);
}catch(Exception e){
return false;
}
return true;
}
/**
* 在当前目录下创建文件夹
* @param dir
* @return
* @throws Exception
*/
private boolean createDir(String dir){
try{
ftpClient.ascii();
StringTokenizer s = new StringTokenizer(dir, "/"); //sign
s.countTokens();
String pathName = ftpClient.pwd();
while(s.hasMoreElements()){
pathName = pathName + "/" + (String) s.nextElement();
try {
ftpClient.sendServer("MKD " + pathName + "\r\n");
} catch (Exception e) {
e = null;
return false;
}
ftpClient.readServerResponse();
}
ftpClient.binary();
return true;
}catch (IOException e1){
e1.printStackTrace();
return false;
}
}
/**
* ftp上传
* 如果服务器段已存在名为filename的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
*
* @param filename 要上传的文件(或文件夹)名
* @return
* @throws Exception
*/
public boolean upload(String filename){
//newname获取整个目录
String newname = "";
//dir创建当前目录
String dir = "";
//新的文件名称
String newname1="";
if(filename.indexOf("/") > -1){
newname = filename.substring(filename.lastIndexOf(":")+1);
dir = newname.substring(newname.lastIndexOf(0)+2, newname.lastIndexOf("/"));
}else{
newname = filename;
}
System.out.println(newname);
System.out.println(dir);
//创建一个目录
createDir(dir);
return upload(filename, newname);
}
/**
* ftp上传
* 如果服务器段已存在名为newName的文件夹,该文件夹中与要上传的文件夹中同名的文件将被替换
*
* @param fileName 要上传的文件(或文件夹)名
* @param newName 服务器段要生成的文件(或文件夹)名
* @return
*/
public boolean upload(String fileName, String newName){
try{
String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK");
File file_in = new File(savefilename);//打开本地待长传的文件
System.out.println(file_in.getPath());
if(!file_in.exists()){
throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");
}
if(file_in.isDirectory()){
upload(file_in.getPath(),newName,ftpClient.pwd());
}else{
uploadFile(file_in.getPath(),newName);
}
if(is != null){
is.close();
}
if(os != null){
os.close();
}
return true;
}catch(Exception e){
e.printStackTrace();
System.err.println("Exception e in Ftp upload(): " + e.toString());
return false;
}finally{
try{
if(is != null){
is.close();
}
if(os != null){
os.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}
/**
* 真正用于上传的方法
* @param fileName
* @param newName
* @param path
* @throws Exception
*/
private void upload(String fileName, String newName,String path) throws Exception{
String savefilename = new String(fileName.getBytes("ISO-8859-1"), "GBK");
File file_in = new File(savefilename);//打开本地待长传的文件
if(!file_in.exists()){
throw new Exception("此文件或文件夹[" + file_in.getName() + "]有误或不存在!");
}
if(file_in.isDirectory()){
if(!isDirExist(newName)){
createDir(newName);
}
ftpClient.cd(newName);
File sourceFile[] = file_in.listFiles();
for(int i = 0; i < sourceFile.length; i++){
if(!sourceFile[i].exists()){
continue;
}
if(sourceFile[i].isDirectory()){
this.upload(sourceFile[i].getPath(),sourceFile[i].getName(),path+"/"+newName);
}else{
this.uploadFile(sourceFile[i].getPath(),sourceFile[i].getName());
}
}
}else{
uploadFile(file_in.getPath(),newName);
}
ftpClient.cd(path);
}
/**
* upload 上传文件
*
* @param filename 要上传的文件名
* @param newname 上传后的新文件名
* @return -1 文件不存在 >=0 成功上传,返回文件的大小
* @throws Exception
*/
public long uploadFile(String filename, String newname) throws Exception{
long result = 0;
TelnetOutputStream os = null;
FileInputStream is = null;
try {
java.io.File file_in = new java.io.File(filename);
if(!file_in.exists())
return -1;
os = ftpClient.put(newname);
result = file_in.length();
is = new FileInputStream(file_in);
byte[] bytes = new byte[1024];
int c;
while((c = is.read(bytes)) != -1){
os.write(bytes, 0, c);
}
}finally{
if(is != null){
is.close();
}
if(os != null){
os.close();
}
}
return result;
}
/**
* 从ftp下载文件到本地
*
* @param filename 服务器上的文件名
* @param newfilename 本地生成的文件名
* @return
* @throws Exception
*/
public long downloadFile(String filename, String newfilename){
long result = 0;
TelnetInputStream is = null;
FileOutputStream os = null;
try{
is = ftpClient.get(filename);
System.out.println("filename:"+filename);
String filename1 = filename.substring(filename.lastIndexOf("/")+1);
System.out.println(filename1);
newfilename = newfilename+filename1;
System.out.println(newfilename);
java.io.File outfile = new java.io.File(newfilename);
System.out.println("newfilename:"+newfilename);
os = new FileOutputStream(outfile);
byte[] bytes = new byte[1024];
int c;
while ((c = is.read(bytes)) != -1) {
os.write(bytes, 0, c);
result = result + c;
}
}catch (IOException e){
e.printStackTrace();
}finally{
try {
if(is != null){
is.close();
}
if(os != null){
os.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* 取得相对于当前连接目录的某个目录下所有文件列表
*
* @param path
* @return
*/
public List getFileList(String path){
List list = new ArrayList();
DataInputStream dis;
try {
dis = new DataInputStream(ftpClient.nameList(this.path + path));
String filename = "";
while((filename = dis.readLine()) != null){
list.add(filename);
}
} catch (IOException e) {
e.printStackTrace();
}
return list;
}
public void delete(String filename){
String cmd = "DELE "+filename+"\r\n";
ftpClient.sendServer(cmd);
try {
int f=ftpClient.readServerResponse();
System.out.println(f);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
// /**
// FTP远程命令列表
// USER PORT RETR ALLO DELE SITE XMKD CDUP FEAT
// PASS PASV STOR REST CWD STAT RMD XCUP OPTS
// ACCT TYPE APPE RNFR XCWD HELP XRMD STOU AUTH
// REIN STRU SMNT RNTO LIST NOOP PWD SIZE PBSZ
// QUIT MODE SYST ABOR NLST MKD XPWD MDTM PROT
// 在服务器上执行命令,如果用sendServer来执行远程命令(不能执行本地FTP命令)的话,所有FTP命令都要加上\r\n
// ftpclient.sendServer("XMKD /test/bb\r\n"); //执行服务器上的FTP命令
// ftpclient.readServerResponse一定要在sendServer后调用
// nameList("/test")获取指目录下的文件列表
// XMKD建立目录,当目录存在的情况下再次创建目录时报错
// XRMD删除目录
// DELE删除文件
// */
// }
}
注意:在eclipse中import sun.net.ftp.FtpClient;时候会报错,原因是sun.net包里面的内容默认情况下是不让用的。解决办法是自定义access rules ,工程上右键->工程属性->java builder path->Libraries标签,点击JRE System Library里面的Access rules,add sun/** 为accessible,如果该项存在,就edit。
2:主方法,对封装类的调用。
package com.zhao.hangzhou.main;
import java.util.List;
import com.zhao.hangzhou.FtpUtil;
public class Test {
/**
* @param args
*/
public static void main(String[] args) {
/**
* 创建一个ftp对象,并通过调用相应构造方法传递相应的参数
*/
FtpUtil ftp = new FtpUtil("86.5.71.249","用户名","密码");
/**
* 连接服务
*/
ftp.connectServer();
//*********下载start
// long result;
// /**
// * 调用封装类里面的downloadFile方法,从服务器上下载文件到本地
// */
// result = ftp.downloadFile("sss/DSDZMX20121113143117.txt", "F://ftp/");
//*******下载end
//**********上传start
/**
* 通过调用封装类里面的getFileList方法,
* 取得相对于当前连接目录的某个目录下所有文件列表 给list
*/
List list = ftp.getFileList("sss");
for(int i=0;i<list.size();i++){
String name = list.get(i).toString();
name="sss/"+name;
System.out.println(name);
//调用delelte方法,清空当前连接目录的某个目录下所有文件列表
ftp.delete(name);
}
boolean result;
try {
//通过调用封装类里面的upload方法,把本地上的a.txt文件上传到连接目录下的
//sss文件夹下面,命名为b.txt
result = ftp.upload("F://ftp/a.txt", "sss/b.txt");
System.out.println(result);
// if(result?"":""){
// System.out.println("上传成功!");
// }
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
/**
* 关闭服务,断开连接
*/
ftp.closeServer();
}
//*******上传end
}
以上功能基本就完成了,本地对ftp服务器上的上传跟下载功能。