Wann sollte flush () in Java verwendet werden?

7
%Vor%

Ich habe ein paar Fragen im obigen Beispiel.

  1. Wann verwenden wir die Flush-Methode und warum verwenden wir sie?
  2. Was bringt eine enge Methode hier?
  3. myObj2 = (John) ois.readObject(); ... bitte korrigiere mich, wenn ich falsch liege, lese ich das Dateiobjekt und speichere es in ein anderes Objekt und tippe das Dateiobjekt.
  4. Was sind die Alternativen der Serialisierung oder Persistenz der Daten in Java? Ich möchte nicht, dass die Daten als Byte-Stream in die Datei gelangen.
John Cooper 04.09.2011, 16:45
quelle

6 Antworten

6
  

Wann verwenden wir die Flush-Methode und warum verwenden wir sie?

Er löscht alles, was noch von OutputStream gepuffert ist. Eine detaillierte Beschreibung finden Sie in JavaDoc .

  

Was bringt eine enge Methode hier?

Ich bin nicht sicher, was Sie mit "tragen Sie eine Punktzahl" meinen, aber die Methode close schließt schließlich Ressourcen (Input oder Output), es gibt z. Dateigriffe. Sie sollten immer close in einem finally -Block aufrufen, um alle Referenzen zu löschen, die das Betriebssystem haben könnte.

%Vor%
  

myObj2 = (John) ois.readObject (); ... bitte korrigiere mich, wenn ich falsch liege,   Ich lese das Dateiobjekt und speichere es in ein anderes Objekt und   typecasting das Dateiobjekt.

Irgendwie korrekt, Sie deserialisieren ein Objekt, das zuvor in die Datei geschrieben wurde. Diese Dateien sind proprietär und können nur von Java verstanden werden, daher ist die letzte Frage eine gute !

  

Was sind die Alternativen für die Serialisierung oder das Fortbestehen der Daten?   Java. Ich möchte nicht, dass die Daten als Byte-Stream in die Datei gelangen.

Sie haben eine Reihe von Optionen. Für Clientanwendungen möchten Sie möglicherweise XML, JSON oder eine leichtgewichtige Datenbank wie SQLlite verwenden. Auf der Serverseite können Sie sich auch robustere Datenbanken (z. B. MySQL) ansehen.

    
home 04.09.2011, 17:01
quelle
10
  
  1. Wann verwenden wir die Flush-Methode und warum verwenden wir sie?
  2.   

Dies wird verwendet, wenn synchrones Senden erforderlich ist

Zum Beispiel haben Sie eine Duplex (2-Wege) Verbindung und Sie haben gerade eine Nachricht gesendet und müssen nun auf die Antwort warten, ohne zu spülen kann ein gepufferter Ausgabestream es halten, bis der Puffer voll ist (Deadlock)

  
  1. myObj2 = (John) ois.readObject(); Bitte korrigiere mich, wenn ich falsch liege, lese ich das Dateiobjekt und speichere es in ein anderes Objekt und gib das Dateiobjekt ein.
  2.   

FALSCH! Sie lesen einige Daten aus dem Stream typecast es in einen John (der wirft, wenn das Objekt gelesen wurde, war kein John)

  
  1. Was sind die Alternativen der Serialisierung oder Persistenz der Daten in Java? Ich möchte nicht, dass die Daten als Byte-Stream in die Datei gelangen.
  2.   

Sie können es als Text schreiben (schreiben Sie die Felder als Text in einer Zeile aus) und stellen Sie eine Methode bereit, um es in ein Objekt zu zerlegen

    
ratchet freak 04.09.2011 17:03
quelle
4

habe ein paar Fragen im obigen Beispiel.

  1. Wann sollten wir die Flush-Methode verwenden und warum verwenden wir sie?

    Normalerweise brauchen Sie nicht flush() und OutputStream , es werden keine Daten verloren, wenn Sie am Ende richtig close() haben. Manchmal möchten Sie mit der zugrunde liegenden Datensenke kommunizieren (z. B. Netzwerk Socket , lokale File oder eine andere OutputStream ), die alle in den Stream geschriebenen Daten löschen / verarbeiten sollen - aber gemäß < a href="http://download.oracle.com/javase/6/docs/api/java/io/OutputStream.html#flush%28%29"> flush() API-Dokument, das ist nicht garantiert zu passieren.

  2. Was bringt die enge Methode hier?

    Ich verstehe diesen Teil wirklich nicht, aber der close() schließt einen OutputStream und bewirkt, dass er alle noch gepufferten Daten ausgibt - es ist also nicht nötig, flush() vor close() aufzurufen. Ein OutputStream kann nicht geschrieben werden, nachdem es geschlossen wurde.

  3. myObj2 = (John) ois.readObject(); ... bitte korrigiere mich, wenn ich falsch liege, lese ich das Dateiobjekt und speichere es in ein anderes Objekt und tippe das Dateiobjekt.

    Falsch, Sie lesen von ObjectInputStream ois , es ist irrelevant, wo es seine Daten hat (in Ihrem Fall kommt es tatsächlich aus einer Datei, aber es gibt kein "Dateiobjekt" in Ihrem Code ).

    ObjectInputStream kann alle Daten rekonstruieren, die zuvor von ObjectOutputStream geschrieben / serialisiert wurden. In diesem Fall können Sie also ein zuvor serialisiertes Objekt vom Typ John . Da die Serialisierung nur für einige Java-Typen (Primitive und Implementoren von Serializable ) funktioniert, kennt sie Ihre spezifische Klasse John nicht. Aber weißt du, vorher hast du ein John Objekt serizalisiert, also kannst du sicher von Object nach John umwandeln und es einer lokalen Variable zuweisen.

  4. Was sind die Alternativen der Serialisierung oder Persistenz der Daten in Java? Ich möchte nicht, dass die Daten als Byte-Stream in die Datei gelangen.

    Sie können sich andere Serialisierungs- / Marshalling-Ansätze wie XStream , JSON oder rollen Sie Ihre eigenen (komplex, nur das tun, wenn Sie einen guten Grund haben). Die meisten davon werden sich als komplexer erweisen als die eingebaute Serialisierung, also stellen Sie sicher, dass Sie einen guten Grund haben, nicht nur "itno file as byte stream" zu schreiben.

