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 stubFile[] 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 blocke.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 blocke.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;}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {rf.delFile();}}}//生产者
class ProducerUSBRootByDelFile implements Runnable {private ResFileByDelFile rf = null;public ProducerUSBRootByDelFile(ResFileByDelFile rf) {this.rf = rf;}@Overridepublic void run() {// TODO Auto-generated method stubwhile (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 stubFile[] 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 blocke.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 blocke.printStackTrace();}}if (dirs.length > count) {for (int i = count; i < dirs.length; i++) {try {getAllFiles(dirs[i]);} catch (Exception e) {// TODO Auto-generated catch blocke.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;}@Overridepublic void run() {// TODO Auto-generated method stubwhile (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;}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {rf.searchFile();if(isClose) {System.out.println("关闭usb生产者监听...");break;}try {Thread.sleep(10000);} catch (InterruptedException e) {e.printStackTrace();}}}}

JAVA实现监听U盘插入 扫描文件相关推荐

  1. 监听U盘插入 拔出 消息,获得U盘盘符

    目录 一.U盘插拔消息监听 1.顶层窗口监听WM_DEVICECHANGE消息 2.WM_DEVICECHANGE 详细参数描述

  2. Android8.0监听U盘插入拔出事件

    静态注册 新建UsbBroadcast继承BroadcastReceiver,然后重新onReceive方法 public class UsbBroadcast extends BroadcastRe ...

  3. java 监听本地端口_JAVA本地监听与远程端口扫描

    摘 要 随着Internet的不断发展,信息技术已成为社会进步的巨大推动力.不管是存储于服务器里还是流通于Internet上的信息都已成为一个关系事业成败的关键,这就使保证信息的安全变得格外重要.本地 ...

  4. Android 监听U盘OTG挂载状态

    Android 监听U盘OTG挂载状态 本篇博客介绍下在Android系统中,如何监听和获取U盘OTG挂载状态 在Android中插入U盘时,系统会先准备U盘并检查是否有错误,检查完成后才会把U盘挂载 ...

  5. java如何监听以太坊交易

    2019独角兽企业重金招聘Python工程师标准>>> 你可以在web3j库的帮助下使用java轻松监听以太坊交易,但此库无法监听Erc20 Token交易. 要监听Erc20Tok ...

  6. java jmenu 监听_Java中用得比较顺手的事件监听

    第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...

  7. 事件监听机制(一)Java事件监听

    事件监听机制(一)Java事件监听 事件监听实现流程 事件对象: 继承自java.util.EventObject对象,由开发者自行定义实现. 事件源: 就是触发事件的源头,不同的事件源会触发不同的事 ...

  8. Android 监听SD卡插入与拔出

    Android 监听SD卡插入与拔出 简单记录一下Android 如何监听SD卡插入与拔出,注意事项: 继承广播: public class SdStatusReceiver extends Broa ...

  9. Java实现监听文件变化的三种方法,推荐第三种

    背景 在研究规则引擎时,如果规则以文件的形式存储,那么就需要监听指定的目录或文件来感知规则是否变化,进而进行加载.当然,在其他业务场景下,比如想实现配置文件的动态加载.日志文件的监听.FTP文件变动监 ...

最新文章

  1. 一文读懂机器学习“数据中毒”
  2. JetBrains DataGrip工具配置数据库过程详解
  3. 用JS来切换CSS,很好很简单
  4. docker 安装git_docker随手笔记第十二节 jenkins+docker+nginx+纯静态页面配置
  5. JDBC实现从Hive抽取数据导入Oracle
  6. java逆向框架,Android逆向之逆向框架层
  7. python中plt定义,对Python中plt的画图函数详解
  8. paip.判断字符是否中文与以及判读是否是汉字uapi python java php
  9. 贝叶斯网络节点概率的计算
  10. Android 打包AAB+PAD(java篇)
  11. Vue二次元个人博客模板
  12. 关于浏览器被2345恶意篡改被设置主页
  13. Android-使用HttpURLConnection实现多线程下载
  14. 星际争霸2的AI环境搭建
  15. 【观察】英特尔:视频行业最佳“合伙人”
  16. kotlin框架Anko的使用及常用的项目配置
  17. 漏电开关跳闸,把火线和零线对换就不跳了,这是什么原因?
  18. java类的各访问级别,Java构造函数具有比其类更宽的访问级别
  19. css3地球自转,CSS3 月亮围绕地球转动的3D动画
  20. 自定义百度地图InfoWindow样式

热门文章

  1. mysql key constraint_MySQL/InnoDB的外键约束(Foreign Key Constraint)
  2. cpp和hpp的区别(转载)
  3. 【Jee---过滤器】
  4. 【已解决】【Appium】请教,Appium配置正常,但是运行脚本异常停止,提示[UiAutomator] Moving to state ‘stopped‘
  5. RK3399平台开发系列讲解(内核修改记录篇)7.6、RK DRM下屏幕显示分辨率的EDID 方式修改及代码流程
  6. 专业版OV通配符证书
  7. FL Studio 21官方中文版如何终身免费升级及如何插入第三方插件
  8. 创业团队从0到1,产品设计师、产品经理的能力模型与职业成长之路
  9. quot;敏捷式软件学习quot; 一条快捷的程序员的成长之路
  10. 【Pandas 数据查找函数 详解】