溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP遠(yuǎn)程文件管理模塊實(shí)現(xiàn)(10)

發(fā)布時(shí)間:2020-09-11 07:22:51 來(lái)源:腳本之家 閱讀:142 作者:歐陽(yáng)鵬 欄目:編程語(yǔ)言

本文為大家分享了FTP遠(yuǎn)程文件管理模塊的實(shí)現(xiàn)方法,供大家參考,具體內(nèi)容如下

首先看一下界面:

Java語(yǔ)言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP遠(yuǎn)程文件管理模塊實(shí)現(xiàn)(10)

1、遠(yuǎn)程FTP服務(wù)器端的文件列表的顯示

將遠(yuǎn)程的當(dāng)前目錄下所有文件顯示出來(lái),并顯示文件的屬性包括文件名、大小、日期、通過(guò)javax.swing.JTable()來(lái)顯示具體的數(shù)據(jù)。更改當(dāng)前文件目錄會(huì)調(diào)用com.oyp.ftp.panel.ftp.FtpPanel類(lèi)的listFtpFiles(final TelnetInputStream list)方法,其主要代碼如下

 /** 
 * 讀取FTP文件到表格的方法 
 * @param list 
 *  讀取FTP服務(wù)器資源列表的輸入流 
 */ 
 public synchronized void listFtpFiles(final TelnetInputStream list) { 
 // 獲取表格的數(shù)據(jù)模型 
 final DefaultTableModel model = (DefaultTableModel) ftpDiskTable 
  .getModel(); 
 model.setRowCount(0); 
 // 創(chuàng)建一個(gè)線程類(lèi) 
 Runnable runnable = new Runnable() { 
  public synchronized void run() { 
  ftpDiskTable.clearSelection(); 
  try { 
   String pwd = getPwd(); // 獲取FTP服務(wù)器的當(dāng)前文件夾 
   model.addRow(new Object[] { new FtpFile(".", pwd, true), 
    "", "" }); // 添加“.”符號(hào) 
   model.addRow(new Object[] { new FtpFile("..", pwd, true), 
    "", "" }); // 添加“..”符號(hào)  
   byte[]names=new byte[2048]; 
   int bufsize=0; 
   bufsize=list.read(names, 0, names.length); 
   int i=0,j=0; 
   while(i<bufsize){ 
   //字符模式為10,二進(jìn)制模式為13 
//   if (names[i]==10) { 
   if (names[i]==13) { 
    //獲取字符串 -rwx------ 1 user group  57344 Apr 18 05:32 騰訊電商2013實(shí)習(xí)生招聘TST推薦模板.xls 
    //文件名在數(shù)據(jù)中開(kāi)始做坐標(biāo)為j,i-j為文件名的長(zhǎng)度,文件名在數(shù)據(jù)中的結(jié)束下標(biāo)為i-1 
    String fileMessage = new String(names,j,i-j); 
    if(fileMessage.length() == 0){ 
    System.out.println("fileMessage.length() == 0"); 
    break; 
    } 
    //按照空格將fileMessage截為數(shù)組后獲取相關(guān)信息 
    // 正則表達(dá)式 \s表示空格,{1,}表示1一個(gè)以上 
    if(!fileMessage.split("\\s+")[8].equals(".") && !fileMessage.split("\\s+")[8].equals("..")){ 
    /**文件大小*/ 
    String sizeOrDir=""; 
    if (fileMessage.startsWith("d")) {//如果是目錄 
     sizeOrDir="<DIR>"; 
    }else if (fileMessage.startsWith("-")) {//如果是文件 
     sizeOrDir=fileMessage.split("\\s+")[4]; 
    } 
    /**文件名*/ 
    String fileName=fileMessage.split("\\s+")[8]; 
    /**文件日期*/ 
    String dateStr =fileMessage.split("\\s+")[5] +" "+fileMessage.split("\\s+")[6]+" " +fileMessage.split("\\s+")[7];  
    FtpFile ftpFile = new FtpFile(); 
    // 將FTP目錄信息初始化到FTP文件對(duì)象中 
    ftpFile.setLastDate(dateStr); 
    ftpFile.setSize(sizeOrDir); 
    ftpFile.setName(fileName); 
    ftpFile.setPath(pwd); 
    // 將文件信息添加到表格中 
    model.addRow(new Object[] { ftpFile, ftpFile.getSize(), 
     dateStr }); 
    } 
    
//    j=i+1;//上一次位置為字符模式 
    j=i+2;//上一次位置為二進(jìn)制模式 
   } 
   i=i+1; 
   } 
   list.close();  
  } catch (IOException ex) { 
   Logger.getLogger(FTPClientFrame.class.getName()).log( 
    Level.SEVERE, null, ex); 
  } 
  } 
 }; 
 if (SwingUtilities.isEventDispatchThread()) // 啟動(dòng)線程對(duì)象 
  runnable.run(); 
 else 
  SwingUtilities.invokeLater(runnable); 
 } 

