Java语言实现简单FTP软件------>本地文件管理模块的实现(九)

简介: 首先看一下界面: 1、本地文件列表的显示功能 将本地的当前目录下所有文件显示出来,并显示文件的属性包括文件名、大小、日期、通过javax.swing.JTable()来显示具体的数据。

首先看一下界面:



1、本地文件列表的显示功能

将本地的当前目录下所有文件显示出来,并显示文件的属性包括文件名、大小、日期、通过javax.swing.JTable()来显示具体的数据。更改当前文件目录会调用com.oyp.ftp.panel.local.LocalPanel类的listLocalFiles()方法,其主要代码如

        /**
	 * 读取本地文件到表格的方法
	 */
	private void listLocalFiles(File selDisk) {
		if (selDisk == null || selDisk.isFile()) {
			return;
		}
		localSelFilePathLabel.setText(selDisk.getAbsolutePath());
		File[] listFiles = selDisk.listFiles(); // 获取磁盘文件列表
		// 获取表格的数据模型
		DefaultTableModel model = (DefaultTableModel) localDiskTable.getModel();
		model.setRowCount(0); //  清除模型的内容
		model.addRow(new Object[] { ".", "<DIR>", "" }); // 创建.选项
		model.addRow(new Object[] { "..", "<DIR>", "" }); // 创建..选项
		if (listFiles == null) {
			JOptionPane.showMessageDialog(this, "该磁盘无法访问");
			return;
		}
		// 遍历磁盘根文件夹的内容,添加到表格中
		for (File file : listFiles) {
			File diskFile = new DiskFile(file); // 创建文件对象
			String length = file.length() + "B "; // 获取文件大小
			if (file.length() > 1000 * 1000 * 1000) { // 计算文件G单位
				length = file.length() / 1000000000 + "G ";
			}
			if (file.length() > 1000 * 1000) { // 计算文件M单位
				length = file.length() / 1000000 + "M ";
			}
			if (file.length() > 1000) {
				length = file.length() / 1000 + "K "; // 计算文件K单位
			}
			if (file.isDirectory()) { // 显示文件夹标志
				length = "<DIR>";
			}
			// 获取文件的最后修改日期
			String modifDate = new Date(file.lastModified()).toLocaleString();
			if (!file.canRead()) {
				length = "未知";
				modifDate = "未知";
			}
			// 将单个文件的信息添加到表格的数据模型中
			model.addRow(new Object[] { diskFile, length, modifDate });
		}
		localDiskTable.clearSelection(); // 取消表格的选择项
	}

2、本地文件列表的刷新功能

点击“刷新”按钮,会触发com.oyp.ftp.panel.local.RefreshAction类的actionPerformed(ActionEvent e)方法,其主要代码如下

/**
	 * 刷新本地资源列表的动作处理器的事件处理方法
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		this.localPanel.refreshCurrentFolder(); // 调用管理面板的刷新方法
	}

上面的响应事件会调用com.oyp.ftp.panel.local.LocalPanel类的refreshCurrentFolder()方法,其具体代码如下


        /**
	 * 刷新指定文件夹的方法
	 */
	void refreshFolder(File file) {
		listLocalFiles(file);
	}

	/**
	 * 刷新本地当前文件夹的方法
	 */
	public void refreshCurrentFolder() {
		final File file = getCurrentFolder(); // 获取当前文件夹
		Runnable runnable = new Runnable() { // 创建新的线程
			public void run() {
				listLocalFiles(file); // 重载当前文件夹的列表到表格中
			}
		};
		//导致 runnable 的 run 方法在 EventQueue 的指派线程上被调用。
		SwingUtilities.invokeLater(runnable); // 在事件线程中调用该线程对象
	}

3、 新建本地文件夹功能

点击“新建文件夹”按钮,会触发com.oyp.ftp.panel.local.CreateFolderAction类的actionPerformed(ActionEvent e)方法,然后弹出一个对话框,填写要新建的文件夹名称,选择“确定”,“取消”按钮结束。其主要代码如下

