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();
}
}