Sicher ein File lesen

reibi

Top Contributor
Hallo

So kann ich ja ein File anziehen und danach den Inhalt lesen:

Java:
File myFile = new File("/data/myfile.dat");

oder

Java:
File myFile = new File("C:\\data\\myfile.dat");


In meinem Fall handelt es sich ja um nen File welches von nem anderen Prozess geschrieben oder dort hinkopiert wird.
Wie kann ich aber sicher gehen, dass mein File von nem anderen Prozess schon fertiggeschrieben ist?

Danke und Gruss
 

mfernau

Bekanntes Mitglied
Schwer zu sagen. Ich weiss nicht ob man in Java File-Locking Zustände abfragen kann. Sollte Dein Java-Programm permanent laufen wäre inotify vll etwas für dich: JNotify
Wenn Du selbst den Prozess entwickelst der das File geschrieben hat, dann wäre es auch eine Möglichkeit das File erst nach myfile.dat.parts zu schreiben und im letzten Zug nach myfile.dat um zu benennen.
 

mfernau

Bekanntes Mitglied
Stimmt. Dann wäre der sicherste Weg die Sache mit dem inotify. Das gibt es sowohl unter *NIX als auch unter Windoze.
Alternativ könntest Du halt noch einen kleinen Timer in Dein Programm bauen der die Größe der Datei vor und nach dem Timer vergleicht um festzustellen ob sich die Datei noch ändert. Das ist aber maga dirty. Was besseres fällt mir da nicht mehr ein.
 

reibi

Top Contributor
Alternativ könntest Du halt noch einen kleinen Timer in Dein Programm bauen der die Größe der Datei vor und nach dem Timer vergleicht um festzustellen ob sich die Datei noch ändert
Hi ... ich weiss natürlich genau worauf DU hinaus willst. Klar ... bin ich auch schon drauf gekommen.

Nur verrat mir mal eins. Wie bekommst DU die aktuelle Größe des Files raus?
 

mfernau

Bekanntes Mitglied
Das sollte doch mit dem File-Objekt gehen -> [c]myFile.length[/c]
Javadoc hat gesagt.:
Returns the length of the file denoted by this abstract pathname. The return value is unspecified if this pathname denotes a directory

Returns:
The length, in bytes, of the file denoted by this abstract pathname, or 0L if the file does not exist. Some operating systems may return 0L for pathnames denoting system-dependent entities such as devices or pipes.
 

reibi

Top Contributor
Hi
Das sollte doch mit dem File-Objekt gehen -> [c]myFile.length[/c]

Geht aber nicht!
//Nicht böse gemeint
So schlau war ich ja auch schon ;-)

Und zwar wenn ich mir von einem File(5GB) so die Grösse angeben lasse und das File wird aber erst grad dort hinkopiert, dann sagt mir length() gleich zu Beginn das File hat 5GB.

verstehste?

Gruss
 

mfernau

Bekanntes Mitglied
Ahja - Weil der Speicherplatz im Filesystem schon reserviert ist. Das scheint dann von Filesystem zu Filesystem unterschiedlich zu sein. Hab ich auch nicht dran gedacht. Dann fällt mir auch nichts besseres mehr ein :)
 

reibi

Top Contributor
JNotify ist übrigens plattformabhängig. Ich bräuchte aber etwas plattformunabhängiges.
Und:

Es sagt Dir wenn sich ein File geändert hat. Aber erst nach der Änderung. Ich bräuchte etwas schon während der Änderung

Gruss
 

mfernau

Bekanntes Mitglied
Noch eine Idee - müsstest Du aber probieren..
Und zwar ob sich das Datum der Datei verändert. Ähnlich wie mein Gedanke mit der Dateigröße, nur eben auf das Datum bezogen. Vielleicht wäre das noch ein Krückstock.
 

preachie

Aktives Mitglied
Spannende Aufgabe... aber so eine wirklich brillante Lösung ist mir auch nicht eingefallen.

Auf Windows funktioniert es ganz toll, in regelmäßigen Abständen zu prüfen, ob man auf das File renameTo anwenden kann. Schlägt es fehl, ist entweder die Datei nicht vorhanden oder es liegt noch ein Lock drauf von dem Prozess der sie noch kopiert.

Wie zu erwarten funktioniert dies jedoch nicht unter Linux.
Dort funktioniert allerdings der vorhin schon vorgeschlagene Ansatz mit file.length() die Größe zu prüfen.

Evtl. schaut man mittels System.getProperty("os.name") nach auf was für einem OS die Applikation läuft und verwendet je nachdem die eine oder andere Methode.

Ja, ich weiß, so richtig toll ist die "Lösung" auch nicht...
 

