2010-09-25 6 views
10

Wie kann ich suchen (ändern Sie die Position) von ByteArrayInputStream (java.io)? Es ist etwas so offensichtlich, aber ich kann nirgendwo eine Methode dafür finden (mark/reset ist nicht genug, ich muss die Position irgendwo auf der InputStream setzen).Suche nach einem ByteArrayInputStream mit java.io

Wenn es nicht java.io verwendet getan werden kann, und ich muß java.nio wechseln und ein ByteBuffer verwenden, wie kann ich etwas ähnlich ein DataOutputStream ein ByteArrayOutputStream mit java.nio Verpackung? Ich finde keinen automatisch skalierbaren Puffer.

EDIT: Ich habe einen Weg gefunden zu erreichen, was ich versuche zu tun, aber es ist ein bisschen chaotisch. ImageIO.createImageInputStream erstellt eine ImageInputStream, die genau das ist, was ich will (kann Primitive suchen und lesen). Bei Verwendung von ByteArrayInputStream wird jedoch FileCacheImageInputStream zurückgegeben, was bedeutet, dass das Bytearray in eine Datei kopiert wird, die nur gesucht werden soll.

Dies ist das erste Mal, dass ich versuche, die Java-IO-Klassen zu verwenden, und es war völlig negativ. Es fehlen einige grundlegende (IMO) Funktionen, und es gibt viele Möglichkeiten, dasselbe zu tun (z. B. um Primitive aus einer Datei zu lesen, können Sie entweder RandomAccessFile, DataInputStream + , FileChannel + ByteBuffer und vielleicht sogar mehr).

+0

sehen Sie irgendein Problem mit der Verwendung von 'suchen'? –

+4

@Vilay Mathew: Was 'Suchmethode'? Ich sehe keine auf ByteArrayInputStream. – asdfghjkl

+0

Datei-E/A in Java ist eine riesige Sauerei. Ich bringe es Schülern im ersten Jahr bei und versuche, es einfach zu machen, aber es ist immer ein Punkt der Verwirrung. – Fixee

Antwort

8

Sie würden reset()/skip() verwenden. Ich kann nicht sagen, dass es das schönste API in der Welt, aber es sollte funktionieren:

public void seek(ByteArrayInputStream input, int position) 
    throws IOException 
{ 
    input.reset(); 
    input.skip(position); 
} 

Natürlich, das davon ausgeht, dass niemand mark() genannt hat.

+0

Wenn die Marke nicht aufgerufen wird, dann ist der Standardwert der markierten Position 0, daher ruft das Zurücksetzen den Zeiger auf 0 und dann springt die Funktion den Zeiger auf die angegebene Position –

+0

@SumitKumarSaha: Ja ... Ich bin mir nicht sicher über den Punkt Ihr Kommentar. –

+0

Ich habe nur deine Antwort addiert –

1

Es gibt einen ByteArrayInputStream(byte(), int, int) Konstruktor, der Ihnen einen Eingabestream geben wird, der bis zu einer bestimmten Anzahl von Bytes ab einem bestimmten Offset lesen kann. Sie können dies verwenden, um das Suchen nach einem beliebigen Offset im Stream zu simulieren.

Sie müssen mit der Tatsache umgehen, dass "suchen" gibt Ihnen ein neues Stream-Objekt, und das kann peinlich sein. Bei diesem Ansatz werden jedoch keine Bytes kopiert oder in einer Datei gespeichert, und es sollte sicher sein, die ByteArrayInputStream Objekte nicht zu schließen.

4

Wenn Sie die ByteArrayInputStream schaffen an anderer Stelle passieren, die Klasse erweitern und pos (ein protected Mitglied ByteArrayInputStream) zu manipulieren, wie Sie es wünschen.