java io filesystems diff watchservice

java - Cómo ver el archivo de nuevo contenido y recuperar ese contenido



io filesystems (1)

Java Diff Utils está diseñado para ese propósito.

final List<String> originalFileContents = new ArrayList<String>(); final String filePath = "C:/Users/BackSlash/Desktop/asd.txt"; FileListener fileListener = new FileListener() { @Override public void fileDeleted(FileChangeEvent paramFileChangeEvent) throws Exception { // use this to handle file deletion event } @Override public void fileCreated(FileChangeEvent paramFileChangeEvent) throws Exception { // use this to handle file creation event } @Override public void fileChanged(FileChangeEvent paramFileChangeEvent) throws Exception { System.out.println("File Changed"); //get new contents List<String> newFileContents = new ArrayList<String> (); getFileContents(filePath, newFileContents); //get the diff between the two files Patch patch = DiffUtils.diff(originalFileContents, newFileContents); //get single changes in a list List<Delta> deltas = patch.getDeltas(); //print the changes for (Delta delta : deltas) { System.out.println(delta); } } }; DefaultFileMonitor monitor = new DefaultFileMonitor(fileListener); try { FileObject fileObject = VFS.getManager().resolveFile(filePath); getFileContents(filePath, originalFileContents); monitor.addFile(fileObject); monitor.start(); } catch (InterruptedException ex) { ex.printStackTrace(); } catch (FileNotFoundException e) { //handle e.printStackTrace(); } catch (IOException e) { //handle e.printStackTrace(); }

Donde getFileContents es:

void getFileContents(String path, List<String> contents) throws FileNotFoundException, IOException { contents.clear(); BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(path), "UTF-8")); String line = null; while ((line = reader.readLine()) != null) { contents.add(line); } }

Lo que hice:

  1. Cargué el contenido del archivo original en una List<String> .
  2. Utilicé Apache Commons VFS para escuchar los cambios de archivos, usando FileMonitor . Usted puede preguntar, ¿por qué ? Porque WatchService solo está disponible a partir de Java 7, mientras que FileMonitor funciona con al menos Java 5 (preferencia personal, si prefieres WatchService puedes usarlo). Nota : Apache Commons VFS depende de Apache Commons Logging , tendrá que agregar ambos a su ruta de compilación para que funcione.
  3. FileListener un FileListener , luego implementé el método fileChanged .
  4. Ese método carga nuevos contenidos del archivo y usa Patch.diff para recuperar todas las diferencias y luego las imprime
  5. DefaultFileMonitor un DefaultFileMonitor , que básicamente escucha los cambios en un archivo, y agregué mi archivo a él.
  6. Inicié el monitor.

Después de que se inicia el monitor, comenzará a escuchar cambios de archivos.

Tengo un archivo con el nombre foo.txt . Este archivo contiene algo de texto. Quiero lograr la siguiente funcionalidad:

  1. Lanzo el programa
  2. escriba algo en el archivo (por ejemplo, agregue una fila: new string in foo.txt )
  3. Quiero obtener SOLO NUEVO contenido de este archivo.

¿Puedes aclarar la mejor solución a este problema? También quiero resolver problemas relacionados: en caso de que modifique foo.txt , quiero ver diff.

La herramienta más cercana que encontré en Java es WatchService pero si entendí bien, esta herramienta solo puede detectar el tipo de evento que ocurrió en el sistema de archivos (crear archivo, eliminar o modificar).