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.当检测到有设备插入时,查找设备中是否有某个指定文件,若有,则关机。
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盘插入 扫描文件相关推荐
- 监听U盘插入 拔出 消息,获得U盘盘符
目录 一.U盘插拔消息监听 1.顶层窗口监听WM_DEVICECHANGE消息 2.WM_DEVICECHANGE 详细参数描述
- Android8.0监听U盘插入拔出事件
静态注册 新建UsbBroadcast继承BroadcastReceiver,然后重新onReceive方法 public class UsbBroadcast extends BroadcastRe ...
- java 监听本地端口_JAVA本地监听与远程端口扫描
摘 要 随着Internet的不断发展,信息技术已成为社会进步的巨大推动力.不管是存储于服务器里还是流通于Internet上的信息都已成为一个关系事业成败的关键,这就使保证信息的安全变得格外重要.本地 ...
- Android 监听U盘OTG挂载状态
Android 监听U盘OTG挂载状态 本篇博客介绍下在Android系统中,如何监听和获取U盘OTG挂载状态 在Android中插入U盘时,系统会先准备U盘并检查是否有错误,检查完成后才会把U盘挂载 ...
- java如何监听以太坊交易
2019独角兽企业重金招聘Python工程师标准>>> 你可以在web3j库的帮助下使用java轻松监听以太坊交易,但此库无法监听Erc20 Token交易. 要监听Erc20Tok ...
- java jmenu 监听_Java中用得比较顺手的事件监听
第一次听说监听是三年前,做一个webGIS的项目,当时对Listener的印象就是个"监视器",监视着界面的一举一动,一有动静就触发对应的响应. 一.概述 通过对界面的某一或某些操 ...
- 事件监听机制(一)Java事件监听
事件监听机制(一)Java事件监听 事件监听实现流程 事件对象: 继承自java.util.EventObject对象,由开发者自行定义实现. 事件源: 就是触发事件的源头,不同的事件源会触发不同的事 ...
- Android 监听SD卡插入与拔出
Android 监听SD卡插入与拔出 简单记录一下Android 如何监听SD卡插入与拔出,注意事项: 继承广播: public class SdStatusReceiver extends Broa ...
- Java实现监听文件变化的三种方法,推荐第三种
背景 在研究规则引擎时,如果规则以文件的形式存储,那么就需要监听指定的目录或文件来感知规则是否变化,进而进行加载.当然,在其他业务场景下,比如想实现配置文件的动态加载.日志文件的监听.FTP文件变动监 ...
最新文章
- 一文读懂机器学习“数据中毒”
- JetBrains DataGrip工具配置数据库过程详解
- 用JS来切换CSS,很好很简单
- docker 安装git_docker随手笔记第十二节 jenkins+docker+nginx+纯静态页面配置
- JDBC实现从Hive抽取数据导入Oracle
- java逆向框架,Android逆向之逆向框架层
- python中plt定义,对Python中plt的画图函数详解
- paip.判断字符是否中文与以及判读是否是汉字uapi python java php
- 贝叶斯网络节点概率的计算
- Android 打包AAB+PAD(java篇)
- Vue二次元个人博客模板
- 关于浏览器被2345恶意篡改被设置主页
- Android-使用HttpURLConnection实现多线程下载
- 星际争霸2的AI环境搭建
- 【观察】英特尔:视频行业最佳“合伙人”
- kotlin框架Anko的使用及常用的项目配置
- 漏电开关跳闸,把火线和零线对换就不跳了,这是什么原因?
- java类的各访问级别,Java构造函数具有比其类更宽的访问级别
- css3地球自转,CSS3 月亮围绕地球转动的3D动画
- 自定义百度地图InfoWindow样式
热门文章
- mysql key constraint_MySQL/InnoDB的外键约束(Foreign Key Constraint)
- cpp和hpp的区别(转载)
- 【Jee---过滤器】
- 【已解决】【Appium】请教,Appium配置正常,但是运行脚本异常停止,提示[UiAutomator] Moving to state ‘stopped‘
- RK3399平台开发系列讲解(内核修改记录篇)7.6、RK DRM下屏幕显示分辨率的EDID 方式修改及代码流程
- 专业版OV通配符证书
- FL Studio 21官方中文版如何终身免费升级及如何插入第三方插件
- 创业团队从0到1,产品设计师、产品经理的能力模型与职业成长之路
- quot;敏捷式软件学习quot; 一条快捷的程序员的成长之路
- 【Pandas 数据查找函数 详解】