最近要做一个数据发布的客户端,底层用Mina做通信,自定协议,实现传输。在客户端,模仿现在很流行的U盘助手,对U盘的操作进行检测。贴点儿小用例,部分想法来源于互联网,自己小改了下。代码主要通过File类中的listroots对文件系统进行遍历,比较出盘符的变化,进而通过递归遍历出U盘中的内容。
package com.a2.desktop.example1.files.iterator;import java.io.File;import java.util.Vector;/** * * @author Chen.Hui * @since 2012-10-22 U盘检测程序 */public class DiskSearchThread implements Runnable { /** root 现有文件系统的盘符 */ private File[] roots = File.listRoots(); /** fileVector 为了遍历U盘内文件 */ private VectorfileVector = new Vector (); volatile boolean sign = false; SearchFileThread t = null; public DiskSearchThread() { } @Override public void run() { System.out.println("Checking System..."); while (true) { File[] tempFiles = File.listRoots(); fileVector.removeAllElements(); /** 检测到了有U盘插入 */ if (tempFiles.length > roots.length) { for (int i = tempFiles.length - 1; i >= 0; i--) { sign = false; for (int j = roots.length - 1; j >= 0; j--) { /** 如果前后比较的盘符相同 */ if (tempFiles[i].equals(roots[j])) { sign = true; } } /** 如果前后比较的盘符不相同,将不相同的盘符写入向量,并做进一步处理 */ if (sign == false) { fileVector.add(tempFiles[i]); } } roots = File.listRoots(); t = new SearchFileThread(fileVector); t.start(); } else { for (int i = roots.length - 1; i >= 0; i--) { sign = false; for (int j = tempFiles.length - 1; j >= 0; j--) { if (tempFiles[j].equals(roots[i])) { sign = true; } } /** 如果前后比较的盘符不相同,表明U盘被拔出 */ if (sign == false) { System.out.println("QUIT:" + roots[i].toString()); fileVector.removeAllElements(); t.setIsExistToFalse(); // roots=File.listRoots(); } } roots = File.listRoots(); } try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args) { new Thread(new DiskSearchThread()).start(); }}
package com.a2.desktop.example1.files.iterator;import java.io.File;import java.util.Vector;/** * * @author Chen.Hui * @since 2012-10-22 U盘检测程序 */public class SearchFileThread extends Thread { private Vector没有加界面的,其实可以做个Swing的界面,这样就差不多能做出U盘助手的效果了。fileVector = null; private int scanNum = 1; /** 线程安全的变量,用于退出线程 */ volatile boolean isExist = true; public SearchFileThread(Vector fileVector) { this.fileVector = fileVector; System.out.println("fileVector size:" + fileVector.size()); } @Override public void run() { File file = fileVector.elementAt(scanNum - 1); long totalMemory = file.getFreeSpace(); while (isExist) { while (scanNum <= fileVector.size()) { try { System.out.println("search:" + fileVector.elementAt(scanNum - 1).toString() + " Total Space:" + fileVector.elementAt(scanNum - 1).getTotalSpace() / 1024 / 1024 + "MB Free Space:" + fileVector.elementAt(scanNum - 1).getFreeSpace() / 1024 / 1024 + "MB"); /** 遍历文件内容 */ getFiles(fileVector.elementAt(scanNum - 1).getPath()); scanNum++; } catch (Exception e) { e.printStackTrace(); scanNum++; } } /** 如果盘符的大小发生变化,则有文件进出 */ if (totalMemory != file.getFreeSpace()) { System.out.println("文件发生变化----------------------"); getFiles(file.getPath()); totalMemory = file.getFreeSpace(); } } } public void getFiles(String path) { try { File file = new File(path); if (file.isDirectory()) { File[] list = file.listFiles(); for (int i = 0; i < list.length; i++) { if (list[i].isDirectory()) { /** 递归调用 */ getFiles(list[i].getPath()); } System.out.println("Find File:" + list[i].getName()); } } } catch (Exception e) { e.printStackTrace(); } } public synchronized void setIsExistToFalse() { if (isExist == true) isExist = false; }}
后续主要还是要做Mina的通信,对于通信的代码,会在之后的文章中贴出。