JAVA实现监听U盘插入 扫描文件

JAVA实现监听U盘插入

想用Java实现监听USB端口是否有移动设备插入,然后操作移动设备内的文件。网站查找资料后发现有个jsr-80的项目,下面先介绍一下什么是JSR:JSR是Java Specification Requests的缩写,意思是Java 规范请求。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。—来自百科

那么JSR-80( Java USB API)就是Java规范请求中对USB操作提供API,如何想用Java语言对USB进行操作,可以选用该扩展API。在下一篇博文中,将会介绍JSR-80的使用,本篇博文将用另一种取巧(傻笨)方式对插入设备的文件进行操作。下面说一下要进行的操作有哪些:

1.当检测到有设备插入时,删除设备中的所有文件。

2.当检测到有设备插入时,查找设备中是否有某个指定文件,若有,则关机。

贴上代码,思路和步骤都详细的写在代码的注释中:

import java.io.File;
import java.util.LinkedHashSet;
import java.util.Set;
/*
 * 实现当检测到有设备插入时,删除设备中的所有文件,使用生产者消费者模式进行检查和删除
 * 1.生产者:在设备插入之前先判断系统开始的盘符数,
 * 然后创建一个线程不断判断系统有多少个盘符,若判断出盘符数增多,则该线程等待并唤醒消费者;否则一直判断。
 * 2.消费者:在没有判断出有插入设备时,处于等待状态;若有,则将设备中的文件全部删除。
 * 3.资源:将插入的设备当作资源
 * 
 */
public class DelUSBFile {
 
	public static int count = 0;
 
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		File[] dir = File.listRoots();
		count = dir.length;
		ResFileByDelFile rf = new ResFileByDelFile(count);
		Thread t1 = new Thread(new ProducerUSBRootByDelFile(rf));
		Thread t2 = new Thread(new ConsumerUSBRootByDelFile(rf));
		t1.start();
		t2.start();
	}
}
//资源
class ResFileByDelFile {
	private int count = 0;
	//判断是否有设备插入的标记
	private boolean flag = false;
	private File[] dirs;
	
	public ResFileByDelFile(int count) {
		this.count = count;
	}
 
	//递归删除文件
	public static void deleteDir(File dir) {
 
		File[] file = dir.listFiles();
 
		if (file != null) {
			for (File f : file) {
				if (f.isDirectory()) {
					deleteDir(f);
				} else {
					System.out.println(f + ":" + f.delete());
				}
			}
		}
		System.out.println(dir + ":" + dir.delete());
	}
	//查找资源--生产者使用
	public synchronized void searchFile() {
		//如果flag为true,说明检测出有设备插入,则等待;
		//如果flag为false,说明没有设备插入
		if (flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		dirs = File.listRoots();
		//一但有设备插入,当前盘符数会大于系统一开始的盘符数
		if (dirs.length > count) {
			flag = true;
			notify();
		}
	}
	//消费资源--消费者使用
	public synchronized void delFile() {
		if (!flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (dirs.length > count) {
			for (int i = count; i < dirs.length; i++) {
				deleteDir(dirs[i]);
			}
			flag = false;
			notify();
		}
	}
}
 
//消费者
class ConsumerUSBRootByDelFile implements Runnable {
 
	private ResFileByDelFile rf = null;
 
	public ConsumerUSBRootByDelFile(ResFileByDelFile rf) {
		this.rf = rf;
	}
 
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			rf.delFile();
		}
	}
 
}
 
//生产者
class ProducerUSBRootByDelFile implements Runnable {
 
	private ResFileByDelFile rf = null;
 
	public ProducerUSBRootByDelFile(ResFileByDelFile rf) {
		this.rf = rf;
	}
 
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			rf.searchFile();
		}
	}
 
}

接下来是第二个功能:

import java.io.File;
import java.io.IOException;
import java.util.LinkedHashSet;
import java.util.Set;
/*
 * 实现当检测到有设备插入时,查找设备中的所有文件,使用生产者消费者模式进行检查和查找
 * 1.生产者:在设备插入之前先判断系统开始的盘符数,
 * 然后创建一个线程不断判断系统有多少个盘符,若判断出盘符数增多,则该线程等待并唤醒消费者;否则一直判断。
 * 2.消费者:在没有判断出有插入设备时,处于等待状态;若有,则查找设备中是否包含指定文件,有则关机。
 * 3.资源:将插入的设备当作资源
 * 
 */
public class SearchFileShutDown {
 
	public static int count = 0;
 
	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		File[] dir = File.listRoots();
		count = dir.length;
		ResFileByShutdown rf = new ResFileByShutdown(count);
		Thread t1 = new Thread(new ProducerUSBRootByShutdown(rf));
		Thread t2 = new Thread(new ConsumerUSBRootByShutdown(rf));
		t1.start();
		t2.start();
	}
}
 
//资源
class ResFileByShutdown {
	private int count = 0;
	//判断是否有设备插入的标记
	private boolean flag = false;
	private File[] dirs;
	//保存设备中的文件
	private static Set<String> fileSet = new LinkedHashSet<String>();
	//要查找的指定文件名
	private static final String filename = "1.txt";
 
	public ResFileByShutdown(int count) {
		this.count = count;
	}
 
	//获取所有文件名
	public static void getAllFiles(File dir) throws Exception {
		File[] files = dir.listFiles();
		if (files != null) {
			System.out.println("dir:" + dir);
			for (File f : files) {
				if (f.isDirectory()) {
					getAllFiles(f);
				} else {
					fileSet.add(f.getName());
					System.out.println("file:" + f);
				}
			}
 
		}
		//如果有指定的文件,则10s后关机
		if (fileSet.contains(filename)) {
			Runtime.getRuntime().exec("shutdown -s -t 10");
		}
	}
	//查找资源--生产者使用
	public synchronized void searchFile() {
		if (flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		dirs = File.listRoots();
		if (dirs.length > count) {
			flag = true;
			notify();
		}
	}
	//消费资源--消费者使用
	public synchronized void delFile() {
		if (!flag) {
			try {
				wait();
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (dirs.length > count) {
			for (int i = count; i < dirs.length; i++) {
				try {
					getAllFiles(dirs[i]);
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
			// count = dirs.length;
			flag = false;
			notify();
		}
	}
}
 
//消费者
class ConsumerUSBRootByShutdown implements Runnable {
 
	private ResFileByShutdown rf = null;
 
	public ConsumerUSBRootByShutdown(ResFileByShutdown rf) {
		this.rf = rf;
	}
 
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			rf.delFile();
		}
	}
 
}
 
//生产者
class ProducerUSBRootByShutdown implements Runnable {
 
	private ResFileByShutdown rf = null;
 
	public ProducerUSBRootByShutdown(ResFileByShutdown rf) {
		this.rf = rf;
	}
 
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			rf.searchFile();
		}
	}
 
}

猜你喜欢

转载自blog.csdn.net/lljj888/article/details/88975133
今日推荐