HookExample.java

import java.io.*;
import java.util.*;
public class HookExample {
  public static void main(String[] args) throws IOException {
    // Flot bufferisé d'écriture dans un fichier de ce qui est tapé
    final BufferedWriter out =
      new BufferedWriter(new FileWriter("typed.txt"));
    // Flot de lecture sur l'entrée standard (clavier)
    BufferedReader kbd =
      new BufferedReader(new InputStreamReader(System.in));
    // Création d'un shutdown hook instance de classe interne anonyme
    Thread hook = new Thread() {
    // L'exécution du hook consiste à journaliser l'heure de 
    // fin de l'application et à fermer le flot
    public void run() {
      try {
        // Appel du shutdown hook
        out.write("Execution aborted at " + new Date());
        out.newLine();
        out.close();
      } catch(IOException ioe) {
        ioe.printStackTrace();
      }
    }
      };
    // Enregistrement du hook auprès du runtime courant
    Runtime.getRuntime().addShutdownHook(hook);
    String line;
    while ((line = kbd.readLine()) != null) {
      // On peut forcer l'arrêt sans appeler le hook
      if (line.equals("halt"))
    Runtime.getRuntime().halt(1);
      out.write(line);
      out.newLine();
    }
    // Désenregistrement du hook auprès du runtime courant
    Runtime.getRuntime().removeShutdownHook(hook);
    out.close();
    kbd.close();
  }
}