Java 實現Ftp亂碼問題解決

package fenet.ac.pub.acFtp;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;

import fenet.ac.util.FtpClient;
import fenet.mdp.pub.DateUtil;

import sun.net.TelnetInputStream;
import sun.net.TelnetOutputStream;

public class FtpClientUtil {
 FtpClient ftpClient;
 private String server;
 private int port;
 private String userName;
 private String userPassword;

 public FtpClientUtil(String server, int port, String userName,
   String userPassword) {
  this.server = server;
  this.port = port;
  this.userName = userName;
  this.userPassword = userPassword;
 }

 /**
  * 鏈接到服務器
  * 
  * @return
  */
 public boolean open() {
  if (ftpClient != null && ftpClient.serverIsOpen())
   return true;
  try {
   ftpClient = new FtpClient();
   // ftpClient.setEncoding("GBK");
   ftpClient.openServer(server, port);
   ftpClient.login(userName, userPassword);
   ftpClient.binary();
   return true;
  } catch (Exception e) {
   e.printStackTrace();
   ftpClient = null;
   return false;
  }
 }

 // 新建
 public boolean cd(String dir) {
  boolean f = false;
  try {
   ftpClient.cd(dir);
  } catch (IOException e) {
   // Logs.error(e.toString());
   return f;
  }
  return true;
 }

 /**
  * 上傳文件到FTP服務器
  * 
  * @param localPathAndFileName
  *            本地文件目錄和文件名
  * @param ftpFileName
  *            上傳後的文件名
  * @param ftpDirectory
  *            FTP目錄如:/path1/pathb2/,如果目錄不存在回自動創建目錄
  * @throws Exception
  */
 public boolean upload(String localDirectoryAndFileName, String ftpFileName,
   String ftpDirectory) throws Exception {
  if (!open())
   return false;
  FileInputStream is = null;
  TelnetOutputStream os = null;
  try {
   char ch = ' ';
   if (ftpDirectory.length() > 0)
    ch = ftpDirectory.charAt(ftpDirectory.length() - 1);
   for (; ch == '/' || ch == '\\'; ch = ftpDirectory
     .charAt(ftpDirectory.length() - 1))
    ftpDirectory = ftpDirectory.substring(0,
      ftpDirectory.length() - 1);

   int slashIndex = ftpDirectory.indexOf(47);
   int backslashIndex = ftpDirectory.indexOf(92);
   int index = slashIndex;
   String dirall = ftpDirectory;
   if (backslashIndex != -1 && (index == -1 || index > backslashIndex))
    index = backslashIndex;
   String directory = "";
   while (index != -1) {
    if (index > 0) {
     String dir = dirall.substring(0, index);
     directory = directory + "/" + dir;
     ftpClient.sendServer("XMKD " + directory + "\r\n");
     ftpClient.readServerResponse();
    }
    dirall = dirall.substring(index + 1);
    slashIndex = dirall.indexOf(47);
    backslashIndex = dirall.indexOf(92);
    index = slashIndex;
    if (backslashIndex != -1
      && (index == -1 || index > backslashIndex))
     index = backslashIndex;
   }
   ftpClient.sendServer("XMKD " + ftpDirectory + "\r\n");
   ftpClient.readServerResponse();

   os = ftpClient.put(ftpDirectory + "/" + ftpFileName);
   File file_in = new File(localDirectoryAndFileName);
   is = new FileInputStream(file_in);
   byte bytes[] = new byte[1024];
   int i;
   while ((i = is.read(bytes)) != -1)
    os.write(bytes, 0, i);
   // 清理垃圾

   return true;
  } catch (Exception e) {
   e.printStackTrace();
   return false;
  } finally {
   if (is != null)
    is.close();
   if (os != null)
    os.close();
  }
 }

