Fehlerbehebung beim Skript: Dateistreaming zur Lösung des 'Array-Länge zu groß'-Fehlers bei Dateien über 2GB? Groovy Script?

Quetschtuete  30.09.2024, 02:03

Wo ist genau dein Problem?

OmarLu 
Beitragsersteller
 30.09.2024, 15:35

If all my files are over 2GB, it doesn't work. I need to edit the file to stream the files

2 Antworten

Ich versuche, Dateistreaming zu verwenden, anstatt die gesamte Datei auf einmal in den Speicher zu laden.

Tust Du nicht! getBytes() wirft den ganzen Stream in ein Array. Lösche diese Funktion.

getZipBytes() sollte statt bytes[] einen OutputStream mapStream bekommen. Aus

zipOutput << mapBytes

wird dann einfach

zipOutput << mapStream

(siehe Groovy Doku).


ralphdieter  30.09.2024, 13:26
Lösche diese Funktion.

Ich sehe jetzt, dass getBytes() doch etwas mehr tut. Schreibe sie also so um, dass sie einen InputStream statt byte[] liefert. Falls MapWriter keine geeignete Methode dafür hat, definiere out als BufferedWriter auf eine temporäre Datei und gib das Ergebnis als InputStream zurück:

Path tempFile = Files.createTempFile("map-", null)
BufferedWriter out = new BufferedWriter(tempFile, 4*1024)
...
out.close()
return Files.newInputStream(tempFile);

Den InputStream solltest Du nach Gebrauch in getZipBytes() schließen. Sauberer wäre es, in getBytes() nur einen Path zurückzugeben und das Öffnen und Schließen komplett in getZipBytes() zu erledigen.

ralphdieter  30.09.2024, 15:17
@ralphdieter

Ich habe den Code nur so hingeklatscht. Wenn etwas nicht klappt, frag einfach nach (hier oder auf GitHub).

Es ist ohnehin nicht ratsam ganze Dateien einfach in nen Array zu laden, wenn sie groß sind. Soweit so gut. Aber was ist denn jetzt die eigentliche Frage?


OmarLu 
Beitragsersteller
 17.10.2024, 02:55

Ich habe das gelöst. Danke für deine Antwort.