# Dateizugriff mitbekommen - file change event



## Q-Base (7. Nov 2007)

Hallo, 

kennt jemand eine Bibliothek oder eine Java API, bei der ich ein Listener werde und immer per Event informiert werde, wenn die Datei geändert, sprich geschrieben wurde? 

Momentan lese ich die Datei alle 0,2 Sekunden ein. Das erzeugt eine Last und garantiert noch nicht, dass die Daten, die ich halte, auch aktuell sind. 

Ciao, Q


----------



## der JoJo (7. Nov 2007)

auf basis eines eclipse plugins könnte das gehen, aber ich glaube normalerweise kann man keine dateisystem listener erstellen (Platformunabhängigkeit und so)


----------



## 20mithrandir (7. Nov 2007)

Normalerweise wird so eine Datei auch nicht immer neu eingelesen (naja, kommt auf die Größe an), sondern Zeitstempel und Dateigrösse auf Änderung verglichen. Also einfach diese Stati merken und schon bekommt man für die meisten Fälle eine Änderung gut mit. Oder seh' ich das zu simpel?


----------



## der JoJo (7. Nov 2007)

hm müsste eigendlich gehen, ich glaube eclipse macht das nicht anders


----------



## 20mithrandir (7. Nov 2007)

Also das hier geht bei mir:


```
public static void main( String[] args )
{
	File f = new File( "testfile" );		
	long lastModified = Long.MIN_VALUE;
	long lastSize = Long.MIN_VALUE;
		
	if ( f.exists() == false )
	{
		try
		{
			f.createNewFile();
		}
		catch( IOException e )
		{
			e.printStackTrace();
		}
		lastModified = f.lastModified();
		lastSize = f.getTotalSpace();			
	}
		
	f = null;
		
	while( true )
	{
		f = new File( "testfile" );
			
		if ( lastModified != f.lastModified() )
		{
			System.out.println( "Zeitstempel modifiziert!" );
		}
		else if ( lastSize != f.getTotalSpace() )
		{
			System.out.println( "Groesse modifizert!" );
		}
		
		lastModified = f.lastModified();
		lastSize = f.getTotalSpace();
			
		try
		{
			Thread.sleep( 200 );
		}
		catch( InterruptedException e )
		{
			e.printStackTrace();
		}
	}
}
```

Natürlich nicht ganz ausgereift, aber immerhin ein Anfang...


----------



## Q-Base (7. Nov 2007)

ich möchte genau von 'Thread.sleep( 200 );' oder sowas weg. 

Das erzeugt Last. Es gibt hier mehrere Prozesse, die auf diese Datei zugreifen - schreibend. Und einer lesend. Ein Listener wäre gut, weil das dann eine zentrale Instanz ist, nämlich die Java-VM, die da einfach einen Handle drauf hat. 

Ciao, Q


----------



## 20mithrandir (7. Nov 2007)

Und was glaubst du macht ein Listener-Konzept, wenn nicht implizit selbst pollen?

Ein sleep erzeugt jedenfalls bei mir keine Last, ganz im Gegenteil ; - )


----------



## Wildcard (7. Nov 2007)

Schau dir JNotify an.


----------



## 20mithrandir (7. Nov 2007)

Das erscheint mir mit der nativen Implementierung sicher deutlich performanter zu sein, als alles in plain Java... Ist halt dann nicht ganz os-unabhängig.


----------



## Murray (7. Nov 2007)

Wenn alle "Prozesse", die die Datei lesen und schreiben, in einer VM laufen, dann könntest du den Zugriff auf die Datei doch mit einer entsprechenden Klasse kapseln, die die anderen Verwender benachrichtigt (z.B. per Observer/Observable), wenn jemand die Datei geschrieben hat.


----------



## Murray (7. Nov 2007)

20mithrandir hat gesagt.:
			
		

> Und was glaubst du macht ein Listener-Konzept, wenn nicht implizit selbst pollen?


Wenn ein Listener für ein Event eingetragen wird, dann wird an der Stelle, an der das Event auftritt, die entsprechende Methode des Listener-Objekts aufgerufen; gepollt wird da nicht.


----------



## Wildcard (7. Nov 2007)

Du musst nur die entsprechenden Libs für Windows und Linux mitliefern. Plattformunabhängig ist es dann immer noch.
Nur bei den anderen Betriebssystemen könnte es problematisch werden.



> Und was glaubst du macht ein Listener-Konzept, wenn nicht implizit selbst pollen?


Schau dir den Unterschied zwischen Push und Pull Modell an. Ist ein himmelweiter Unterschied.
JNotify verwendet iNotify für Linux System und die verkorkste WinAPI für Windows Systeme. 
Erst wenn nichts davon möglich ist (weil zB der Kernel ohne iNotify support kompiliert wurde) wird auf Polling zurückgegriffen.


----------



## Murray (7. Nov 2007)

20mithrandir hat gesagt.:
			
		

> Ein sleep erzeugt jedenfalls bei mir keine Last, ganz im Gegenteil ; - )


Das sleep nicht, wohl aber die Aktionen zwischen den sleeps und der ständige Wechsel zwischen den Threads (sofern man nicht gerade mindestens soviele CPU-Kerne wie Thread hat)


----------



## 20mithrandir (7. Nov 2007)

Ihr müsst nicht immer darauf herumhacken. Als ich das geschrieben hatte, war nirgendwo etwas von einer native Implementierung zu lesen. Und in pure java wäre ein Push Modell nicht so einfach möglich.


----------

