Java語言實(shí)現(xiàn)簡(jiǎn)單FTP軟件 FTP遠(yuǎn)程文件管理模塊實(shí)現(xiàn)(10)
本文為大家分享了FTP遠(yuǎn)程文件管理模塊的實(shí)現(xiàn)方法,供大家參考,具體內(nèi)容如下
首先看一下界面:

1、遠(yuǎn)程FTP服務(wù)器端的文件列表的顯示
將遠(yuǎn)程的當(dāng)前目錄下所有文件顯示出來,并顯示文件的屬性包括文件名、大小、日期、通過javax.swing.JTable()來顯示具體的數(shù)據(jù)。更改當(dāng)前文件目錄會(huì)調(diào)用com.oyp.ftp.panel.ftp.FtpPanel類的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è)線程類
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ù)中開始做坐標(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類的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類的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類的actionPerformed(ActionEvent e)方法,然后彈出一個(gè)對(duì)話框,填寫要新建的文件夾名稱,選擇“確定”,“取消”按鈕結(jié)束。其主要代碼如下
/**
* 創(chuàng)建文件夾的事件處理方法
*/
@Override
public void actionPerformed(ActionEvent e) {
// 接收用戶輸入的新建文件夾的名稱
String folderName = JOptionPane.showInputDialog("請(qǐ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{
// 否則 提示用戶該文件夾無法創(chuàng)建
JOptionPane.showMessageDialog(ftpPanel, folderName + "文件夾無法被創(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類的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 - 文件名稱
*/
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ù)中開始做坐標(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類型
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類的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類型的對(duì)象
FtpFile file = (FtpFile) ftpPanel.ftpDiskTable.getValueAt(selRow, 0);
// 使用對(duì)話框接收用戶輸入的新文件或文件夾名稱
String newName = JOptionPane.showInputDialog(ftpPanel, "請(qǐ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í)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
springboot加載一個(gè)properties文件轉(zhuǎn)換為map方式
這篇文章主要介紹了springboot加載一個(gè)properties文件轉(zhuǎn)換為map方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07
SpringBoot將項(xiàng)目打成war包步驟解析
這篇文章主要介紹了SpringBoot將項(xiàng)目打成war包步驟解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03
java局部變量表的基礎(chǔ)知識(shí)點(diǎn)及實(shí)例
在本篇文章里小編給大家整理的是一篇關(guān)于java局部變量表的基礎(chǔ)知識(shí)點(diǎn)及實(shí)例,有需要的朋友們可以學(xué)習(xí)參考下。2021-06-06
springboot中通過lua腳本來獲取序列號(hào)的方法
這篇文章主要介紹了springboot中通過lua腳本來獲取序列號(hào)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06
Java如何導(dǎo)入Jsoup庫做一個(gè)有趣的爬蟲項(xiàng)目
Jsoup庫是一款Java的HTML解析器,可用于從網(wǎng)絡(luò)或本地文件中獲取HTML文檔并解析其中的數(shù)據(jù),這篇文章給大家介紹Java導(dǎo)入Jsoup庫做一個(gè)有趣的爬蟲項(xiàng)目,感興趣的朋友跟隨小編一起看看吧2023-11-11
java實(shí)現(xiàn)下載文件到默認(rèn)瀏覽器路徑
這篇文章主要介紹了java實(shí)現(xiàn)下載文件到默認(rèn)瀏覽器路徑,具有很好的參考價(jià)值,希望對(duì)的大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
java int轉(zhuǎn)byte和long轉(zhuǎn)byte的方法
下面小編就為大家?guī)硪黄猨ava int轉(zhuǎn)byte和long轉(zhuǎn)byte的方法。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-10-10
IDEA的部署設(shè)置改為war exploded運(yùn)行項(xiàng)目出錯(cuò)問題
在使用IDEA配置warexploded部署時(shí),可能會(huì)遇到路徑問題或404錯(cuò)誤,解決方法是進(jìn)入Deployment設(shè)置,刪除Application content中的/marry_war_exploded,使其為空,然后重新運(yùn)行項(xiàng)目即可,這是一種有效的解決策略,希望能幫助到遇到同樣問題的開發(fā)者2024-10-10

