Wie Erklären ein Byte-Array der Unendlichen Größe/Dynamische in Java?
Sage ich ein byte-array zurück, das ist der unbekannte Größe für mich, als es hält an der Aktualisierung, so wie kann ich erklären das byte-array der unendlichen Größe/variable Größe?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Arrays in Java nicht dynamisch sind. Sie können verwenden Liste statt.
Durch autoboxing-feature können Sie frei hinzufügen, entweder Byte-Objekte oder primitive bytes in dieser Liste.
new
können immer noch ruinieren Ihren Tag, aber.byte[]
. Mit Boxen, die Sie noch brauchen, eine vollständige Referenz (die word-Größe: 32 oder 64 bit auf den meisten Architekturen) für jedes element, anstelle von 8 bits pro element. IOW, die Sie benötigen 4x zu 8x so viel Platz. Kann ignoriert werden, für einige Anwendungen, aber für andere, es tut weh, eine Menge.Kann nicht deklarieren Sie ein array von unendlicher Größe, wie erforderlich wäre unendlich Speicher. Darüber hinaus werden die Zuordnung der Anrufe mit zahlen umzugehen, nicht unendliche Mengen.
Können Sie reservieren einen byte-Puffer, der die Größe auf Nachfrage. Ich glaube die einfachste Wahl wäre ein
ByteArrayOutputStream
.ByteBuffer
hat ein API, das macht die manipulation der Puffer einfacher, aber Sie würden es schaffen müssen, um die resize-Funktionalität selbst. Der einfachste Weg wird sein, weisen Sie eine neue, größere array kopieren der alten Inhalte, und tauschen Sie die neuen Puffer für den alten.Anderen Antworten erwähnt habe, mit einem
List<Byte>
einiger Sortieren. Es ist erwähnenswert, dass, wenn Sie erstellen eine Reihe vonnew Byte()
Objekte, Sie können dramatisch erhöhen Sie den Speicherverbrauch.Byte.valueOf
umgeht dieses problem, aber Sie haben, um sicherzustellen, dass es konsequent verwendet, die im gesamten code. Wenn Sie beabsichtigen, diese Liste verwenden, in vielen Orten, ich könnte prüfen, schreiben eine einfacheList
Dekorateur, die Praktikanten alle Elemente. Zum Beispiel:Dies ist keine vollständige (oder sogar getestet) Beispiel, nur etwas mit zu beginnen...
toByteArray()
!Definieren Sie ein bytearray mit unterschiedlicher Länge verwenden Sie einfach die apache
commons.io.IOUtils
Bibliothek statt Zuweisung der manuellen Länge wieKönnen Sie geben Sie Ihre Eingabe-stream
IOUtils
- Funktion, die führt einen read-Funktion auf dieser inputstream also byte-array die genaue Länge der bytes, wie erforderlich.ex.
Chaos.
Ihre beste Wette ist die Verwendung einer ArrayList. Als es ändert, wie Sie es ausfüllen.
List<Byte> array = new ArrayList<Byte>();
Ist die offensichtliche Lösung wäre die Verwendung einer ArrayList.
Aber das ist eine schlechte Lösung, wenn Sie Leistung oder gezwungen sind, im Speicher, da es nicht wirklich speichern von bytes, sondern Byte (Objekte).
Für jede echte Anwendung, die Antwort ist einfach : Sie haben, sich selbst zu verwalten das byte-array mithilfe von Methoden, die machen es wachsen, wie es notwendig ist. Sie können durch Einbettung in eine bestimmte Klasse bei Bedarf :
ArrayList<Long>
?ByteArrayOutputStream wird erlauben, für das schreiben auf ein dynamisches byte-array. Aber Methoden wie das entfernen, ersetzen und einfügen sind nicht verfügbar. Man extrahiert das byte-array, und dann Bearbeiten Sie es direkt.
Verwenden Sie ein ArrayList jeder Subtyp von Liste
Den verschiedenen Implementierungen der Liste ermöglichen es Ihnen, zu tun, verschiedene Dinge auf der Liste (z.B. verschiedene traversal-Strategie, unterschiedliche Leistung etc)
Anfänglichen Kapazität von ArrayList ist 10. Sie können es ändern, indem ArrayList(5000).
ArrayList verdoppeln Ihre Größe, wenn nötig (es wird neues array und kopiere die alte auf die neue).
Ich würde zwicken leicht, anderer Leute Antworten.
Erstellen Sie eine LargeByteArray-Klasse verwalten Sie Ihre array. Es werden get-und set-Methoden, etc, was auch immer Sie brauchen.
Hinter den kulissen, dass die Klasse lange halten die aktuelle Länge und die Verwendung einer ArrayList zur Speicherung der Inhalte des Arrays.
Ich würde wählen, um die speichern byte[8192] oder byte[16384] array in der ArrayList. Das gibt einen vernünftigen trade-off in Bezug auf Größe, verschwendet, und reduzieren die Notwendigkeit für die Größe.
Können Sie auch das array 'sparse' nur ie Zuweisung der Liste.get(index/8192) Eintrag, wenn es eine nicht-null-Wert gespeichert, dass im Feld.
Solche Struktur kann Ihnen deutlich mehr Speicherplatz, in einigen Fällen.
Einer anderen Strategie, die Sie verwenden können, ist die Komprimierung des byte [] - Boxen nach dem schreiben und Dekomprimieren, bevor Sie Lesen (verwenden Sie eine LRU-cache für das Lesen) zu können, speichern Sie zweimal oder mehr als das verfügbare ram sein... Aber das hängt von der Komprimierung Strategie.
Danach können Sie den Blick auf paging-einige Boxen auf die Festplatte...
Das ist als in der Nähe einer unendlichen Reihe, wie ich Sie 😉
Können Sie Gebrauch machen von IOUtils aus dem Stück, als Prashant schon gesagt.
Hier ein kleines Stück von ihm, das kann die Aufgabe zu lösen (Sie müssen IOUtils.toByteArray):