📄 ftpclient.java
字号:
/**
*
* edtFTPj
*
* Copyright (C) 2000-2003 Enterprise Distributed Technologies Ltd
*
* www.enterprisedt.com
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Bug fixes, suggestions and comments should be sent to bruce@enterprisedt.com
*
* Change Log:
*
* $Log: FTPClient.java,v $
* Revision 1.30 2004/10/18 15:54:48 bruceb
* clearSOCKS added, set encoding for control sock, locale for parser
*
* Revision 1.29 2004/09/21 21:28:28 bruceb
* fixed javadoc comment
*
* Revision 1.28 2004/09/18 14:27:57 bruceb
* features() throw exception if not supported
*
* Revision 1.27 2004/09/18 09:33:47 bruceb
* 1.1.8 tweaks
*
* Revision 1.26 2004/09/17 14:12:38 bruceb
* fixed javadoc re filemasks
*
* Revision 1.25 2004/09/14 06:24:03 bruceb
* fixed javadoc comment
*
* Revision 1.24 2004/08/31 13:48:29 bruceb
* resume,features,restructure
*
* Revision 1.23 2004/07/23 08:34:32 bruceb
* strict replies or not, better tfr monitor reporting
*
* Revision 1.22 2004/06/25 11:47:46 bruceb
* made 1.1.x compatible
*
* Revision 1.21 2004/06/11 10:20:35 bruceb
* permit 200 to be returned from various cmds
*
* Revision 1.20 2004/05/22 16:52:57 bruceb
* message listener
*
* Revision 1.19 2004/05/15 22:37:22 bruceb
* put debugResponses back in
*
* Revision 1.18 2004/05/13 23:00:34 hans
* changed comment
*
* Revision 1.17 2004/05/08 21:14:41 bruceb
* checkConnection stuff
*
* Revision 1.14 2004/04/19 21:54:06 bruceb
* final tweaks to dirDetails() re caching
*
* Revision 1.13 2004/04/18 11:16:44 bruceb
* made validateTransfer() public
*
* Revision 1.12 2004/04/17 18:37:38 bruceb
* new parse functionality
*
* Revision 1.11 2004/03/23 20:26:49 bruceb
* tweak to size(), catch exceptions on puts()
*
* Revision 1.10 2003/11/15 11:23:55 bruceb
* changes required for ssl subclasses
*
* Revision 1.6 2003/05/31 14:53:44 bruceb
* 1.2.2 changes
*
* Revision 1.5 2003/01/29 22:46:08 bruceb
* minor changes
*
* Revision 1.4 2002/11/19 22:01:25 bruceb
* changes for 1.2
*
* Revision 1.3 2001/10/09 20:53:46 bruceb
* Active mode changes
*
* Revision 1.1 2001/10/05 14:42:03 bruceb
* moved from old project
*
*/
package com.enterprisedt.net.ftp;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.LineNumberReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.InetAddress;
import java.text.ParseException;
import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
import java.util.Properties;
import java.util.TimeZone;
import java.util.Vector;
import com.enterprisedt.util.debug.Level;
import com.enterprisedt.util.debug.Logger;
/**
* Supports client-side FTP. Most common
* FTP operations are present in this class.
*
* @author Bruce Blackshaw
* @version $Revision: 1.30 $
*/
public class FTPClient {
/**
* Revision control id
*/
public static String cvsId = "@(#)$Id: FTPClient.java,v 1.30 2004/10/18 15:54:48 bruceb Exp $";
/**
* Default byte interval for transfer monitor
*/
final private static int DEFAULT_MONITOR_INTERVAL = 4096;
/**
* Default transfer buffer size
*/
final private static int DEFAULT_BUFFER_SIZE = 4096;
/**
* Default encoding used for control data
*/
final private static String DEFAULT_ENCODING = "US-ASCII";
/**
* SOCKS port property name
*/
final private static String SOCKS_PORT = "socksProxyPort";
/**
* SOCKS host property name
*/
final private static String SOCKS_HOST = "socksProxyHost";
/**
* Major version (substituted by ant)
*/
private static String majorVersion = "@major_ver@";
/**
* Middle version (substituted by ant)
*/
private static String middleVersion = "@middle_ver@";
/**
* Middle version (substituted by ant)
*/
private static String minorVersion = "@minor_ver@";
/**
* Full version
*/
private static int[] version;
/**
* Timestamp of build
*/
private static String buildTimestamp = "@date_time@";
/**
* Work out the version array
*/
static {
try {
version = new int[3];
version[0] = Integer.parseInt(majorVersion);
version[1] = Integer.parseInt(middleVersion);
version[2] = Integer.parseInt(minorVersion);
}
catch (NumberFormatException ex) {
System.err.println("Failed to calculate version: " + ex.getMessage());
}
}
/**
* Format to interpret MTDM timestamp
*/
private SimpleDateFormat tsFormat =
new SimpleDateFormat("yyyyMMddHHmmss");
/**
* Logging object
*/
private Logger log = Logger.getLogger(FTPClient.class);
/**
* Socket responsible for controlling
* the connection
*/
protected FTPControlSocket control = null;
/**
* Socket responsible for transferring
* the data
*/
protected FTPDataSocket data = null;
/**
* Socket timeout for both data and control. In
* milliseconds
*/
private int timeout = 0;
/**
* Use strict return codes if true
*/
private boolean strictReturnCodes = true;
/**
* Can be used to cancel a transfer
*/
private boolean cancelTransfer = false;
/**
* If true, a file transfer is being resumed
*/
private boolean resume = false;
/**
* Resume byte marker point
*/
private long resumeMarker = 0;
/**
* Bytes transferred in between monitor callbacks
*/
private long monitorInterval = DEFAULT_MONITOR_INTERVAL;
/**
* Size of transfer buffers
*/
private int transferBufferSize = DEFAULT_BUFFER_SIZE;
/**
* Parses LIST output
*/
private FTPFileFactory fileFactory = null;
/**
* Locale for date parsing
*/
private Locale listingLocale = Locale.getDefault();
/**
* Progress monitor
*/
private FTPProgressMonitor monitor = null;
/**
* Message listener
*/
protected FTPMessageListener messageListener = null;
/**
* Record of the transfer type - make the default ASCII
*/
private FTPTransferType transferType = FTPTransferType.ASCII;
/**
* Record of the connect mode - make the default PASV (as this was
* the original mode supported)
*/
private FTPConnectMode connectMode = FTPConnectMode.PASV;
/**
* Holds the last valid reply from the server on the control socket
*/
protected FTPReply lastValidReply;
/**
* Instance initializer. Sets formatter to GMT.
*/
{
tsFormat.setTimeZone(TimeZone.getTimeZone("GMT"));
}
/**
* Get the version of edtFTPj
*
* @return int array of {major,middle,minor} version numbers
*/
public static int[] getVersion() {
return version;
}
/**
* Get the build timestamp
*
* @return d-MMM-yyyy HH:mm:ss z build timestamp
*/
public static String getBuildTimestamp() {
return buildTimestamp;
}
/**
* Constructor. Creates the control
* socket
*
* @param remoteHost the remote hostname
*/
public FTPClient(String remoteHost)
throws IOException, FTPException {
this(remoteHost, FTPControlSocket.CONTROL_PORT, 0);
}
/**
* Constructor. Creates the control
* socket
*
* @param remoteHost the remote hostname
* @param controlPort port for control stream (-1 for default port)
*/
public FTPClient(String remoteHost, int controlPort)
throws IOException, FTPException {
this(remoteHost, controlPort, 0);
}
/**
* Constructor. Creates the control
* socket
*
* @param remoteHost the remote hostname
* @param controlPort port for control stream (use -1 for the default port)
* @param timeout the length of the timeout, in milliseconds
* (pass in 0 for no timeout)
*/
public FTPClient(String remoteHost, int controlPort, int timeout)
throws IOException, FTPException {
this(InetAddress.getByName(remoteHost), controlPort, timeout);
}
/**
* Constructor. Creates the control
* socket
*
* @param remoteHost the remote hostname
* @param controlPort port for control stream (use -1 for the default port)
* @param timeout the length of the timeout, in milliseconds
* (pass in 0 for no timeout)
* @param encoding character encoding used for data
*/
public FTPClient(String remoteHost, int controlPort, int timeout, String encoding)
throws IOException, FTPException {
this(InetAddress.getByName(remoteHost), controlPort, timeout, encoding);
}
/**
* Constructor. Creates the control
* socket
*
* @param remoteAddr the address of the
* remote host
*/
public FTPClient(InetAddress remoteAddr)
throws IOException, FTPException {
this(remoteAddr, FTPControlSocket.CONTROL_PORT, 0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -