Java技巧:java实现文件监控技巧分享

    技术2023-03-29  43

    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");        }    }}   运行效果:在D盘新建一个文件和修改文件名操作。

    最新回复(0)