JavaのFTP用ライブラリであるApache CommonsのFTPClientの使い方サンプル。

GET/PUTの方法と、LISTによって得られる情報の活用方法をメソッド化している。
注意点は、パフォーマンス向上のためbuffer sizeを変更した方が良いということ。

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import jp.co.nttcom.coms.util.DateUtil;

import org.apache.commons.lang3.exception.ExceptionUtils;
import org.apache.commons.net.ftp.FTP;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;
import org.apache.commons.net.ftp.FTPReply;
import org.apache.log4j.Logger;

public class FTPUtil {
    /** FTPクライアント */
    private FTPClient client = new FTPClient();
    /**
     * @param client FTPクライアント
     */
    public void setClient(FTPClient client) {
        this.client = client;
    }

    /**
     * ロガー
     */
    private static Logger logger = Logger.getLogger(FTPUtil.class);

    /**
     * FTPサーバに接続する
     * @param hostname ホストネーム
     * @param user FTPサーバユーザー名
     * @param pass FTPサーバパスワード
     * @param enc  FTPサーバエンコード用文字コード
     * @return true:成功
     */
    public boolean connect(String hostname, String user, String pass, String enc) {
        try {
            // encoding設定
            // connectメソッドの前に呼び出さなければならない
            client.setControlEncoding(enc);
            // FTPサーバーへ接続
            client.connect(hostname);
            // 正常に接続できたかを判定する
            if (!FTPReply.isPositiveCompletion(client.getReplyCode())) {
                throw new IOException("Ftp not Connected ReplyCode="
                        + client.getReplyCode());
            }
            // ログイン処理
            if (!client.login(user, pass)) {
                throw new IOException("login failed");
            }
            // PASVモードに設定
            client.enterLocalPassiveMode();
            // バイナリ方式に変更
            client.setFileType(FTP.BINARY_FILE_TYPE);
            return true;
        } catch (IOException e) {
            logger.info(ExceptionUtils.getStackTrace(e));
            return false;
        }
    }

    /**
     * FTPサーバからログアウトする
     * @return true:成功
     */
    public boolean close() {
        try {
            if (client != null && client.isConnected()) {
                // FTPサーバーからログアウト
                client.logout();
                // FTPサーバーから切断
                client.disconnect();
            }
            return true;
        } catch (IOException e) {
            logger.info(ExceptionUtils.getStackTrace(e));
            return false;
        }
    }

    /**
     * FTPサーバからファイルを取得する
     * @param srcDirName FTPのディレクトリ名
     * @param srcFileName FTPのファイル名
     * @param destDirName 保存先ディレクトリ名
     * @param destFileName 保存先ファイル名
     * @return 成否
     */
    public boolean get(String srcDirName, String srcFileName, String destDirName, String destFileName) {
        boolean result;

        // ファイルを指定
        File dest = new File(destDirName + "/" + destFileName);

        try (FileOutputStream out = new FileOutputStream(dest)) {
            // ファイルを取得
            String srcFullPath = srcDirName + "/" + srcFileName;
            // バッファサイズを1MBに
            client.setBufferSize(1024 * 1024);
            result = client.retrieveFile(srcFullPath, out);
            if (!result) {
                return false;
            }

            // タイムスタンプを維持
            String mTime = client.getModificationTime(srcFullPath);
            long epocMTime = DateUtil.convStrToDate(mTime.substring(4, 18), "yyyyMMddHHmmss").getTime();
            dest.setLastModified(epocMTime);
        } catch (IOException e) {
            return false;
        }

        return result;
    }

    /**
     * FTPサーバにファイルを保存する
     * @param srcDirName ディレクトリ名
     * @param srcFileName ファイル名
     * @param destDirName FTPの保存先ディレクトリ名
     * @param destFileName FTPの保存先ファイル名
     * @return 成否
     */
    public boolean put(String srcDirName, String srcFileName, String destDirName, String destFileName) {
        boolean result;

        // ファイルを指定
        File source = new File(srcDirName + "/" + srcFileName);

        try (FileInputStream in = new FileInputStream(source)) {
            // ファイルを送信
            result = client.storeFile(destDirName + "/" + destFileName, in);
        } catch (IOException e) {
            return false;
        }

        return result;
    }

    /**
     * ファイルの存在確認
     * @param srcDirName ディレクトリ名
     * @param srcFileName ファイル名
     * @return true: 存在する
     */
    public boolean exists(String srcDirName, String srcFileName) {
        // ファイルを指定
        try {
            FTPFile[] files = client.listFiles(srcDirName + "/" + srcFileName);
            return files.length != 0;
        } catch (IOException e) {
            return false;
        }
    }

    /**
     * FTPサーバのファイルサイズを取得する
     * 返り値は「byte」単位
     * @param srcDirName ディレクトリ名
     * @param srcFileName ファイル名
     * @return fileSize ファイルサイズ
     */
    public long getFileSize(String srcDirName, String srcFileName) {
        try {
            String fullPath = srcDirName + "/" + srcFileName;
            // ファイルを指定
            FTPFile[] files = client.listFiles(fullPath);
            if (files.length == 0) {
                throw new IOException("no such file : " + fullPath);
            }
            return files[0].getSize();
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}