Java WatchService: чтение файла не работает во второй раз

Мне нужно следить за созданием файла, затем скопировать содержимое файла в другой файл, после чего удалить файл.

Я использую Java WatchService для мониторинга создания файлов и стандартного чтения / записи файлов с использованием Bufferedreader и BufferedWriter. Но он работает только при первом запуске, последующем запуске, строки считываются нулевыми из чтения, даже если файл имеет содержимое.

Ниже мой код (пожалуйста, предположите, что все новые переменные объявлены):

Вот как я это назвал: java -jar FileWatcher.jar in=inputFile.txt out=outputFile.txt dir=/tmp type=textfile

 public static void main(String[] args) throws Exception {

    WatchFile w = new WatchFile();

    w.read_cmd(args);

    WatchService watcher = FileSystems.getDefault().newWatchService();

    Path dir = Paths.get(directory);
    dir.register(watcher, ENTRY_CREATE, ENTRY_DELETE, ENTRY_MODIFY);

    while (true) {

        WatchKey key;
        try {
            key = watcher.take();
        } catch (Exception ex) {
            return;
        }

        for (WatchEvent<?> event : key.pollEvents()) {
            WatchEvent.Kind<?> kind = event.kind();

            @SuppressWarnings("unchecked")
            WatchEvent<Path> ev = (WatchEvent<Path>) event;
            Path fileName = ev.context();

                if (kind == ENTRY_CREATE
                        && fileName.toString().equals(infile)) {
                    move_file();
                }

        }

        boolean valid = key.reset();
        if (!valid) {
            break;
        }
    }

}

public void read_cmd(String[] parms) {
    int eIndex = 0;
    String name, value;

    for (String parm : parms) {
        eIndex = parm.indexOf("=");
        if (eIndex > 0) {
            name = parm.substring(0, eIndex);
            value = parm.substring(eIndex + 1).trim();
            if (name.equals("in")) {
                infile = value;
            }
            if (name.equals("out")) {
                outfile = value;
            }
            if (name.equals("dir")) {
                directory = value;
            }
            if (name.equals("type")) {
                fileType = value;
            }

        }
    }

    if (null == outfile) {
        dupFile = directory.concat("/").concat(infile).concat("_dup");
    } else {
        dupFile = directory.concat("/").concat(outfile);
    }
}

   public static void move_file() {

    File inFile = new File(directory.concat("/").concat(infile));
    SimpleDateFormat sdfDate = new SimpleDateFormat("yyyyMMddHHmmss");
    Date now = new Date();
    String strDate = sdfDate.format(now);
    boolean isCopy = false;
    try {

        File outFile = new File(dupFile);
        if (!outFile.exists()) {
            outFile.createNewFile();
        }

        FileInputStream fis = new FileInputStream(inFile.getAbsolutePath());
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(fis))) {
            FileWriter filewriter = new FileWriter(outFile.getAbsoluteFile(), true);
            try (BufferedWriter writer = new BufferedWriter(filewriter)) {

                String line;
                while ((line = reader.readLine()) != null) {
                    writer.write(line);
                    writer.newLine();
                    isCopy = true;
                }

                writer.flush();
            }

        }

        if (isCopy && inFile.exists()) {

            if (inFile.delete()) {
                System.out.println(inFile.getName() + " is deleted!");
            } else {
                System.out.println("Delete operation is failed.");
            }

        } else {
            String fileToCopy = directory.concat("/").concat(infile).concat(strDate);
            inFile.renameTo(new File(fileToCopy));
        }
    } catch (Exception ex) {
        ex.printStackTrace();
    }
}

0 ответов

Другие вопросы по тегам