2、刷新遠(yuǎn)程FTP服務(wù)器端的文件列表

點(diǎn)擊“刷新”按鈕,會(huì)觸發(fā)com.oyp.ftp.panel.ftp.RefreshAction類(lèi)的actionPerformed(ActionEvent e)方法,其主要代碼如下

/** 刷新按鈕的動(dòng)作處理器動(dòng)作的事件處理方法 **/ 
 @Override 
 public void actionPerformed(ActionEvent e) { 
 ftpPanel.refreshCurrentFolder(); // 調(diào)用刷新FTP資源列表的方法 
 } 

上面的響應(yīng)事件會(huì)調(diào)用com.oyp.ftp.panel.ftp.FtpPanel類(lèi)的refreshCurrentFolder()方法,其主要代碼如下

/** 刷新FTP資源管理面板的當(dāng)前文件夾**/ 
 public void refreshCurrentFolder() { 
 try { 
  // 獲取服務(wù)器文件列表 
  TelnetInputStream list = ftpClient.list(); 
  listFtpFiles(list); // 調(diào)用解析方法 
 } catch (IOException e) { 
  e.printStackTrace(); 
 } 
 } 

3、新建遠(yuǎn)程FTP服務(wù)器端的文件夾

點(diǎn)擊“新建文件夾”按鈕,會(huì)觸發(fā)com.oyp.ftp.panel.ftp.CreateFolderAction類(lèi)的actionPerformed(ActionEvent e)方法,然后彈出一個(gè)對(duì)話框,填寫(xiě)要新建的文件夾名稱(chēng),選擇“確定”,“取消”按鈕結(jié)束。其主要代碼如下

/** 
 * 創(chuàng)建文件夾的事件處理方法 
 */ 
@Override 
public void actionPerformed(ActionEvent e) { 
 // 接收用戶輸入的新建文件夾的名稱(chēng) 
 String folderName = JOptionPane.showInputDialog("請(qǐng)輸入文件夾名稱(chēng):"); 
 if (folderName == null) 
 return; 
 int read = -1; 
 try { 
 // 發(fā)送創(chuàng)建文件夾的命令 
 ftpPanel.ftpClient.sendServer("MKD " + folderName + "\r\n"); 
 // 讀取FTP服務(wù)器的命令返回碼 
 read = ftpPanel.ftpClient.readServerResponse(); 
 } catch (IOException e1) { 
 e1.printStackTrace(); 
 } 
 if (read == 257) {// 如果返回碼等于257(路徑名建立完成) 
 // 提示文件夾創(chuàng)建成功 
 JOptionPane.showMessageDialog(ftpPanel, folderName + "文件夾,創(chuàng)建成功。", 
  "創(chuàng)建文件夾", JOptionPane.INFORMATION_MESSAGE); 
 }else{ 
 // 否則 提示用戶該文件夾無(wú)法創(chuàng)建 
 JOptionPane.showMessageDialog(ftpPanel, folderName + "文件夾無(wú)法被創(chuàng)建。", 
  "創(chuàng)建文件夾", JOptionPane.ERROR_MESSAGE); 
 } 
 this.ftpPanel.refreshCurrentFolder(); 
} 