/**
	 * 创建文件夹按钮的动作处理器的动作事件的方法
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		// 使用输入对话框接收用户输入的文件夹名称
		String folderName = JOptionPane.showInputDialog("请输入文件夹名称:");
		if (folderName == null)
			return;
		File curFolder = null;
		// 获取本地资源表格的当前选择行号
		int selRow = localPanel.localDiskTable.getSelectedRow();
		if (selRow < 0) {
			// 创建当前文件夹对象
			curFolder = new File(localPanel.localSelFilePathLabel.getText());
		} else {
			// 获取表格选择行的第一个单元值
			Object value = localPanel.localDiskTable.getValueAt(selRow, 0);
			if (value instanceof File) { // 如果单元值是文件,则获取文件的上级文件夹
				curFolder = (File) value;
				if (curFolder.getParentFile() != null)
					curFolder = curFolder.getParentFile();
			} else
				// 否则根据界面的路径标签创建当前文件夹对象
				curFolder = new File(localPanel.localSelFilePathLabel.getText());
		}
		// 创建当前文件夹下的新文件夹对象
		File tempFile = new File(curFolder, folderName);
		if (tempFile.exists()) {// 如果存在相同文件或文件夹
			JOptionPane.showMessageDialog(localPanel, folderName
					+ "创建失败,已经存在此名称的文件夹或文件。", "创建文件夹",
					JOptionPane.ERROR_MESSAGE);// 提示用户名称已存在
			return; // 结束本方法
		}
		if (tempFile.mkdir()) // 创建文件夹
			JOptionPane.showMessageDialog(localPanel, folderName + "文件夹,创建成功。",
					"创建文件夹", JOptionPane.INFORMATION_MESSAGE);
		else
			JOptionPane.showMessageDialog(localPanel, folderName + "文件夹无法被创建。",
					"创建文件夹", JOptionPane.ERROR_MESSAGE);
		this.localPanel.refreshFolder(curFolder);// 刷新文件夹
	}

4、删除本地文件功能

选择好要删除的文件或文件夹,点击“删除”按钮,会触发com.oyp.ftp.panel.local.DelFileAction类的actionPerformed(ActionEvent e)方法,然后弹出一个对话框,选择“是”,“否”,“取消”按钮结束。其主要代码如下

/**
	 * 删除本地文件的动作处理器的处理动作事件的方法
	 */
	public void actionPerformed(ActionEvent e) {
		// 获取表格选择的所有行
		final int[] selRows = this.localPanel.localDiskTable.getSelectedRows();
		if (selRows.length < 1) // 如果没有选择表格内容
			return; // 结束该方法
		int confirmDialog = JOptionPane.showConfirmDialog(localPanel,
				"确定要执行删除吗?"); // 用户确认是否删除
		if (confirmDialog == JOptionPane.YES_OPTION) { // 如果用于同意删除
			Runnable runnable = new Runnable() { // 创建线程
				/**
				 * 删除文件的递归方法
				 * 
				 * @param file
				 *            要删除的文件对象
				 */
				private void delFile(File file) {
					try {
						if (file.isFile()) { // 如果删除的是文件
							boolean delete = file.delete(); // 调用删该文件的方法
							if (!delete) {
								JOptionPane.showMessageDialog(localPanel, file
										.getAbsoluteFile()
										+ "文件无法删除。", "删除文件",
										JOptionPane.ERROR_MESSAGE);
								return;
							}
						} else if (file.isDirectory()) { // 如果删除的是文件夹
							File[] listFiles = file.listFiles();// 获取该文件夹的文件列表
							if (listFiles.length > 0) {
								for (File subFile : listFiles) {
									delFile(subFile); // 调用递归方法删除该列表的所有文件或文件夹
								}
							}
							boolean delete = file.delete();// 最后删除该文件夹
							if (!delete) { // 如果成功删除
								JOptionPane.showMessageDialog(localPanel, file
										.getAbsoluteFile()
										+ "文件夹无法删除。", "删除文件",
										JOptionPane.ERROR_MESSAGE);
								return; // 返回方法的调用处
							}
						}
					} catch (Exception ex) {
						Logger.getLogger(LocalPanel.class.getName()).log(
								Level.SEVERE, null, ex);
					}
				}

				/**
				 * 线程的主体方法
				 * 
				 * @see java.lang.Runnable#run()
				 */
				public void run() {
					File parent = null;
					// 遍历表格的选择内容
					for (int i = 0; i < selRows.length; i++) {
						// 获取每个选择行的第一列单元内容
						Object value = DelFileAction.this.localPanel.localDiskTable
								.getValueAt(selRows[i], 0);
						// 如果该内容不是DiskFile类的实例对象
						if (!(value instanceof DiskFile))
							continue; // 结束本次循环
						DiskFile file = (DiskFile) value;
						if (parent == null)
							parent = file.getParentFile(); // 获取选择文件的上级文件夹
						if (file != null) {
							delFile(file); // 调用递归方法删除选择内容
						}
					}
					// 调用refreshFolder方法刷新当前文件夹
					DelFileAction.this.localPanel.refreshFolder(parent);
					JOptionPane.showMessageDialog(localPanel, "删除成功。");
				}
			};
			new Thread(runnable).start(); // 创建并启动这个线程
		}
	}

5、重命名本地文件功能

选择好要重命名的文件或文件夹,点击“重命名”按钮,会触发com.oyp.ftp.panel.local.RennameAction类的actionPerformed(ActionEvent e)方法,其主要代码如下

