Von den dreien
Was ist im realen Leben für Datei-E / A in Java bevorzugter und warum?
Ich bevorzuge Kanäle für Binärdaten, die in eine Datei eingefügt oder aus diesen gelesen werden sollen, sowie BufferedReader / Writer für String-Daten
Von den dreien
Antworten:
java.io verwendet, Streams
während java.nio verwendet Channels
und buffer
, Der wichtigste Unterschied zwischen java.io way und java.nio way besteht darin, wie Daten gepackt und übertragen werden. java.io behandelt Daten in Streams (Byte für Byte). wohingegen java.nio Daten in Blöcken behandelt. Die Verarbeitung von Daten durch den Block kann viel schneller sein als die Verarbeitung durch das (gestreamte) Byte, ist jedoch nicht so einfach wie Streams.
In diesen Situationen ist es besser, java.io wie folgt zu verwenden:
In diesen Situationen ist es besser, java.nio wie folgt zu verwenden:
Sie können die folgenden Links für weitere Informationen sehen:
http://www.skill-guru.com/blog/2010/11/14/java-nio-vs-java-io-which-one-to-use/
http://blogs.oracle.com/slc/entry/javanio_vs_javaio
Was ist im realen Leben für Datei-E / A in Java bevorzugter und warum?
Es sollte eigentlich eher eine Frage der Funktion als der Präferenz sein.
Sie verwenden Readers and Writers für zeichenorientierte Daten (die codiert und decodiert werden müssen), Input / OutputStreams für byteorientierte Daten und Binärströme, wenn die Daten Binärdaten codieren.
Sie verwenden die BufferedXxx-Klassen, wenn Sie E / A für die Granularität eines Zeichens oder Bytes benötigen. Sie sind eine einfache Möglichkeit, um die schwerwiegenden Leistungsprobleme zu vermeiden, die auftreten können, wenn Sie viele Byte-Lese- und Schreib-Systemaufrufe gleichzeitig ausführen.
Wenn Sie E / A nur durch Lesen / Schreiben großer Blöcke ausführen, können die BufferedXxx-Klassen den Durchsatz möglicherweise etwas reduzieren . Sie können entweder einfache Leser / Schreiber / Streams (mit großen char[]
oder byte[]
Puffern) oder Kanäle und XxxBuffer verwenden. Letztere sind möglicherweise schneller, aber die APIs sind umständlicher.
Sie verwenden Kanäle, wenn Sie einen geringen Overhead benötigen und / oder spezielle Aufgaben ausführen, z. B. "Auswählen" aus mehreren Streams, Streuen / Sammeln und Speicherzuordnungsdateizugriff.
Wie Sie sehen können, sind die verschiedenen APIs für verschiedene Zwecke konzipiert. In einigen Anwendungsfällen gibt es Überschneidungen, in anderen ist nur eine API für den Zweck geeignet.
Das Problem bei der Entwicklung einer "Präferenz" für einen E / A-Stil gegenüber einem anderen besteht darin, dass dies zu schlechter Software führt. dh entweder Code, der ineffizient ist, wenn E / A-Effizienz benötigt wird, oder übermäßig kompliziert, wenn E / A-Effizienz kein Problem darstellen sollte.
read
oder write
Anrufe, die eine Anwendung macht. Wenn sie alle groß genug sind, um in ein Byte-Array zu lesen und von diesem zu schreiben, umgehen sie die BufferedXxx-Puffer und ordnen sie direkt Lese- / Schreibaufrufen im zugrunde liegenden Stream zu. In diesem speziellen Fall tragen BufferedXxx-Wrapper nicht zur Leistung bei.
Die Antwort lautet "Es kommt darauf an" - Gepufferte, Streaming-, blockierende und nicht blockierende E / A werden je nach gewünschter Parallelität, Durchsatz und anderen Leistungsmerkmalen für unterschiedliche Zwecke verwendet.