mfernau

Bekanntes Mitglied
Schon interessant, dass es dafür keine vernünftigeren Lösungen gibt...

JNotify ist übrigens plattformabhängig. Ich bräuchte aber etwas plattformunabhängiges.
Wegen Plattformabhängigkeit würde ich mir eigentlich keine Gedanken machen. Je nachdem ob Du Unix oder Windows benutzt müsste entweder die beigelegte .so oder .dll als externe Lib benutzt werden. Du hast damit also theoretisch nichts am Hut.

Es sagt Dir wenn sich ein File geändert hat. Aber erst nach der Änderung. Ich bräuchte etwas schon während der Änderung
Wieso eigentlich während der Änderung? Ich dachte Du möchtest sicher stellen dass die Datei nicht noch belegt ist? So steht es zumindest im Topic-Opener
 

reibi

Top Contributor
Schon interessant, dass es dafür keine vernünftigeren Lösungen gibt...

komisch nich ... wunder mich da auch.

Wegen Plattformabhängigkeit würde ich mir eigentlich keine Gedanken machen. Je nachdem ob Du Unix oder Windows benutzt müsste entweder die beigelegte .so oder .dll als externe Lib benutzt werden.

Hast recht ;-) ABER
1.) Es muss auf solarix, bsd, linux und windows laufen..und
2.) Es muss sichergestellt sein, dass es aufwärtkompatibel ist.
Die Plattformabhängigkeit geht zwar auf dem ersten Blick an mir vorbei, könnte(nicht unwarscheinlich) aber später zum Verhängnis werden.

Wieso eigentlich während der Änderung? Ich dachte Du möchtest sicher stellen dass die Datei nicht noch belegt ist? So steht es zumindest im Topic-Opener

Also ich will mit Files hantieren, welche von anderen Prozessen zwischenzeitlich geschrieben oder auf einen bestimmten share hinkopiert werden, von dem ich sie lese.
Ich muss sicherstellen, dass das File fertiggestellt ist, sonst gibt es Fehler auf die ich nicht reagieren kann.


Gruss ;-)
 

Janus

