2017-11-05 3 views
0

Ich habe ein Programm, das seine Einstellungen und Daten immer wieder auf die Festplatte schreibt (15 Sekunden oder so).Wie gehen diese Methoden auf der Festplatte verloren/verursachen Daten?

Wenn das Programm ausgeführt wird und der Computer abrupt ausgeschaltet wird (z. B. wenn die Stromversorgung an der Wand unterbrochen wird), werden alle meine Datendateien auf der Festplatte in leere Dateien umgewandelt.

Hier ist mein Code, die ich dachte, dass ich gegen diesen Fehler zum Schutz, sondern basierend auf den Ausfall Prüfung noch existiert:

SaveAllData - jeder so oft genannt, und auch wenn JavaFX.Application. stop() wird aufgerufen.

public void saveAllData() { 
    createNecessaryFolders(); 
    saveAlbumsAndTracks(); 
    saveSources(); 
    saveCurrentList(); 
    saveQueue(); 
    saveHistory(); 
    saveLibraryPlaylists(); 
    saveSettings(); 
    saveHotkeys(); 
} 

CreateNecessaryFolders

private void createNecessaryFolders() { 
    if (!playlistsDirectory.exists()) { 
     boolean playlistDir = playlistsDirectory.mkdirs(); 
    } 
} 

Funktionen speichern - sie alle aussehen wie dieses

public void saveCurrentList() { 
    File tempCurrentFile = new File (currentFile.toString() + ".temp"); 
    try (ObjectOutputStream currentListOut = new ObjectOutputStream(new FileOutputStream(tempCurrentFile))) { 
     currentListOut.writeObject(player.getCurrentList().getState()); 
     currentListOut.flush(); 
     currentListOut.close(); 

     Files.move(tempCurrentFile.toPath(), currentFile.toPath(), StandardCopyOption.REPLACE_EXISTING); 

    } catch (Exception e) { 
     LOGGER.warning(e.getClass().getCanonicalName() + ": Unable to save current list to disk, continuing."); 
    } 
} 

Github repository to commit where this problem exists. See Persister.java.

Wie gesagt, wenn die Macht abrupt abschneiden Alle Einstellungsdateien, die mit dieser Methode gespeichert wurden, werden ausgeblendet. Dies macht für mich keinen Sinn, da sie nacheinander aufgerufen werden und ich sicherstelle, dass die Datei auf den Datenträger geschrieben und geleert wird, bevor move() aufgerufen wird.

Irgendeine Idee, wie das passieren könnte? Ich dachte, indem ich flush, nah, dann bewegend anriefe, würde ich sicherstellen, dass die Daten auf Platte geschrieben werden, bevor die alten Daten überschrieben werden. Irgendwie ist das nicht der Fall, aber ich bin ahnungslos. Irgendwelche Vorschläge?

Hinweis: Diese Dateien sind nur durch diese Funktionen geschrieben und nur lesen aus durch Last entspricht() Funktionen. Es gibt keinen anderen Zugriff auf die Dateien wo sonst in meinem Programm.

Hinweis 2: Ich erlebe dies auf Ubuntu Linux 16.10. Ich habe es noch nicht auf anderen Plattformen getestet.

Antwort

0

StandardCopyOption.ATOMIC_MOVE zum Files.move() Anruf Hinzufügen löst das Problem:

public void saveCurrentList() { 
    File tempCurrentFile = new File (currentFile.toString() + ".temp"); 
    try (ObjectOutputStream currentListOut = new ObjectOutputStream(new FileOutputStream(tempCurrentFile))) { 
     currentListOut.writeObject(player.getCurrentList().getState()); 
     currentListOut.flush(); 
     currentListOut.close(); 

     Files.move(tempCurrentFile.toPath(), currentFile.toPath(), StandardCopyOption.REPLACE_EXISTING, StandardCopyOption.ATOMIC_MOVE); 

    } catch (Exception e) { 
     LOGGER.warning(e.getClass().getCanonicalName() + ": Unable to save current list to disk, continuing."); 
    } 
} 
Verwandte Themen