Philipp Reichart 04.09.2011 17:04
quelle
1

1) Um sicherzustellen, dass alle möglichen gepufferten Bytes geschrieben werden. Siehe java.io.OutputStream.flush () .

2) Nicht sicher, was Sie meinen, aber Aufrufe von close () sollten in einen finally-Block gestellt werden, um sicherzustellen, dass die Ressource geschlossen ist. Schnell Google enthüllt - Artikel .

3) Sie lesen kein Dateiobjekt. Sie lesen ein zuvor serialisiertes Java-Objekt aus einer Datei. Hoffentlich wird dieses Objekt vom Typ John sein, sonst erhalten Sie eine ClassCastException. Es wird vom Typ John sein, wie Sie zuvor "oos.writeObject (myObj)" genannt haben, wobei myObj vom Typ John ist.

4) Google zum Serialisieren von Java-Objekten. Es gibt viele Bibliotheken zum Serialisieren von Java-Objekten in Binärdateien, XML, JSON, usw. Das JDK selbst kommt mit einem Namen namens XMLEncoder .

    
Paul Grime 04.09.2011 16:59
quelle
1
  1. Sie verwenden flush () , um die internen Puffer (falls vorhanden) zu löschen und alle ausstehenden Daten in das Stream-Ziel zu schreiben (d. h. flush).
  2. close () Methode wird verwendet, um den Stream zu schließen, sobald er aufgerufen wird, können Sie den Stream nicht mehr verwenden.
  3. Nein Sie lesen " ein John-Objekt aus einer Datei ". Ein Objekt vom Typ John sollte zuvor in die Datei serialisiert worden sein.
  4. Es gibt viele Alternativen zur Java-Serialisierung, z. B. XStream . Siehe diese SO-Antwort für Alternativen zur Serialisierung .
Suraj Chandran 04.09.2011 16:56
quelle
1
  1. wann man flush verwenden soll:

Flush-Funktion ist, das Java-Programm explizit aufzufordern, etwas in die Platte zu schreiben, was bedeutet, IO zu machen. Sagen wir, wenn wir einen bufferedOutputStream verwenden, wenn wir schreiben ("etwas"), wird es im Puffer gespeichert, aber noch nicht auf der Festplatte. Wenn Sie flush aufrufen, werden die Inhalte in Ihrem Puffer auf die Festplatte geschrieben. Normalerweise müssen Sie den Flush nicht selbst aufrufen, da er IO erfordert und die Geschwindigkeit verringert. Der Stream wird automatisch gelöscht, wenn der Puffer voll ist. Sofern Sie nicht möchten, dass einige Inhalte auf die Festplatte aktualisiert werden, können Sie flush verwenden.

  1. Sorry, habe deine Frage nicht verstanden? welche Punktzahl?

  2. Dies ist, was Serialisierung tut, erlaubt es Ihnen, ein Objekt in Ihrem Dateisystem zu speichern und es zurück zu bekommen. Sie lesen den Byte-Stream und konvertieren ihn zurück in das Objekt.

  3. Es gibt viele Möglichkeiten (XML, Datenbank, TXT-Datei), schreiben Sie Ihr eigenes Format, um Ihre Daten in einer lokalen Datei zu speichern, oder speichern Sie sie in einer Datenbank. Lass mich dein Beispiel Johannes hier verwenden. Es hat Namen und Abteilungsattribute. Sie können eine Formatausgabe schreiben, die eine John-Instanz verwendet, und die folgenden Schritte ausführen.

    outputStream.write ("Klasse John \ n"); outputStream.write ("toString:" + Instanz + "\ n"); outputStream.close ();

Dann speichert es als lokale TXT-Datei, die Sie öffnen und lesen können.

    
ausgoo 04.09.2011 17:07
quelle

Tags und Links