 /**
  * 從FTP服務器上下載文件並返回下載文件長度
  * 
  * @param ftpDirectoryAndFileName
  * @param localDirectoryAndFileName
  * @return
  * @throws Exception
  */
 public long download(String ftpDirectoryAndFileName,
   String localDirectoryAndFileName) throws Exception {
  long result = 0;
  if (!open())
   return result;
  TelnetInputStream is = null;
  FileOutputStream os = null;
  try {
   is = ftpClient.get(ftpDirectoryAndFileName);
   java.io.File outfile = new java.io.File(localDirectoryAndFileName);
   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 (Exception e) {
   throw e;
  } finally {
   if (is != null)
    is.close();
   if (os != null)
    os.close();

  }
  return result;
 }

 /**
  * 返回FTP目錄下的文件列表
  * 
  * @param ftpDirectory
  * @return
  */
 public List<String> getFileNameList(String ftpDirectory) {
  List<String> list = new ArrayList<String>();
  if (!open())
   return list;
  try {
   BufferedReader dr = new BufferedReader(new InputStreamReader(
     ftpClient.nameList(ftpDirectory), "gbk"));
   String s = "";
   while ((s = dr.readLine()) != null) {
    list.add(s);
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
  return list;
 }

 /**
  * 獲取Ftp根目錄下詳細信息
  */
 public List getFileList() {
  List<String> list = new ArrayList<String>();
  try {
   BufferedReader dr = new BufferedReader(new InputStreamReader(
     ftpClient.list(), "gbk"));
   String s = "";
   while ((s = dr.readLine()) != null) {
    // System.out.println(s);
    // processStr(s);
    list.add(s);
   }
  } catch (UnsupportedEncodingException e) {
   e.printStackTrace();
  } catch (IOException e) {
   e.printStackTrace();
  }
  return list;
 }

 // 獲取具體文件名稱
 public String processStr(String s, int ind) {
  String tempStr = "";
  int count = 0;
  java.util.StringTokenizer st = new java.util.StringTokenizer(s);
  // tempStr=st.nextToken();
  while (st.hasMoreTokens()) {
   tempStr = st.nextToken();
   count++;
   if (count == ind) // 跳過前面的8個屬性
    break;
  }

  if (ind >= 9) {
   tempStr = s.substring(s.indexOf(tempStr));
  }
  return tempStr;
  // String fileName= s.substring(s.indexOf(tempStr));
  // System.out.println(fileName);
 }

 /**
  * 刪除FTP上的文件
  * 
  * @param ftpDirAndFileName
  */
 public boolean deleteFile(String ftpDirAndFileName) {
  if (!open())
   return false;
  ftpClient.sendServer("DELE " + ftpDirAndFileName + "\r\n");
  return true;
 }

 /**
  * 刪除FTP目錄
  * 
  * @param ftpDirectory
  */
 public boolean deleteDirectory(String ftpDirectory) {
  if (!open())
   return false;
  ftpClient.sendServer("XRMD " + ftpDirectory + "\r\n");
  return true;
 }

 /**
  * 關閉鏈接
  */
 public void close() {
  try {
   if (ftpClient != null && ftpClient.serverIsOpen())
    ftpClient.closeServer();
  } catch (Exception e) {

  }
 }

 /**
  * 測試Main
  * 
  * @param args
  */
 public static void main(String[] args) {
  FtpClientUtil ftp = new FtpClientUtil("10.197.14.72", 21, "xp", "xp");
  //ftp.open();
  /*
   * try { ftp.upload("E:/Workspace_PR.sws", "/a", ""); } catch (Exception
   * e) { e.printStackTrace(); }
   */
  /*ftp.cd("/cebfis");
  List<String> list = ftp.getFileList();
  for (String string : list) {
   // System.out.println(ftp.processStr(string,11));
   System.out.println(string);
   // String[] time={ftp.processStr(string, 6),ftp.processStr(string,
   // 7),ftp.processStr(string, 8)};
   // System.out.println(ftp.getTime(time));
  }*/
  //System.out.println(ftp.toString(102400000));
  //ftp.close();
 }

 /**
  * 時間格式處理
  * 
  * @param ins
  *            [] 0:月 1:日 2:年
  * @return
  */
 public String getTime(String[] ins) {
  /*
   * 1月 January Jan. 2月 February Feb. 3月 March Mar. 4月April Apr. 5月 May
   * May 6月 June Jun. 7月 July Jul. 8月 August Aug. 9月 September Sept. 10月
   * October Oct. 11月 November Nov. 12月 December Dec.
   */
  String month = ins[0];
  String day = ins[1];
  String time_year = ins[2];
  String time = "";
  // 判斷時間
  if (month.equalsIgnoreCase("Jan")) {
   month = "1";
  } else if (month.equalsIgnoreCase("Feb")) {
   month = "2";
  } else if (month.equalsIgnoreCase("Mar")) {
   month = "3";
  } else if (month.equalsIgnoreCase("Apr")) {
   month = "4";
  } else if (month.equalsIgnoreCase("May")) {
   month = "5";
  } else if (month.equalsIgnoreCase("Jun")) {
   month = "6";
  } else if (month.equalsIgnoreCase("Jul")) {
   month = "7";
  } else if (month.equalsIgnoreCase("Aug")) {
   month = "8";
  } else if (month.equalsIgnoreCase("Sept")) {
   month = "9";
  } else if (month.equalsIgnoreCase("Oct")) {
   month = "10";
  } else if (month.equalsIgnoreCase("Nov")) {
   month = "11";
  } else if (month.equalsIgnoreCase("Dec")) {
   month = "12";
  }

  if (time_year.indexOf(":") == -1) {
   time = time_year + "-" + month + "-" + day;
  } else {
   time = DateUtil.getCurrentDateString("yyyy") + "-" + month + "-"
     + day + " " + time_year;
  }
  return time;
 }

 public FtpClientUtil() {
  // TODO Auto-generated constructor stub
 }

 // bt字節參考量
 private static final long SIZE_BT = 1024L;
 // KB字節參考量
 private static final long SIZE_KB = SIZE_BT * 1024L;
 // MB字節參考量
 private static final long SIZE_MB = SIZE_KB * 1024L;
 // GB字節參考量
 private static final long SIZE_GB = SIZE_MB * 1024L;
 // TB字節參考量
 private static final long SIZE_TB = SIZE_GB * 1024L;
 private static final int SACLE = 2;
 /**
  * 文件大小屬性 
  * @param longSize
  * @return
  * @throws RuntimeException
  */
 public String toSizeString(long longSize) throws RuntimeException {
  try {
   // 調用計算文件或目錄大小方法
   if ( longSize >= 0 && longSize < SIZE_BT) {
    return  longSize + "B";
   } else if (longSize >= SIZE_BT && longSize < SIZE_KB) {
    return longSize / SIZE_BT + "KB";
   } else if (longSize >= SIZE_KB && longSize < SIZE_MB) {
    return longSize / SIZE_KB + "MB";
   } else if (longSize >= SIZE_MB && longSize < SIZE_GB) {
    BigDecimal longs = new BigDecimal(Double.valueOf(
      longSize + "").toString());
    BigDecimal sizeMB = new BigDecimal(Double.valueOf(SIZE_MB + "")
      .toString());
    String result = longs.divide(sizeMB, SACLE,
      BigDecimal.ROUND_HALF_UP).toString();
    // double result=longSize/(double)SIZE_MB;
    return result + "GB";
   } else {
    BigDecimal longs = new BigDecimal(Double.valueOf(
      longSize + "").toString());
    BigDecimal sizeMB = new BigDecimal(Double.valueOf(SIZE_GB + "")
      .toString());
    String result = longs.divide(sizeMB, SACLE,
      BigDecimal.ROUND_HALF_UP).toString();
    return result + "TB";
   }
  } catch (Exception ex) {
   ex.printStackTrace();
   throw new RuntimeException(ex.getMessage());
  }
 }
}

 

 

//此類是關鍵

package fenet.ac.util;
public class FtpClient extends sun.net.ftp.FtpClient {
 
 public FtpClient() {
  sun.net.NetworkClient .encoding = "GBK";
 }
 public static void setEncoding(String encodingStr) {  
       sun.net.NetworkClient .encoding = encodingStr;  
 }  
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章