2012-12-01 14 views
5

Der folgende Code aus dem Java Web Start Kapitel des Kern java Volumens 1.Was ist der Unterschied zwischen InputStream und ByteArrayInputStream?

 ByteArrayOutputStream out = new ByteArrayOutputStream(); 
    PrintStream printOut = new PrintStream(out); 
    printOut.print(panel.getText()); 
    //panel.getText() return a String 
    InputStream data = new ByteArrayInputStream(out.toByteArray()); 
    FileSaveService service = (FileSaveService) ServiceManager 
      .lookup("javax.jnlp.FileSaveService"); 
    service.saveFileDialog(".", new String[] { "txt" }, data, "calc.txt"); 

Es vier Objekte erstellt extrahiert wird, wird der Strom dreimal umgeleitet. Gibt es andere Methoden zum Schreiben von Daten in eine Datei mithilfe von jnlp api? Was ist der Unterschied zwischen InputStream und ByteArrayInputStream?

+3

Computer sind sehr schnell. Nichts ist jemals "schrecklich", es sei denn, man muss es sehr oft oder sehr leistungsfähig machen. – JimN

+0

Sie sollten den Titel ändern: es ist Daten nicht Datum. Dann wäre es schrecklich, einen 8-Byte-Zeitstempel in eine Datei zu schreiben. – AlexWien

+0

Ich meine, es ist zu komplex für einen Programmierer, nicht für den Computer. Und ich möchte wissen, ob es notwendig ist, auf diese Weise zu programmieren. – scobur

Antwort

4

ByteArrayInputStream und ByteArrayOututStream sind in-memory-Implementierungen, die verwendet werden, wenn Sie die Daten vorübergehend streamähnlich speichern und dann an anderer Stelle wieder ausgeben möchten.

Zum Beispiel nehmen wir an, Sie haben eine Methode, die ein Eingangsstrom als Parameter erwartet, zB

public Document parseXml(InputStream in) // build an XML document from data read in 

aber Sie möchten den Inhalt senden, einen String zu sagen. Dann würden Sie eine ByteArrayInputStream verwenden und füllen Sie sie mit dem Inhalt Ihrer Zeichenfolge und übergeben Sie die ByteArrayInputStream an die Methode.


Ein Beispiel für eine ByteArrayOutputStream Verwendung könnte sein, wenn eine Methode in einen Ausgabestream schreibt, aber Sie möchten nur das Ergebnis erfassen und direkt abrufen.

0

InputStream ist die gemeinsame Schnittstelle für Eingabeströme.
FileInputStream und ByteArrayInputStream implementieren beide diese Schnittstelle.

0

InputStream ist eine abstrakte Klasse und alle Klassen, die davon ausgehen, stellen einen Eingabestrom von Bytes dar. Anwendungen, die eine Unterklasse von InputStream definieren müssen, müssen immer eine Methode bereitstellen, die das nächste Byte der Eingabe zurückgibt. wo ein ByteArrayInputStream einen internen Puffer enthält, der Bytes enthält, die aus dem Stream gelesen werden können. Ein interner Zähler verfolgt das nächste Byte, das durch die Lese-Methode geliefert werden soll.

von Polymorphismus Konzept Da Sie ein Kind zum Vater

InputStream data = new ByteArrayInputStream(out.toByteArray()); 

dann, wenn wir nennen data.read(), die meinen wir fordern Methode ByteArrayInputStream zu lesen, weil ByteArrayInputStream bietet Implementierung von Lese zuweisen kann wie

() wo in der InputStream-Methode read() ist abstrakt.