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.当检测到有设备插入时,查找设备中是否有某个指定文件,若有,则关机。
3.考虑到需要关闭线程,在wait的状态下很容易造成线程堵塞(非后台线程),特意加上关闭代码
贴上代码,思路和步骤都详细的写在代码的注释中:
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();
//关闭
ProducerUSBRootByDelFile.isClose=true;
ConsumerUSBRootByDelFile.isClose=true;
}
}
//资源
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(ProducerUSBRootByShutdown.isClose) {
notifyAll();
return;
}
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(ConsumerUSBRootByShutdown.isClose) {
notifyAll();
return;
}
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 {
public static boolean isClose=false;
private ResFileByShutdown rf = null;
public ConsumerUSBRootByShutdown(ResFileByShutdown rf) {
this.rf = rf;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
if(isClose) {
System.out.println("关闭usb消费者监听...");
break;
}
rf.delFile();
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
//生产者
class ProducerUSBRootByShutdown implements Runnable {
public static boolean isClose=false;
private ResFileByShutdown rf = null;
public ProducerUSBRootByShutdown(ResFileByShutdown rf) {
this.rf = rf;
}
@Override
public void run() {
// TODO Auto-generated method stub
while (true) {
rf.searchFile();
if(isClose) {
System.out.println("关闭usb生产者监听...");
break;
}
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}