4、 刪除遠(yuǎn)程FTP服務(wù)器端的文件

選擇好要?jiǎng)h除的文件或文件夾,點(diǎn)擊“刪除”按鈕,會(huì)觸發(fā)com.oyp.ftp.panel.ftp.DelFileAction類(lèi)的actionPerformed(ActionEvent e)方法,然后彈出一個(gè)對(duì)話框,選擇“是”,“否”,“取消”按鈕結(jié)束。其主要代碼如下

public void actionPerformed(ActionEvent e) { 
 // 獲取顯示FTP資源列表的表格組件當(dāng)前選擇的所有行 
 final int[] selRows = ftpPanel.ftpDiskTable.getSelectedRows(); 
 if (selRows.length < 1) 
  return; 
 int confirmDialog = JOptionPane.showConfirmDialog(ftpPanel, "確定要?jiǎng)h除嗎?"); 
 if (confirmDialog == JOptionPane.YES_OPTION) { 
  Runnable runnable = new Runnable() { 
   
  /** 
   * 刪除服務(wù)器文件的方法 
   * @param file - 文件名稱(chēng) 
   */ 
  private void delFile(FtpFile file) { 
   FtpClient ftpClient = ftpPanel.ftpClient; // 獲取ftpClient實(shí)例 
   try { 
   if (file.isFile()) { // 如果刪除的是文件 
    ftpClient.sendServer("DELE " + file.getName() 
     + "\r\n"); // 發(fā)送刪除文件的命令 
    ftpClient.readServerResponse(); // 接收返回編碼 
   } else if (file.isDirectory()) { // 如果刪除的是文件夾 
    ftpClient.cd(file.getName()); // 進(jìn)入到該文件夾 
    
    TelnetInputStream telnetInputStream=ftpClient.list(); 
    byte[]names=new byte[2048]; 
    int bufsize=0; 
    bufsize=telnetInputStream.read(names, 0, names.length); 
    int i=0,j=0; 
    while(i<bufsize){ 
    //字符模式為10,二進(jìn)制模式為13 
//    if (names[i]==10) { 
    if (names[i]==13) { 
     //獲取字符串 -rwx------ 1 user group  57344 Apr 18 05:32 騰訊電商2013實(shí)習(xí)生招聘TST推薦模板.xls 
     //文件名在數(shù)據(jù)中開(kāi)始做坐標(biāo)為j,i-j為文件名的長(zhǎng)度,文件名在數(shù)據(jù)中的結(jié)束下標(biāo)為i-1 
     String fileMessage = new String(names,j,i-j); 
     if(fileMessage.length() == 0){ 
     System.out.println("fileMessage.length() == 0"); 
     break; 
     } 
     //按照空格將fileMessage截為數(shù)組后獲取相關(guān)信息 
     // 正則表達(dá)式 \s表示空格,{1,}表示1一個(gè)以上 
     if(!fileMessage.split("\\s+")[8].equals(".") && !fileMessage.split("\\s+")[8].equals("..")){ 
     /**文件大小*/ 
     String sizeOrDir=""; 
     if (fileMessage.startsWith("d")) {//如果是目錄 
      sizeOrDir="<DIR>"; 
     }else if (fileMessage.startsWith("-")) {//如果是文件 
      sizeOrDir=fileMessage.split("\\s+")[4]; 
     } 
     /**文件名*/ 
     String fileName=fileMessage.split("\\s+")[8]; 
     /**文件日期*/ 
     String dateStr =fileMessage.split("\\s+")[5] +fileMessage.split("\\s+")[6] +fileMessage.split("\\s+")[7]; 
     FtpFile ftpFile = new FtpFile(); 
     // 將FTP目錄信息初始化到FTP文件對(duì)象中 
     ftpFile.setLastDate(dateStr); 
     ftpFile.setSize(sizeOrDir); 
     ftpFile.setName(fileName); 
     ftpFile.setPath(file.getAbsolutePath()); 
     // 遞歸刪除文件或文件夾 
     delFile(ftpFile); 
     } 
//     j=i+1;//上一次位置為字符模式 
     j=i+2;//上一次位置為二進(jìn)制模式 
    } 
    i=i+1; 
    } 
    ftpClient.cdUp(); // 返回上層文件夾 
    ftpClient.sendServer("RMD " + file.getName() 
     + "\r\n"); // 發(fā)送刪除文件夾指令 
    ftpClient.readServerResponse(); // 接收返回碼 
   } 
   } catch (Exception ex) { 
   Logger.getLogger(LocalPanel.class.getName()).log( 
    Level.SEVERE, null, ex); 
   } 
  } 
 
  /** 
   * 線程的主體方法 
   */ 
  public void run() { 
   // 遍歷顯示FTP資源的表格的所有選擇行 
   for (int i = 0; i < selRows.length; i++) { 
   // 獲取每行的第一個(gè)單元值,并轉(zhuǎn)換為FtpFile類(lèi)型 
   final FtpFile file = (FtpFile) ftpPanel.ftpDiskTable 
    .getValueAt(selRows[i], 0); 
   if (file != null) { 
    delFile(file); // 調(diào)用刪除文件的遞歸方法 
    try { 
    // 向服務(wù)器發(fā)刪除文件夾的方法 
    ftpPanel.ftpClient.sendServer("RMD " 
     + file.getName() + "\r\n"); 
    // 讀取FTP服務(wù)器的返回碼 
    ftpPanel.ftpClient.readServerResponse(); 
    } catch (IOException e) { 
    e.printStackTrace(); 
    } 
   } 
   } 
   // 刷新FTP服務(wù)器資源列表 
   DelFileAction.this.ftpPanel.refreshCurrentFolder(); 
   JOptionPane.showMessageDialog(ftpPanel, "刪除成功。"); 
  } 
  }; 
  new Thread(runnable).start(); 
 } 
 } 

