From 8dba570693277d8c445133a5c97fbe78e6196469 Mon Sep 17 00:00:00 2001 From: Marc Baloup Date: Tue, 29 Dec 2015 03:04:12 +0100 Subject: [PATCH] =?UTF-8?q?Outil=20de=20lecture=20de=20log=20:=20ne=20suit?= =?UTF-8?q?=20plus=20les=20fichiers=20d=C3=A9plac=C3=A9s?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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. --- src/fr/pandacube/java/logviewer/Main.java | 20 +++++++++++++----- .../pandacube/java/logviewer/test/Test.java | 21 +++++++++++++++---- 2 files changed, 32 insertions(+), 9 deletions(-) diff --git a/src/fr/pandacube/java/logviewer/Main.java b/src/fr/pandacube/java/logviewer/Main.java index f5697d6..7790e77 100644 --- a/src/fr/pandacube/java/logviewer/Main.java +++ b/src/fr/pandacube/java/logviewer/Main.java @@ -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); } } diff --git a/src/fr/pandacube/java/logviewer/test/Test.java b/src/fr/pandacube/java/logviewer/test/Test.java index 121c0bc..d61d3e3 100644 --- a/src/fr/pandacube/java/logviewer/test/Test.java +++ b/src/fr/pandacube/java/logviewer/test/Test.java @@ -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;