Was wird für Datei-E / A in Java bevorzugt? [geschlossen]


8

Von den dreien

  • BufferedReader / Writer
  • Binäre Streams
  • Kanäle

  • 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

    Antworten:


    18

    java.io verwendet, Streamswährend java.nio verwendet Channelsund 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:

    • Dateien können groß, aber nicht groß sein. Es ist möglich, eine ganze Datei in den Speicher zu lesen.
    • Eine Anwendung liest oder schreibt nur aus wenigen Dateien oder Netzwerkverbindungen gleichzeitig, wobei idealerweise jeweils nur ein Stream verwendet wird.
    • Die Anwendung ist sequentiell. Es wird nicht viel tun können, bis es eine Datei gelesen oder geschrieben hat.

    In diesen Situationen ist es besser, java.nio wie folgt zu verwenden:

    • Eine Anwendung, die Hunderte oder Tausende von Verbindungen gleichzeitig bedienen muss.

    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

    https://www.ibm.com/developerworks/java/tutorials/j-nio/

    http://java.dzone.com/articles/java-nio-vs-io


    Ich finde Kanäle einfacher als java.io-Streams.
    Dummy Derp

    7
    Gut für Sie, denn fast jeder (wie ich) sagt, dass das nio-Programmiermodell so kompliziert ist wie das traditionelle Java io.
    Saeed Zarinfam

    4

    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.


    "Wenn Sie E / A nur durch Lesen / Schreiben großer Blöcke ausführen, können die BufferedXxx-Klassen den Durchsatz möglicherweise ein wenig reduzieren." ... Ich verstehe diesen Punkt nicht. Ist es nicht der springende Punkt bei der Verwendung von BufferedXxx, dass Sie E / A nach Blöcken und nicht nach Einzelbyte / Zeichen usw. ausführen und dadurch die Anzahl der Systemaufrufe an den Kernel verringert wird? Können Sie bitte erklären, was genau Sie gemeint haben?
    Geek

    Ich beziehe mich auf die Größe der tatsächlichen readoder writeAnrufe, 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.
    Stephen C

    Ich sehe den Punkt, den Sie gemacht haben. Vielen Dank für das Follow-up. +1.
    Geek

    3

    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.

    Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
    Licensed under cc by-sa 3.0 with attribution required.