用java实现ftp问题
代码是:import java.io.DataInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileInputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import sun.net.*;
import sun.net.ftp.FtpClient;
/**
* connectServer
* 连接ftp服务器
* @throws java.io.IOException
* @param path 文件夹,空代表根目录
* @param password 密码
* @param user 登陆用户
* @param server 服务器地址
*/
public void connectServer(String server, String user, String password, String path)
throws IOException
{
// server:FTP服务器的IP地址;user:登录FTP服务器的用户名
// password:登录FTP服务器的用户名的口令;path:FTP服务器上的路径
ftpClient = new FtpClient();
ftpClient.openServer(server);
ftpClient.login(user, password);
//path是ftp服务下主目录的子目录
if (path.length() != 0) ftpClient.cd(path);
//用2进制上传、下载
ftpClient.binary();
}
/**
* upload
* 上传文件
* @throws java.lang.Exception
* @return -1 文件不存在
* -2 文件内容为空
* >0 成功上传,返回文件的大小
* @param newname 上传后的新文件名
* @param filename 上传的文件
*/
public long upload(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;
if (file_in.length()==0) return -2;
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;
}
/**
* upload
* @throws java.lang.Exception
* @return
* @param filename
*/
public long upload(String filename)
throws Exception
{
String newname = "";
if (filename.indexOf("/")>-1)
{
newname = filename.substring(filename.lastIndexOf("/")+1);
}else
{
newname = filename;
}
return upload(filename,newname);
}
/**
* download
* 从ftp下载文件到本地
* @throws java.lang.Exception
* @return
* @param newfilename 本地生成的文件名
* @param filename 服务器上的文件名
*/
public long download(String filename,String newfilename)
throws Exception
{
long result = 0;
TelnetInputStream is = null;
FileOutputStream os = null;
try
{
is = ftpClient.get(filename);
java.io.File outfile = new java.io.File(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 {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
return result;
}
/**
* 取得某个目录下的所有文件列表
*
*/
public List getFileList(String path)
{
List list = new ArrayList();
try
{
DataInputStream dis = new DataInputStream(ftpClient.nameList(path));
String filename = "";
while((filename=dis.readLine())!=null)
{
list.add(filename);
}
} catch (Exception e)
{
e.printStackTrace();
}
return list;
}
/**
* closeServer
* 断开与ftp服务器的链接
* @throws java.io.IOException
*/
public void closeServer()
throws IOException
{
try
{
if (ftpClient != null)
{
ftpClient.closeServer();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String [] args) throws Exception
{
FtpUtil ftp = new FtpUtil();
try {
//连接ftp服务器
ftp.connectServer("10.163.7.15", "cxl", "1", "info2");
/** 上传文件到 info2 文件夹下 */
System.out.println("filesize:"+ftp.upload("f:/download/Install.exe")+"字节");
/** 取得info2文件夹下的所有文件列表,并下载到 E盘下 */
List list = ftp.getFileList(".");
for (int i=0;i<list.size();i++)
{
String filename = (String)list.get(i);
System.out.println(filename);
ftp.download(filename,"E:/"+filename);
}
} catch (Exception e) {
///
}finally
{
ftp.closeServer();
}
}
}
结果却是:需要为 class、interface 或 enum
请问是什么原因? --------------------编程问答-------------------- --------------------编程问答-------------------- 代码好像 不完整,不知道怎么看。
--------------------编程问答-------------------- --------------------编程问答-------------------- 看到了sun --------------------编程问答-------------------- 你的类少了头,class FtpUtil
--------------------编程问答-------------------- 对JAVA的两个FTP包进行比较分析
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;
import sun.net.ftp.FtpClient;
class FtpUtil{
FtpClient ftpClient;
/**
* connectServer
* 连接ftp服务器
* @throws java.io.IOException
* @param path 文件夹,空代表根目录
* @param password 密码
* @param user 登陆用户
* @param server 服务器地址
*/
public void connectServer(String server, String user, String password, String path)
throws IOException
{
// server:FTP服务器的IP地址;user:登录FTP服务器的用户名
// password:登录FTP服务器的用户名的口令;path:FTP服务器上的路径
ftpClient = new FtpClient();
ftpClient.openServer(server);
ftpClient.login(user, password);
//path是ftp服务下主目录的子目录
if (path.length() != 0) ftpClient.cd(path);
//用2进制上传、下载
ftpClient.binary();
}
/**
* upload
* 上传文件
* @throws java.lang.Exception
* @return -1 文件不存在
* -2 文件内容为空
* >0 成功上传,返回文件的大小
* @param newname 上传后的新文件名
* @param filename 上传的文件
*/
public long upload(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;
if (file_in.length()==0) return -2;
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;
}
/**
* upload
* @throws java.lang.Exception
* @return
* @param filename
*/
public long upload(String filename)
throws Exception
{
String newname = "";
if (filename.indexOf("/")>-1)
{
newname = filename.substring(filename.lastIndexOf("/")+1);
}else
{
newname = filename;
}
return upload(filename,newname);
}
/**
* download
* 从ftp下载文件到本地
* @throws java.lang.Exception
* @return
* @param newfilename 本地生成的文件名
* @param filename 服务器上的文件名
*/
public long download(String filename,String newfilename)
throws Exception
{
long result = 0;
TelnetInputStream is = null;
FileOutputStream os = null;
try
{
is = ftpClient.get(filename);
java.io.File outfile = new java.io.File(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 {
if (is != null) {
is.close();
}
if (os != null) {
os.close();
}
}
return result;
}
/**
* 取得某个目录下的所有文件列表
*
*/
public List getFileList(String path)
{
List list = new ArrayList();
try
{
DataInputStream dis = new DataInputStream(ftpClient.nameList(path));
String filename = "";
while((filename=dis.readLine())!=null)
{
list.add(filename);
}
} catch (Exception e)
{
e.printStackTrace();
}
return list;
}
/**
* closeServer
* 断开与ftp服务器的链接
* @throws java.io.IOException
*/
public void closeServer()
throws IOException
{
try
{
if (ftpClient != null)
{
ftpClient.closeServer();
}
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String [] args) throws Exception
{
FtpUtil ftp = new FtpUtil();
try {
//连接ftp服务器
ftp.connectServer("10.163.7.15", "cxl", "1", "info2");
/** 上传文件到 info2 文件夹下 */
System.out.println("filesize:"+ftp.upload("f:/download/Install.exe")+"字节");
/** 取得info2文件夹下的所有文件列表,并下载到 E盘下 */
List list = ftp.getFileList(".");
for (int i=0;i<list.size();i++)
{
String filename = (String)list.get(i);
System.out.println(filename);
ftp.download(filename,"E:/"+filename);
}
} catch (Exception e) {
///
}finally
{
ftp.closeServer();
}
}
}
作者:佚名出处:IT专家网2009-09-16 13:00本文对JAVA的两个FTP包进行比较 。
1、sun.net.ftp.*;
这是一个不被官方支持的,但是放在JDK下面的FTP包。正因为不被支
持,所以没有官方提供API,这是其最大的缺陷之一。最重要由于不是官方支持的,
所以文档也是没有的
http://swig.stanford.edu/pub/java/javadoc/overview-summary.html
这里有该包的API。
先给一个简单的例子:(例子来源互联网)
1)显示FTP服务器上的文件
void ftpList_actionPerformed(ActionEvent e) {
String server=serverEdit.getText();//输入的FTP服务器的IP地址
String user=userEdit.getText(); file://登/录FTP服务器的用户名
String password=passwordEdit.getText();//登录FTP服务器的用户名的口令
String path=pathEdit.getText();//FTP服务器上的路径
try {
FtpClient ftpClient=new FtpClient();//创建FtpClient对象
ftpClient.openServer(server);//连接FTP服务器
ftpClient.login(user, password);//登录FTP服务器
if (path.length()!=0) ftpClient.cd(path);
TelnetInputStream is=ftpClient.list();
int c;
while ((c=is.read())!=-1) {
System.out.print((char) c);}
is.close();
ftpClient.closeServer();//退出FTP服务器
} catch (IOException ex) {;}
}
2)从FTP服务器上下传一个文件
void getButton_actionPerformed(ActionEvent e) {
String server=serverEdit.getText();
String user=userEdit.getText();
String password=passwordEdit.getText();
String path=pathEdit.getText();
String filename=filenameEdit.getText();
try {
FtpClient ftpClient=new FtpClient();
ftpClient.openServer(server);
ftpClient.login(user, password);
if (path.length()!=0) ftpClient.cd(path);
ftpClient.binary();
TelnetInputStream is=ftpClient.get(filename);
File file_out=new File(filename);
FileOutputStream os=new
FileOutputStream(file_out);
byte[] bytes=new byte[1024];
int c;
while ((c=is.read(bytes))!=-1) {
os.write(bytes,0,c);
}
is.close();
os.close();
ftpClient.closeServer();
} catch (IOException ex) {;}
}
3)向FTP服务器上上传一个文件
void putButton_actionPerformed(ActionEvent e) {
String server=serverEdit.getText();
String user=userEdit.getText();
String password=passwordEdit.getText();
String path=pathEdit.getText();
String filename=filenameEdit.getText();
try {
FtpClient ftpClient=new FtpClient();
ftpClient.openServer(server);
ftpClient.login(user, password);
if (path.length()!=0) ftpClient.cd(path);
ftpClient.binary();
TelnetOutputStream os=ftpClient.put(filename);
File file_in=new File(filename);
FileInputStream is=new FileInputStream(file_in);
byte[] bytes=new byte[1024];
int c;
while ((c=is.read(bytes))!=-1){
os.write(bytes,0,c);}
is.close();
os.close();
ftpClient.closeServer();
} catch (IOException ex) {;}
}
}
看了这个例子,应该就能用他写东西了。
这个包缺点很多,首先就是不被支持也不被官方推荐使用
其次是这个包功能过于简单,简单到无法区分FTP服务器上的File是文件还是目录,有人说
通过返回的字符串来判断,但是据说FTP在不同系统下返回的东西不大一样,所以如果通过
判断字符串会有不好移植的问题。
自己想出了一个办法,通过FtpClient中的cd方法来判断
,代码如下:
try{
ftp.cd(file);//file为当前判断的文件
//如果过了说明file是目录
}
catch(IOException e){
//说明file是文件
}
finally{
ftp.cd("..");//返回上级目录继续判断下一文件
}
我用这种方法做过尝试,结果是只能判断正确一部分,有些目录仍会被认做文件,不知道
是我的方法有错还是别的什么原因。
如果对FTP服务没有过高的要求,使用这个包还是不错的,因为他本身就包含在JDK中,不
存在CLASSPATH的问题,不需要导入外部包,较为方便。
2、org.apache.commons.net.ftp.*;
这个包在Jakarta Commons Net library里,现在的最高版本是1.4.1,可以从以下地址
下载
http://mirror.vmmatrix.net/apache/jakarta/commons/net/binaries/commons-net-1.4
.1.zip
里面包含了打包好的jar,API,及全部的class文件
http://mirror.vmmatrix.net/apache/jakarta/commons/net/source/commons-net-1.4.1
-src.zip
这里包含一些例子以及全部的代码
给出一个该包的例子:
...
import org.apache.commons.net.ftp.*;
...
public static void getDataFiles( String server,
String username,
String password,
String folder,
String destinationFolder,
Calendar start,
Calendar end )
{
try
{
// Connect and logon to FTP Server
FTPClient ftp = new FTPClient();
ftp.connect( server );
ftp.login( username, password );
System.out.println("Connected to " +
server + ".");
System.out.print(ftp.getReplyString());
// List the files in the directory
ftp.changeWorkingDirectory( folder );
FTPFile[] files = ftp.listFiles();
System.out.println( "Number of files in dir: " + files.length );
DateFormat df = DateFormat.getDateInstance( DateFormat.SHORT );
for( int i=0; i
{
Date fileDate = files[ i ].getTimestamp().getTime();
if( fileDate.compareTo( start.getTime() ) >= 0 &&
fileDate.compareTo( end.getTime() ) <= 0 )
{
// Download a file from the FTP Server
System.out.print( df.format( files[ i ].getTimestamp().getTime() ) );
System.out.println( "\t" + files[ i ].getName() );
File file = new File( destinationFolder +
File.separator + files[ i ].getName() );
FileOutputStream fos = new FileOutputStream( file );
ftp.retrieveFile( files[ i ].getName(), fos );
fos.close();
file.setLastModified( fileDate.getTime() );
}
}
// Logout from the FTP Server and disconnect
ftp.logout();
ftp.disconnect();
}
catch( Exception e )
{
e.printStackTrace();
}
}
同sun.net.ftp相同,都是先建立FtpClient(注意两包的大小写不同)的实例,然后通过
connect()方法连接,login()方法登陆,但是org.apache.commons.net.ftp.*明显比sun.
net.ftp功能强大很多。
org.apache.commons.net.ftp.*包将FTP中的file单独出来成为了一个新类FTPFile,还有
类FTPFileEntryParser、parse,没有仔细研究,但是从字面来看应该是转化为某种形势的
类,有待研究
同时这个commons-net-1.4.1.jar包中也提供了FTP服务器,telnet,mail等一系列类库。
org.apache.commons.net.ftp.*包的缺点在于需要设置classpath,并且需要下载jakarta
-oro-2.0.8.jar这个包才能运行(如果没有这个包,会在ftp.listFiles()方法后抛出找不
到class异常),此包无须在代码中import,只需设置在classpath中即可。下载地址:
http://mirror.vmmatrix.net/apache/jakarta/oro/source/jakarta-oro-2.0.8.zip
如果想要强大的FTP服务,那么org.apache.commons.net.ftp.*包应该是你的最好选择,而
且也是开源,免费的。
这个包的问题是:
使用Jakarta Commons Net library需要在环境变量里面编辑classpath.
这是不方便的地方。
另外IBM也有提供一个ftp包。大家有兴趣可以搜索一下。 --------------------编程问答-------------------- --------------------编程问答-------------------- 谢谢6楼,我已经解决了java在实现ftp连接服务器的功能,但现在还是没有办法做到实现ftp的上传和删除功能,不知道有没有哪位大侠能帮忙解决疑惑?
我会追加积分的,谢谢了! --------------------编程问答-------------------- 考代码之前要看看需要的包
补充:Java , Java SE