/**
	 * 重命名动作的事件处理方法
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		// 获取本地资源表格的选择行号
		int selRow = this.localPanel.localDiskTable.getSelectedRow();
		if (selRow < 0)
			return;
		// 获取选择行的第一个单元值
		Object value = this.localPanel.localDiskTable.getValueAt(selRow, 0);
		if (!(value instanceof File))
			return;
		// 将该单元值转换为File类的对象
		File file = (File) value;
		// 使用对话框接收用户如入的新文件名
		String fileName = JOptionPane
				.showInputDialog("请输入新文件名", file.getName());
		if (fileName == null)
			return;
		// 创建新名称的文件
		File renFile = new File(file.getParentFile(), fileName);
		boolean isRename = file.renameTo(renFile); // 将原文件重命名
		// 刷新文件夹
		this.localPanel.refreshFolder(file.getParentFile());
		if (isRename) {
			JOptionPane.showMessageDialog(this.localPanel, "重命名为" + fileName
					+ "成功。");
		} else {
			JOptionPane.showMessageDialog(this.localPanel, "无法重命名为" + fileName
					+ "。", "文件重命名", JOptionPane.ERROR_MESSAGE);
		}
	}

==================================================================================================

  作者:欧阳鹏  欢迎转载,与人分享是进步的源泉!

  转载请保留原文地址http://blog.csdn.net/ouyang_peng

===================================================================================================



相关文章
|
9天前
|
安全 前端开发 JavaScript
计算机Java项目|基于SpringBoot的超市售货管理平台的设计与实现
计算机Java项目|基于SpringBoot的超市售货管理平台的设计与实现
|
9天前
|
前端开发 JavaScript Java
计算机Java项目|SpringBoot家政服务管理平台
计算机Java项目|SpringBoot家政服务管理平台
|
27天前
|
算法 Java Go
运行时管理GO与Java的概要对比
【5月更文挑战第17天】本文介绍Go、Python和Java的运行时机制各异。Go是编译型语言,其runtime负责内存管理、GC和协程调度,强调性能和低延迟。Java的JVM兼顾跨平台和性能,使用字节码和JIT编译,其GC策略复杂且高效。三种语言在设计和优化上各有侧重,适用不同场景。
39 3
|
1月前
|
安全 Java API
Java一分钟之——Java模块系统:模块化开发(Jigsaw)
【5月更文挑战第20天】Java 9引入了Jigsaw模块系统,改善代码组织和依赖管理。模块通过`module-info.java`定义,声明名称、导出包及依赖。常见问题包括依赖循环、未声明依赖和过度导出。避免这些问题的策略包括明确声明依赖、谨慎导出包和避免循环依赖。通过实例展示了模块间的关系,强调理解模块系统对于构建整洁、安全和可维护的Java应用的重要性。
74 5
|
9天前
|
前端开发 JavaScript Java
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
计算机Java项目|基于Web的足球青训俱乐部管理后台系统的设计与开发
|
1月前
|
Java 开发者
Java一分钟之-JavaFX布局管理:GridPane, VBox, HBox
本文介绍了JavaFX的三种常用布局管理器:GridPane、VBox和HBox。GridPane用于创建二维网格布局,需设置行和列约束以防止控件重叠。VBox按垂直方向堆叠控件,记得设置间距。HBox水平排列控件,可能需要分配额外空间以避免水平滚动条。示例代码展示了这三种布局的使用。理解并运用这些布局管理器能提升JavaFX应用的界面设计。
39 0
|
4天前
|
Java UED 开发者
【技术解密】Java异常处理新玩法:throw关键字,你的错误管理利器!
【6月更文挑战第19天】Java异常处理关键在于`throw`,它用于主动抛出异常,确保程序健壮性。例如,当年龄验证失败时,`IllegalArgumentException`被`throw`,提供错误详情。自定义异常如`CustomException`能增强错误信息。此外,通过构建异常链,如在`DataProcessingException`中嵌套`IOException`,保持原始堆栈信息,提供更全面的错误上下文。掌握`throw`能提升错误管理,打造稳定软件。
|
11天前
|
监控 Java 关系型数据库
java版MES系统源码,后端采用 Spring Boot 多模块架构
MES系统采用Vue3的vue-element-plus-admin为后台,Spring Boot多模块架构,支持MySQL、Oracle等数据库,具备SaaS多租户功能。核心功能包括车间计划排程、工艺流程配置、生产质量管理、进度追踪、库存和排班管理等,全面覆盖生产运营关键环节。
java版MES系统源码,后端采用 Spring Boot 多模块架构
|
14天前
|
监控 Java UED
Java一分钟之-Spring Cloud Netflix Hystrix:容错管理
【6月更文挑战第9天】Spring Cloud Hystrix是用于微服务容错管理的库,通过断路器模式防止服务雪崩。本文介绍了Hystrix的基本概念,如断路器、线程隔离和fallback机制,并展示了如何快速上手,包括添加依赖、启用注解和编写Hystrix命令。此外,还讨论了常见问题(如断路器打开、资源泄漏和不当的Fallback策略)及其解决方案。通过自定义Hystrix指标监控,可以进一步优化系统性能。理解Hystrix工作原理并适时调整配置,对于构建健壮的微服务至关重要。
123 3
|
21天前
|
Java 监控 安全
Java一分钟之-JMX:Java管理扩展
【6月更文挑战第3天】Java Management Extensions (JMX) 允许创建、注册和管理MBeans以监控和控制Java应用。本文关注JMX的基本概念、常见问题和易错点。关键点包括:正确实现MBean和使用`StandardMBean`,确保MBean注册时名称唯一,引用平台MBean Server,配置安全管理,以及处理MBean操作异常。理解这些概念和最佳实践对于有效利用JMX至关重要。记得在实际应用中测试管理接口并加强生产环境的安全性。
33 8