Эта статья поделилась с вами двумя способами загрузки и загрузки файлов Java FTP для вашей ссылки. Конкретный контент заключается в следующем
Первый метод:
пакет com.cloudpower.util; import java.io.file; import java.io.fileinputstream; import java.io.fileoutputstream; import java.io.ioexception; импорт sun.net.telnetinptstream;/import.net.telnetutputstream; import.ftp.ftp -pplient;/***** @Title: ftp.java* @author: zhou lingbin*/public class ftp {/*** local file name*/private string localfilename; / *** Имя удаленного файла*/ private string remotefilename; / *** ftp client*/ private ftpclient ftpclient; /***Соединение сервера*@param IP-сервер IP*@param Port Server Port*@param пользователь имя пользователя*@param пароль*@param Path Path Server Path*@author Zhou Lingbin*@Date 2012-7-11*//public void connectServer (строка IP, порт int, string, String Passwer) {try {/***** Метод // ftpclient = new ftpclient (); // ftpclient.openserver (ip, port); // второй метод ftpclient = new ftpclient (ip); ftpclient.login (пользователь, пароль); // установить на бинарную передачу ftpclient.binary (); System.out.println («Вход в систему успеха!»); if (path.length ()! = 0) {// переключить каталог в удаленной системе на каталог, указанный по пути параметра ftpclient.cd (path); } ftpclient.binary (); } catch (ioException ex) {ex.printstackTrace (); бросить новое runtimeexception (ex); }} / *** Закройте соединение* @author Zhou Lingbin* @Date 2012-7-11* / public void ZeiceConnect () {try {ftpClient.closeServer (); System.out.println ("Отключить успех"); } catch (ioException ex) {System.out.println ("не отключить"); ex.printstacktrace (); бросить новое runtimeexception (ex); }} / *** Файл загрузки* @param localfile local file* @param remotefile remote file* @author Zhou Lingbin* @date 2012-7-11* / public void upload (String localfile, String remotefile) {this.localeName = localfile; this.remotefilename = remotefile; TelnetOutputStream OS = NULL; FileInputStream IS = null; try {// добавить удаленный файл в выходной stream os = ftpclient.put (this.remotefilename); // Получить поток ввода локального файла файла файла_ин = новый файл (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 ("Загрузка успеха"); } catch (ioException ex) {System.out.println ("не загружать"); ex.printstacktrace (); бросить новое runtimeexception (ex); } наконец {try {if (is! = null) {is.close (); }} catch (ioException e) {e.printstacktrace (); } наконец {try {if (os! = null) {os.close (); }} catch (ioException e) {e.printstacktrace (); }}}} / ** * Загрузить файл * @param remotefile demote pail Path (сторона сервера) * @param localfile local file path (client) * @author zhou lingbin * @date 2012-7-11 * / public void загрузка (String remotefile, String localfile) {telnetIptStream is = null; FileOutputStream OS = NULL; Попробуйте {// Получить имя файла на удаленном компьютере и используйте TelnetInputStream для передачи файла в локальную область. is = ftpclient.get (remotefile); File file_in = new File (localfile); OS = New FileOutputStream (file_in); байт [] байты = новый байт [1024]; int c; while ((c = is.read (bytes))! = -1) {os.write (bytes, 0, c); } System.out.println ("Скачать успех"); } catch (ioException ex) {System.out.println ("не скачать"); ex.printstacktrace (); бросить новое runtimeexception (ex); } наконец {try {if (is! = 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]); } String localfile = "e: //number.txt"; String remotefile = "/temp/haha.txt"; // загружать fu.upload (localfile, demotefile); fu.closeconnect (); }}
Об этом методе нечего сказать, он относительно прост, и нет проблем с искаженным кодом Китая. Кажется, что есть недостаток и не может управлять большими файлами. Заинтересованные друзья могут попробовать.
Второй метод:
открытый класс ftpapche {private static ftpclient ftpclient = new ftpclient (); Private Static String Encoding = System.getProperty ("file.encoding"); /** * Description: Upload file to the FTP server* * @Version1.0 * @param url * FTP server hostname * @param port * FTP server port* @param username * FTP login account* @param password * FTP login password* @param path * FTP server saves the directory, if it is the root directory, it is "/" * @param filename * File name uploaded to the FTP -сервер * @param Input * Local File Input Stream * @return return true успешно, в противном случае false */ public static boolean uploadfile (string url, int port, string username, string password, string path, string filename, inputstream input) {boolean result = false; попробуйте {int ответить; // Если используется порт по умолчанию, вы можете напрямую подключиться к FTP -серверу ftpclient.connect (url); // ftp.connect (url, порт); // подключиться к серверу ftp // Войти в ftpclient.login (имя пользователя, пароль); ftpclient.setControLencoding (кодирование); // Убедитесь, что соединение является успешным ответом = ftpclient.getReplyCode (); if (! ftpreply.ispositivecoplusion (reply)) {System.out.println ("Соберите подключение"); ftpclient.disconnect (); результат возврата; } // Передача рабочего каталога в указанный справочник Boolean изменение = ftpclient.changeWorkingDirectory (path); ftpclient.setFileType (ftp.binary_file_type); if (изменить) {result = ftpclient.storefile (new String (fileName.getBytes (кодирование), "iso-8859-1"), input); if (result) {System.out.println ("Загружено успешно!"); }} 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 -сервера * * @version1.0 * @param url * ftp -сервер hostname * @param port * ftp -серверный порт * @param username * ftp choundl Сохранить в локал после загрузки * @return */ public static boolean downfile (string url, int port, string username, String password, String remotePath, String fileName, String localPath) {boolean result = false; попробуйте {int ответить; ftpclient.setControLencoding (кодирование); / * * Чтобы загрузить и загружать китайские файлы, некоторые места рекомендуют использовать следующие два предложения вместо * новой строки (remotepath.getbytes (кодирование), "iso-8859-1"). * После тестирования его нельзя пройти. */// ftpclientConfig conf = new ftpclientConfig (ftpclientConfig.syst_nt); // conf.setserverlanguageCode ("zh"); ftpclient.connect (url, порт); // Если используется порт по умолчанию, вы можете напрямую подключиться к FTP -серверу с помощью ftpclient.login (username, password); // login // Установить тип передачи файла на Binary ftpclient.setFileType (ftpclient.binary_file_type); // Получить код ответа в систему ftp response response = ftpclient.getReplyCode (); // Убедитесь, что вход в систему успешно, если (! Ftpreply.ispositivecoplusion (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 (); }}
Таким образом, вам нужно обратить внимание на проблему искаженного кода китайского. Если вы установите его неправильно, загруженное имя файла может быть искаженным кодом. Иногда это вообще не может быть загружено. Конечно, вы не будете предлагать вам, потому что нет исключения. Я нашел много решений в Интернете, и есть много разных мнений. Почти все они были скопированы из одной версии, и я не был протестирован сам. Я много страдал за это. Он примерно разделен на следующие два решения:
1. Добавьте следующие три предложения, чтобы решить его
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. Более того, некоторые люди также говорят, что это должно быть сделано. На самом деле, я думаю, что причина, по которой они могут сказать, это полное совпадение. Его реальный принцип заключается в том, что, поскольку формат кодирования, указанный протоколом FTP, является «ISO-8859-1», нам действительно нужно преобразовать формат, а затем автоматически конвертировать его в собственное формат кодирования системы, когда сервер получает файл. Следовательно, ключом является не указание формата, а зависит от формата кодирования сервера FTP. Следовательно, если формат кодирования системы FTP является «GBK», второй метод определенно будет успешным; Однако, если формат кодирования системы является «UTF-8», все равно будет искаженное код. Следовательно, мы можем получить формат кодирования системы только через код, а затем преобразовать его в формат кодирования ISO-8859-1 через этот формат кодирования. Метод сбора следующего:
Private Static String Encoding = System.getProperty ("file.encoding");
Все вышеперечисленные коды были протестированы самостоятельно, я надеюсь, что они смогут решить проблему для всех!