この記事は、参照用にJava FTPファイルをアップロードおよびダウンロードする2つの方法を共有しています。特定のコンテンツは次のとおりです
最初の方法:
パッケージcom.cloudpower.util; Import java.io.file; import java.io.fileinputStream; Import java.io.fileoutputStream; Import java.io.ioexception; Import sun.net.telnetinputStream; Import sun.net.net.telnettream; import intp.tp.tp.tp.tp.tp.tp.tp.tp.tp.tp.tp.tpcliient; ftp* @title:ftp.java* @author:Zhou Lingbin*/public class ftp {/***ローカルファイル名*/private string localfilename; / ***リモートファイル名*/プライベート文字列remoteFileName; / *** ftp client*/ private ftpclient ftpclient; /***server Connection*@param ip server ip*@paramポートサーバーポート*@paramユーザー名*@paramパスワード*@paramパスサーバーパス*@author zhou lingbin*@date lingbin*/public void connectserver(String IP、int Port、Stringユーザー、文字列パスワード、文字列パス)方法// ftpclient = new ftpclient(); // ftpclient.openserver(ip、port); // 2番目の方法ftpclient = new ftpclient(ip); ftpclient.login(ユーザー、パスワード); //バイナリ伝送ftpclient.binary()に設定します。 System.out.println( "ログインサクセス!"); if(path.length()!= 0){//リモートシステムのディレクトリをパラメーターpath ftpclient.cd(path)によって指定されたディレクトリに切り替えます。 } ftpclient.binary(); } catch(ioException ex){ex.printstacktrace();新しいruntimeexception(ex); }} / ***接続を閉じる* @author zhou lingbin* @date 2012-7-11* / public void closeconnect(){try {ftpclient.closeServer(); System.out.println( "成功を切断する"); } catch(ioException ex){system.out.println( "not disconnect"); ex.printstacktrace();新しいruntimeexception(ex); }} / *** upload file* @param localfile local file* @param remotefile remote file* @author zhou lingbin* @date 2012-7-11* / public void upload(string localfile、string remotefile){this.localfilename = localfile; this.remotefilename = remotefile; telnetOutputStream os = null; fileInputStream is = null; {//リモートファイルを出力ストリームに追加するos = ftpclient.put(this.remotefilename); //ローカルファイルfile_in = new file(this.LocalFileName)の入力ストリームを取得します。 IS = new fileInputStream(file_in); //バッファバイトを作成[] bytes = new byte [1024]; int c; while((c = is.read(bytes))!= -1){os.write(bytes、0、c); } system.out.println( "upload success"); } catch(ioException ex){system.out.println( "not upload"); ex.printstacktrace();新しいruntimeexception(ex); }最後に{try {if(as!= null){is.close(); }} catch(ioexception e){e.printstacktrace(); }最後に{try {if(os!= null){os.close(); }} catch(ioexception e){e.printstacktrace(); }}}}} / ** *ファイルをダウンロード * @param remotefileリモートファイルパス(サーバー側) * @param localfileローカルファイルパス(クライアント) * @author zhou lingbin * @date 2012-7-11 * / public void download(string remotefile、string localfile){telneTinputStream is = null; fileoutputStream os = null; {//リモートマシンでファイル名を取得し、telnetinputStreamを使用してファイルをローカルエリアに転送します。 is = ftpclient.get(remotefile); file file_in = new file(localfile); os = new fileoutputStream(file_in); byte [] bytes = new byte [1024]; int c; while((c = is.read(bytes))!= -1){os.write(bytes、0、c); } system.out.println( "ダウンロードサクセス"); } catch(ioException ex){system.out.println( "not download"); ex.printstacktrace();新しいruntimeexception(ex); }最後に{try {if(as!= null){is.close(); }} catch(ioexception e){e.printstacktrace(); }最後に{try {if(os!= null){os.close(); }} catch(ioexception e){e.printstacktrace(); }}}} public static void main(string agrs []){string filepath [] = {"/temp/aa.txt"、 "/temp/regist.log"}; string localfilepath [] = {"c://tmp//1.txt"、 "c://tmp//2.log"}; ftp fu = new ftp(); /**デフォルトのポート番号、ユーザー名、パスワード、ルートディレクトリを使用して、FTPサーバーに接続します*/fu.connectserver( "127.0.0.1"、22、 "Anonymous"、 "ieuser@"、 "/temp"); //(int i = 0; i <filepath.length; i ++){fu.download(filepath [i]、localfilepath [i]); }文字列localfile = "e://number.txt";文字列remotefile = "/temp/haha.txt"; // fu.upload(localfile、remotefile)をアップロードします。 fu.closeconnect(); }}
この方法については何も言うことはありませんが、比較的簡単であり、中国の文字化けコードの問題はありません。欠陥があり、大きなファイルを操作できないようです。興味のある友達はそれを試すことができます。
2番目の方法:
public class ftpapche {private static ftpclient ftpclient = new ftpclient(); private static string encoding = system.getProperty( "file.Encoding"); /** *説明:ファイルをFTPサーバーにアップロード * * @バージョン1.0 * @Param URL * ftpサーバーホスト名 * @paramポート * ftpサーバーポート * @param username * ftpログインアカウント * @paramパスワード * ftpログインパスワード * @paramパスftp server * @param input *ローカルファイル入力ストリーム * @return return true true、それ以外の場合はfalse */ public static boolean uploadfile(string url、int port、string username、string password、string path、string filename、inputstream input){boolean result = fals; {int Reply; //デフォルトのポートが使用されている場合、FTPサーバーftpclient.connect(url)に直接接続できます。 // ftp.connect(url、port); // ftp serverに接続// ftpclient.login(username、password)にログインします。 ftpclient.setControlencoding(エンコード); //接続が成功していることを確認しますReply = ftpclient.getReplyCode(); if(!ftpreply.ispositiveCompletion(Reply)){system.out.println( "接続失敗"); ftpclient.disconnect();返品結果; } //作業ディレクトリを指定されたディレクトリに転送ブール変更= ftpclient.changeworkingdirectory(path); ftpclient.setfiletype(ftp.binary_file_type); if(change){result = ftpclient.storefile(new String(filename.getBytes(encoding)、 "ISO-8859-1")、input); if(result){system.out.println( "Uploaded raded upload!"); }} input.close(); ftpclient.logout(); } catch(ioexception e){e.printstacktrace(); }最後に{if(ftpclient.isconnected()){try {ftpclient.disconnect(); } catch(ioexception ioe){}}} return result; }/***ローカルファイルをFTPサーバーにアップロードします**/public void testuploadfromdisk(){try {fileInputStream in = new FileInputStream(new File( "e:/number.txt")); boolean flag = uploadfile( "127.0.0.1"、21、 "zlb"、 "123"、 "/"、 "haha.txt"、in); System.out.println(flag); } catch(filenotfoundexception e){e.printstacktrace(); }} /** *説明:FTPサーバーからファイルをダウンロード * * * @バージョン1.0 * @Param URL * ftp Server Hostname * @Param Port * ftp Serverポート * @Param Username * ftpログインアカウント * @paramパスワード * ftpログインパスワード *ローカルダウンロード * @return */ public static boolean downfile(string url、int port、string username、string password、string remotepath、string filename、string localpath){boolean result = false; {int Reply; ftpclient.setControlencoding(エンコード); / * *中国のファイルをアップロードしてダウンロードするために、一部の場所では、 * new String(Remotepath.getBytes(エンコード)、「ISO-8859-1」)トランスコーディングの代わりに、次の2つの文を使用することをお勧めします。 *テスト後、渡すことはできません。 */// ftpclientconfig conf = new ftpclientconfig(ftpclientconfig.syst_nt); // conf.setserverlanguagecode( "zh"); ftpclient.connect(url、port); //デフォルトのポートを使用する場合、ftpclient.login(username、password); // login //ファイル転送タイプをbinary ftpclient.setfiletype(ftpclient.binary_file_type)に設定して、ftpclient.login(username、password)によって直接FTPサーバーに接続できます。 // ftpログイン応答コードを取得しますReply = ftpclient.getReplyCode(); //ログインが成功していることを確認します(!ftpreply.ispositiveCompletion(reply)){ftpclient.disconnect(); System.err.println( "FTPサーバーが接続を拒否しました。");返品結果; } // ftpサーバーディレクトリに指定されたディレクトリftpclient.changeworkingdirectory(new String(Remotepath.getBytes(エンコーディング)、 "ISO-8859-1"))に転送されます。 //ファイルリストを取得ftpfile [] fs = ftpclient.listfiles(); for(ftpfile ff:fs){if(ff.getname()。equals(filename)){file localfile = new file(localpath + "/" + ff.getName()); outputStream is = new fileoutputStream(localfile); ftpclient.retrievefile(ff.getname()、is); is.close(); }} ftpclient.logout(); result = true; } catch(ioexception e){e.printstacktrace(); }最後に{if(ftpclient.isconnected()){try {ftpclient.disconnect(); } catch(ioexception ioe){}}} return result; }/** * FTPサーバーのファイルをローカル * */public void testdownfile(){try {boolean flag = downfile( "127.0.0.1"、21、 "zlb"、 "123"、 "/"、 "haha.txt"、 "d:/"); System.out.println(flag); } catch(Exception e){e.printstacktrace(); }} public static void main(string [] args){ftpapche fa = new ftpapche(); fa.testdownfile(); }}
このようにして、中国の文字化けコードの問題に注意を払う必要があります。誤って設定すると、アップロードされたファイル名はCarled Codeになる可能性があります。アップロードできない場合があります。もちろん、例外がないので、あなたはあなたに促しません。私はオンラインで多くの解決策を見つけました、そして、多くの異なる意見があります。それらのほとんどすべてが1つのバージョンからコピーされており、私は自分でテストされていません。私はこれのために多くのことをしました。次の2つのソリューションにほぼ分割されています。
1.次の3つの文を追加して解決します
ftpclient.setControlencoding( "gbk");
ftpclientconfig conf = new ftpclientconfig(ftpclientconfig.syst_nt);
conf.setserverlanguagecode( "zh");
回答:テスト後、それは単に機能しません、上記の問題はまだ存在します
2。それは上記の方法に似ていますが、この方法はより信頼性が高いと思います
まず、文を追加しますftpclient.setControlencoding( "gbk");そして、次のように、すべての中国人を「ISO-8859-1」形式にトランスコードします。
ftpclient.changeworkingdirectory(new String(Remotepath.getBytes( "gbk")、 "ISO-8859-1"));
回答:テスト後、まだ機能しません。この方法がより信頼できると私が言った理由。読み続けてください。
まず、なぜトランスコードする必要があるのかについて話しましょう。
FTPプロトコルでは、ファイル名はISO-8859-1としてエンコードされるように指定されているため、ディレクトリ名またはファイル名をトランスコードする必要があります。
次の質問は、この形式にどのエンコードを変換するかです。したがって、GBK形式をISO-8859-1形式に変換する2番目のソリューションがあります。さらに、一部の人々は、これを行わなければならないと言っています。実際、私は彼らがこれが完全な偶然であると言うことができる理由だと思います。その本当の原則は、FTPプロトコルによって指定されたエンコード形式は「ISO-8859-1」であるため、サーバーがファイルを受信したときにフォーマットを変換してから自動的にシステム独自のエンコード形式に変換する必要があることです。したがって、キーは形式を指定するのではなく、FTPサーバーのエンコード形式に依存することです。したがって、FTPシステムのエンコード形式が「GBK」の場合、2番目の方法は間違いなく成功します。ただし、システムのエンコーディング形式が「UTF-8」の場合でも、まだコードがあります。したがって、コードを介してシステムのエンコード形式のみを取得し、このエンコード形式を介してISO-8859-1のエンコード形式に変換できます。取得方法は次のとおりです。
private static string encoding = system.getProperty( "file.Encoding");
上記のすべてのコードは自分でテストされています。彼らがすべての人のために問題を解決できることを願っています!