5、重命名遠(yuǎn)程FTP服務(wù)器端的文件

選擇好要重命名的文件或文件夾,點(diǎn)擊“重命名”按鈕,會(huì)觸發(fā)com.oyp.ftp.panel.ftp.RenameAction類(lèi)的actionPerformed(ActionEvent e)方法,其主要代碼如下

/** 
 * 重命名FTP文件的事件處理方法 
 */ 
@Override 
public void actionPerformed(ActionEvent e) { 
 // 獲取顯示FTP資源的表格當(dāng)前選擇行號(hào) 
 int selRow = ftpPanel.ftpDiskTable.getSelectedRow(); 
 if (selRow < 0) 
 return; 
 // 獲取當(dāng)前行的第一個(gè)表格單元值,并轉(zhuǎn)換成FtpFile類(lèi)型的對(duì)象 
 FtpFile file = (FtpFile) ftpPanel.ftpDiskTable.getValueAt(selRow, 0); 
 // 使用對(duì)話框接收用戶輸入的新文件或文件夾名稱(chēng) 
 String newName = JOptionPane.showInputDialog(ftpPanel, "請(qǐng)輸入新名稱(chēng)。"); 
 if (file.getName().equals(".") || file.getName().equals("..") 
  || newName == null) 
 return; 
 try { 
 // 向服務(wù)器發(fā)送重命名的指令 
 ftpPanel.ftpClient.sendServer("RNFR " + file.getName() + "\r\n"); //對(duì)舊路徑重命名 
 ftpPanel.ftpClient.readServerResponse(); 
 ftpPanel.ftpClient.sendServer("RNTO " + newName + "\r\n");  //對(duì)新路徑重命名 
 ftpPanel.ftpClient.readServerResponse(); 
 ftpPanel.refreshCurrentFolder(); // 刷新當(dāng)前文件夾 
 } catch (IOException e1) { 
 e1.printStackTrace(); 
 } 
} 

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI