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:
- Cargué el contenido del archivo original en una
List<String>
. - Utilicé Apache Commons VFS para escuchar los cambios de archivos, usando
FileMonitor
. Usted puede preguntar, ¿por qué ? PorqueWatchService
solo está disponible a partir de Java 7, mientras queFileMonitor
funciona con al menos Java 5 (preferencia personal, si prefieresWatchService
puedes usarlo). Nota : Apache Commons VFS depende de Apache Commons Logging , tendrá que agregar ambos a su ruta de compilación para que funcione. -
FileListener
unFileListener
, luego implementé el métodofileChanged
. - Ese método carga nuevos contenidos del archivo y usa
Patch.diff
para recuperar todas las diferencias y luego las imprime -
DefaultFileMonitor
unDefaultFileMonitor
, que básicamente escucha los cambios en un archivo, y agregué mi archivo a él. - 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:
- Lanzo el programa
- escriba algo en el archivo (por ejemplo, agregue una fila:
new string in foo.txt
) - 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).