Outil de lecture de log : ne suit plus les fichiers déplacés

Le lecteur maintenait le descriteur de fichier ouvert. Ce qui fait pour
Windows, d'empêcher la copie du fichier. Et sur Linux, empêche le suivi
du fichier recréé du même nom que celui déplacé précédemment.
Le fichier de test a été changé en conséquence pour simuler ces
déplacements de fichier.
This commit is contained in:
Marc Baloup 2015-12-29 03:04:12 +01:00
parent 30bda04ae3
commit 8dba570693
2 changed files with 32 additions and 9 deletions

View File

@ -60,15 +60,25 @@ public class Main {
long previousLength = 0;
while(true) {
if (reader.length() < previousLength) {
reader.seek(0);
}
if ((line = readUTF8LineFromFile(reader)) != null) {
outln(line);
previousLength = reader.length();
}
else {
Thread.sleep(10);
previousLength = reader.length();
reader.close();
Thread.sleep(250);
// tant que l'exeption est lancée, on réessaye
for(;;) {
try {
reader = new RandomAccessFile(f, "r");
break;
} catch (FileNotFoundException e) {
Thread.sleep(250);
}
}
if (reader.length() >= previousLength)
reader.seek(previousLength);
}
}

View File

@ -3,6 +3,9 @@ package fr.pandacube.java.logviewer.test;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.nio.file.FileSystemException;
import java.nio.file.Files;
import java.nio.file.StandardCopyOption;
import java.util.Random;
import java.util.concurrent.atomic.AtomicBoolean;
@ -42,11 +45,21 @@ public class Test {
wr.write(randomLine());
wr.flush();
Thread.sleep(r.nextInt(10));
Thread.sleep(r.nextInt(50));
if (r.nextInt(10) == 0) {
if (r.nextInt(100) == 0) {
wr.close();
f.delete();
// tant que l'exeption est lancée, on réessaye
for(;;) {
try {
Files.move(f.toPath(), new File(r.nextInt(10)+".old").toPath(), StandardCopyOption.ATOMIC_MOVE);
break;
} catch (FileSystemException e) {
Thread.sleep(250);
}
}
f.createNewFile();
wr = new BufferedWriter(new FileWriter(f));
}
@ -82,7 +95,7 @@ public class Test {
private static Random r = new Random();
private static char[] chars = new char[] {' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', '♪', '♫', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
private static char[] chars = new char[] {' ', ' ', ' ', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'};
public static String randomLine() {
int length = r.nextInt(100)+15;