2 Stimmen

Java FileWriter überschreiben

Ich habe ein Stück Code, der neue Daten generiert, wann immer es neue Daten als InputStream verfügbar ist. Die gleiche Datei wird jedes Mal überschrieben. Manchmal wird die Datei 0 kb, bevor sie geschrieben wird. Ein Webservice liest diese Dateien in regelmäßigen Abständen. Ich muss den Fall vermeiden, dass die Datei 0 Bytes groß ist.

Wie wird das gemacht? Können Sperren in diesem Fall helfen? Wenn der Browser eine gesperrte Datei lesen will, zeigt er dann weiterhin alte Daten aus dem Cache an, bis die Sperre aufgehoben wird und die Datei wieder gelesen werden kann?

try{
String outputFile = "output.html";     
FileWriter fWriter = new FileWriter(outputFile);
//write the data ...

fWriter .flush();

outputFile = "anotheroutput.html";     
fWriter = new FileWriter(outputFile);
//write the data ...

fWriter .flush();
fWriter.close();
}
catch(Exception e)
{
 e.prinStackTrace();
}

2voto

Michael Barker Punkte 13553

Versuchen Sie, in eine temporäre Datei (im selben Dateisystem) zu schreiben, und verschieben Sie sie nach Abschluss des Schreibvorgangs mit File.renameTo() an ihren Platz. Wenn das zugrunde liegende Dateisystem atomare Verschiebeoperationen unterstützt (was bei den meisten der Fall ist), sollten Sie das gewünschte Verhalten erhalten. Wenn Sie unter Windows arbeiten, müssen Sie sicherstellen, dass Sie die Datei nach dem Lesen schließen, sonst schlägt das Verschieben der Datei fehl.

public class Data
{
    private final File file;
    protected  Data(String fileName) {
        this.file = new File(filename);
    }

   /* above is in some class somehwere 
    *  then your code brings new info to the file
    */

   // 
   public synchronized accessFile(String data) {
       try {
           // Create temporary file
           String tempFilename = UUID.randomUUID().toString() + ".tmp";
           File tempFile = new File(tempFilename);

           //write the data ...
           FileWriter fWriter = new FileWriter(tempFile);
           fWriter.write(data);
           fWriter.flush();
           fWriter.close();

           // Move the new file in place
           if (!tempFile.renameTo(file)) {
               // You may want to retry if move fails?
               throw new IOException("Move Failed");
           }
       } catch(Exception e) {
           // Do something sensible with the exception.
           e.prinStackTrace();
       }
   }
}

1voto

FileWriter fWriter = new FileWriter(fileName,true);

versuchen Sie es mit oben :-)

0voto

Nicholas Jordan Punkte 628
public class Data
{
  String fileName;
  protected  Data(String fileName)
  {
     this.fileName= fileName;
     return; // return from constructor often not needed.
  }

   /* above is in some class somehwere 
    *  then your code brings new info to the file
    */

  // 
  public synchronized accessFile(String data)
  {
    try
    {
       // File name to be class member.
       FileWriter fWriter = new FileWriter(fileName);
       //write the data ...
       fWriter.write(data);
       fWriter .flush();
       fWriter .close();
       return;
    }
    catch(Exception e)
    {
       e.prinStackTrace();
    }

Dies ist nicht erforderlich:

 outputFile = "anotheroutput.html";     
 fWriter = new FileWriter(outputFile);
 //write the data ...

fWriter .flush();
fWriter.close();

Das liegt daran, dass die Arbeit an der Datei eine Methode der Klasse Data ist

0voto

Bhushan Bhangale Punkte 10651

Ihre Anforderung ist nicht sehr klar. Wollen Sie jedes Mal eine neue Namensdatei schreiben oder wollen Sie an dieselbe Datei anhängen oder wollen Sie dieselbe Datei überschreiben? Auf jeden Fall sind alle drei Fälle einfach und können über die API verwaltet werden.

Wenn das Problem darin besteht, dass ein Webdienst die Datei liest, die noch nicht vollständig ist, d. h. sich in der Schreibphase befindet. In Ihrem Webdienst sollten Sie prüfen, ob die Datei nur gelesen werden kann, dann lesen Sie die Datei nur. In der Schreibphase, sobald der Schreibvorgang abgeschlossen ist, setzen Sie die Datei auf nur lesen.

Die 0Kb-Datei entsteht, weil Sie die gleiche Datei erneut überschreiben. Durch das Überschreiben werden alle Daten bereinigt und dann wird der neue Inhalt geschrieben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X