Bekanntes Mitglied
Ich gehe da ganz pragmatisch vor.
Windows: prüfe, ob sich die Datei umbenennen lässt (File#renameTo)
Mac/*nix: Größe mittels File#length() holen, kurz warten, Größe erneut holen und vergleichen. Evtl. zwischendurch noch ein FileDescriptor#sync()
 

mfernau

Bekanntes Mitglied
Er schrieb ja auch, dass dieses Verfahren nur auf *NIX/Mac zutrifft. Und dort sollte dich Datei auch wachsen. Nur unter Windows wird der Space vorab belegt (zumindest AFAIK)
 

Andi_CH

Top Contributor
Mal von der abstrakten Seite her betrachtet:
Fakt ist, dass die Information ob das File fertig geschrieben ist oder nicht, nicht im Filesystem steht, also muss sie sonst irgendwie zur Verfügung gestellt werden.

Fakt ist aber auch, dass Java an und für sich keine solchen Mechanismen zuf Verfügung stellt, implemtieren muss man die selbst.

Der schreibende Task muss die Statusinformation (schreibend/nicht schreibend) zur Verfügung stellen.
(sei es über ein Interface oder in einem zweiten kleinen File)
Der Reader-Prozess holt sich diese Information .....

Die Synchronisation ist ein Problem für sich.

Wenn du nur einen der beiden Tasks programmierst, ist es kaum möglich eine saubere Lösung zu implementieren.
 

Andi_CH

Top Contributor
OK ... da fällt mir "Fallunterscheidung" als Begriff ein.

Das ist jetzt aber schon ziemlich low level.
Logisch musst du unterschieden ob noch geschrieben wird oder nicht, aber du kannst nur unterscheiden was bekannt ist.

Denk eher mal darüber nach wie die Information ob das Buch fertig ist oder nicht von Schreiberling zur Leseratte kommt :D
 

reibi

Top Contributor
Naja ... lieber wäre mir eine generelle Lösung ...ohne Fallunterscheidung(zum Betriebssystem) ... hab auch noch n 2ten Ansatz. Und zwar die überprüfung der Checksumme. Falls die nicht zieht ist mir einen Fallunterscheidung immer noch lieber als gar keine Lösung.


aber du kannst nur unterscheiden was bekannt ist.

Klar! Aber ich könnte einen Zustand mit einem Zustand vor 100ms vergleichen. Length eignet sich da nicht ... vielleicht aber ne checksumme.

aber du kannst nur unterscheiden was bekannt ist.

Denk eher mal darüber nach wie die Information ob das Buch fertig ist oder nicht von Schreiberling zur Leseratte kommt


Weiss auch da was Du meinst... zB könnte der Schweiberling ein "ichBinFertigFile" dazulegen. Klar ... nur kann ich den Prozess der mir ein File schreibt nicht beeinflussen; das kommt von nem proprietärem System, was ich nicht ändern kann

gruss
 

reibi

Top Contributor
Naja ... als generelle Lösung ... haste auch recht damit.
Meine Files sind aber max ein paar megabyte groß

;-)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OnDemand Zugangsdaten externer Systeme sicher speichern Allgemeine Java-Themen 8
I Datentypen String in class sicher verwahren Allgemeine Java-Themen 17
K API-Key sicher speichern Allgemeine Java-Themen 2
T In Java String sicher verschlüsseln Allgemeine Java-Themen 6
W Passwort Clientseitig sicher ablegen ohne Hash Allgemeine Java-Themen 2
M HTTP Client Zertifikat sicher übertragen? Wie? Allgemeine Java-Themen 2
C Zugangsdaten halbwegs sicher speichern Allgemeine Java-Themen 46
G Threads Referenzoperationen sicher? Allgemeine Java-Themen 20
T Hardware sicher entfernen Allgemeine Java-Themen 8
R Passwörter sicher ablegen Allgemeine Java-Themen 8
T Ist dieser Code sicher gegen concurrent modifications? Allgemeine Java-Themen 6
L Datei sicher löschen/mehrfach überschreiben? Allgemeine Java-Themen 2
S Launch4j .exe-Datei sicher? Allgemeine Java-Themen 5
P Servlet Eingaben sicher machen Allgemeine Java-Themen 5
C Passwort sicher speichern Allgemeine Java-Themen 5
K Collections oder Vektoren sicher zu serialisieren? Allgemeine Java-Themen 5
C Passwörter sicher (verschlüsselt) lokal speichern Allgemeine Java-Themen 3
I Rückgabe eines Arrays aus einer Methode, wie sicher? Allgemeine Java-Themen 3
W Jar-File Start nur über Terminal Allgemeine Java-Themen 13
R 11 GB File lesen ohne zu extrahieren Filedaten Bereich für Bereich adressieren dann mit Multi-Thread id die DB importieren Allgemeine Java-Themen 3
D Read JSON File Problem Allgemeine Java-Themen 9
S Umstellung von File auf Path - Probleme mit Stream Allgemeine Java-Themen 5
C jar File mehrfach aufrufen (als Windows Dienst) Allgemeine Java-Themen 5
N File Path mit Variablen angeben Allgemeine Java-Themen 1
izoards Zugriff auf gemeinsame Ressource (CSV-File) Allgemeine Java-Themen 3
S Class File Editor -> Source not found Allgemeine Java-Themen 4
F jar File ausführen Allgemeine Java-Themen 14
M File Binary Representation Allgemeine Java-Themen 1
N jar File auf Mac mit Doppelklick starten Allgemeine Java-Themen 5
O Input/Output java.io.File beenden Allgemeine Java-Themen 5
G File not found - nach dem Kompilieren Allgemeine Java-Themen 6
T Jar File zu exe... Allgemeine Java-Themen 3
M Foreign Memory API / Memory-Mapped File Allgemeine Java-Themen 0
R Delete files before creating new from temp using Java file method Allgemeine Java-Themen 1
S File lesen und schreiben Java 6 Allgemeine Java-Themen 2
T String-Manipulation beim Ablauf in Eclipse und als JAR-File Allgemeine Java-Themen 8
F Input/Output FileNotFoundException, obwohl File existiert Allgemeine Java-Themen 5
G Excel File öffnen, in Zelle schreiben, abspeichern Allgemeine Java-Themen 6
L JAR-File auf Ilias (LMS) laufen lassen Allgemeine Java-Themen 0
ralfb1105 Classpath Directory fuer Properties File Allgemeine Java-Themen 2
L File beim Kopieren in einen anderen Ordner umbenennen Allgemeine Java-Themen 6
J File in Package erstellen & lesen mit Programmstart in externe Projekt Allgemeine Java-Themen 3
I File ausführen und mein Programm bearbeiten lassen Allgemeine Java-Themen 11
A File lesen Codierung Charset Allgemeine Java-Themen 5
J .java-Dateitext Compile zur Laufzeit ohne File Allgemeine Java-Themen 15
M Key-File im selben Ordner speichern? Allgemeine Java-Themen 18
I TrueZip add file to archive Allgemeine Java-Themen 10
T Probleme mit dem Pfad zum Propertie file Allgemeine Java-Themen 7
J ftp - delete file ohne appache Allgemeine Java-Themen 8
X Klassen File-Klasse wird als Directory markiert Allgemeine Java-Themen 8
T ImageIO.read -> Can`t read input file Allgemeine Java-Themen 11
L Applet Problem "security: Trusted libraries list file not found" ? Allgemeine Java-Themen 7
C Swing File[] als klickbare links in irgendeinem Swing Element Allgemeine Java-Themen 3
H Kennt sich jemand mit Eclipse und dem Thema Jar-File aus ? Allgemeine Java-Themen 6
H Laden einer (Resourcendatei) aus einem Jar-File Allgemeine Java-Themen 17
C Authentifizierung mit java.nio.file? Allgemeine Java-Themen 5
L CSV File lesen, in ArrayList speichern und ausgeben Allgemeine Java-Themen 3
M xlsx File auslesen Exception occured Allgemeine Java-Themen 13
offi Drag and Drop mehrerer File aus Explorer in JTable Allgemeine Java-Themen 1
G Java/LibGDX File Loading Exception Allgemeine Java-Themen 2
Cromewell JavaFX FXML-File lädt unter Ubuntu nicht Allgemeine Java-Themen 7
D Java Anwendung mit dll File Allgemeine Java-Themen 5
AssELAss Log4j Logging Ausgabe für jede Klasse in seperates File Allgemeine Java-Themen 2
thet1983 Input/Output read properties file from classpath Allgemeine Java-Themen 3
J Umwandeln von URL zu File und danach kopieren geht nicht Allgemeine Java-Themen 1
J Properties file ändern Allgemeine Java-Themen 12
S Executable Jar File startet nicht unter Windows 10 Allgemeine Java-Themen 3
B Objekte anhand von Properties file Allgemeine Java-Themen 41
Dechasa Input/Output Write into File Allgemeine Java-Themen 2
N Maven ObjectMapper Error wenn das File gespeichert wird Allgemeine Java-Themen 0
H Security Manager (IIOException: Can't read input file!) Allgemeine Java-Themen 2
H File.listFiles() funktioniert nicht... Allgemeine Java-Themen 10
C Input/Output Problem bei Datei verschiebung mit File.move und Paths.get() Allgemeine Java-Themen 26
X Zeile unter einer bestimmen Zeile hinzufügen(File) Allgemeine Java-Themen 1
F Open source file übersetzen Phython -> Java Allgemeine Java-Themen 4
C file.delete() funktioniert bei zweiten aufruf nicht mehr Allgemeine Java-Themen 3
M Desktop jar File icon Ändern? Allgemeine Java-Themen 14
O Sax-Parser ließt XML-File doppelt Allgemeine Java-Themen 1
J Java Software Compare Files und Neue File erstellen Allgemeine Java-Themen 0
Thallius Custom File Chooser Allgemeine Java-Themen 1
C .jar File lässt sich nur über Konsole öffnen Allgemeine Java-Themen 1
J Java Download Filedownload File.getFileName Allgemeine Java-Themen 3
R Java .class-File-Konstrunkt mit Programm visualisieren Allgemeine Java-Themen 18
G SecurityManager/Policy-File/Reflection Allgemeine Java-Themen 0
M pdf File bzw. ausgefüllte pdf Formulare drucken Allgemeine Java-Themen 2
S Input/Output File Not Found FileReader Allgemeine Java-Themen 6
Thallius Serialisiertes File kann auf anderem Rechner nicht geladen werden Allgemeine Java-Themen 12
P Java Dynamic Web Project -> config File Allgemeine Java-Themen 1
S runnable jar file in Verbindung mit itext Allgemeine Java-Themen 3
D Variablen java.io.File zum vergleichen abspeichern Allgemeine Java-Themen 1
M File IO Klasse ... wie einbinden Allgemeine Java-Themen 6
O Freies Tool zum Jar-File obfuscaten gesucht! Allgemeine Java-Themen 5
F File.listFiles ohne .sort Allgemeine Java-Themen 6
B XML File JAXB Allgemeine Java-Themen 0
S Platzverbrauch, File oder String Allgemeine Java-Themen 14
J Runnable jar-File: Fehlermeldung Allgemeine Java-Themen 2
P Kurze Frage: aus einer File die Zeilenanzahl auslesen Allgemeine Java-Themen 9
K Gepacktes Jar-File gibt beim Doppelklick eine Exception aus Allgemeine Java-Themen 4
P java.nio.file unter Java 6 verwenden Allgemeine Java-Themen 4
A TXT File einlesen unterschiedliche Zeilenlänge Allgemeine Java-Themen 9

Ähnliche Java Themen

Neue Themen


Oben