java本身不能直接监听系统的文件操作事件,不过可以先编写C/C++调用操作系统的API监听文件,再通过jni调用的方式实现。限于本人的C
/C++水平有限,没有用C/C++实现该接口,而且已有开源组件JNotify实现了这个功能,本文例子使用JNotify。
public
?
class
?MainFrame?
extends
?JFrame?{
????
private
?JPanel?contentPane;
????
private
?JTextField?textField;
????
private
?JTextArea?textArea;
????
public
?
static
?
void
?main(String[]?args)?{
????????EventQueue.invokeLater(
new
?Runnable()?{
????????????
public
?
void
?run()?{
????????????????
try
?{
????????????????????MainFrame?frame?
=
?
new
?MainFrame();
????????????????????frame.setVisible(
true
);
????????????????}?
catch
?(Exception?e)?{
????????????????????e.printStackTrace();
????????????????}
????????????}
????????});
????}
????
public
?MainFrame()?{
????????setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
????????setBounds(
100
,?
100
,?
543
,?
300
);
????????contentPane?
=
?
new
?JPanel();
????????contentPane.setBorder(
new
?EmptyBorder(
5
,?
5
,?
5
,?
5
));
????????setContentPane(contentPane);
????????contentPane.setLayout(
null
);
????????JLabel?label?
=
?
new
?JLabel(
"
监控路径:
"
);
????????label.setBounds(
33
,?
20
,?
65
,?
15
);
????????contentPane.add(label);
????????textField?
=
?
new
?JTextField(
"
D:/
"
);
????????textField.setBounds(
90
,?
16
,?
219
,?
21
);
????????contentPane.add(textField);
????????textField.setColumns(
10
);
????????JButton?button?
=
?
new
?JButton(
"
开始监控
"
);
????????button.addActionListener(
new
?ActionListener()?{
????????????
public
?
void
?actionPerformed(ActionEvent?e)?{
????????????????
try
?{
????????????????????addWatch();
????????????????}?
catch
?(Exception?ex)?{
????????????????????ex.printStackTrace();
????????????????}
????????????}
????????});
????????button.setBounds(
319
,?
16
,?
93
,?
23
);
????????contentPane.add(button);
????????textArea?
=
?
new
?JTextArea();
????????JScrollPane?scrollPane?
=
?
new
?JScrollPane(textArea);
????????scrollPane.setBounds(
33
,?
45
,?
480
,?
207
);
????????contentPane.add(scrollPane);
????}
????
public
?
void
?addWatch()?
throws
?Exception?{
????????String?path?
=
?textField.getText();
????????
int
?mask?
=
?JNotify.FILE_CREATED?
|
?JNotify.FILE_DELETED
????????????????
|
?JNotify.FILE_MODIFIED?
|
?JNotify.FILE_RENAMED;
????????
boolean
?watchSubtree?
=
?
true
;
????????
//
添加文件监听
????????
int
?watchID?
=
?JNotify.addWatch(path,?mask,?watchSubtree,?
new
?Listener());
????}
????
class
?Listener?
implements
?JNotifyListener?{
????????
public
?
void
?fileRenamed(
int
?wd,?String?rootPath,?String?oldName,
????????????????String?newName)?{
????????????textArea.append(
"
文件:
"
?
+
?rootPath?
+
?
"
?:?
"
?
+
?oldName?
+
?
"
?重命名为:?
"
????????????????????
+
?newName?
+
?
"
\n
"
);
????????}
????????
public
?
void
?fileModified(
int
?wd,?String?rootPath,?String?name)?{
????????????textArea.append(
"
文件修改?
"
?
+
?rootPath?
+
?
"
?:?
"
?
+
?name?
+
?
"
\n
"
);
????????}
????????
public
?
void
?fileDeleted(
int
?wd,?String?rootPath,?String?name)?{
????????????textArea.append(
"
删除文件:?
"
?
+
?rootPath?
+
?
"
?:?
"
?
+
?name?
+
?
"
\n
"
);
????????}
????????
public
?
void
?fileCreated(
int
?wd,?String?rootPath,?String?name)?{
????????????textArea.append(
"
新建文件:?
"
?
+
?rootPath?
+
?
"
?:?
"
?
+
?name?
+
?
"
\n
"
);
????????}
????}
}