byte[] als Datei auspacken

Status
Nicht offen für weitere Antworten.

SBS

Aktives Mitglied
Nabend,

ich habe folgenden Code, der mir eine komplette Datei in ein byte[] einliest, klappt anscheinend auch ganz gut...

Code:
protected byte[] readFile(File file)
	{
	    int got = 0;
	    byte read[] = new byte[(int)file.length()];

	    ByteArrayOutputStream bo = new ByteArrayOutputStream();

	    try
	    {
	      FileInputStream fis = new FileInputStream(file);
	      while (got >= 0)
	      {
	        got = fis.read(read);
	        if (got > 0)
	        {
	          bo.write(read, 0, got);
	        }

	      }
	      fis.close();
	      bo.close();

	    }
	    catch (Exception e)
	    {
	    	System.out.println("Fehler beim Dateilesen: "+e);

	    }
	    return bo.toByteArray();
	  }

Jetzt möchte ich dieses Array wieder, als ganze Datei, auspacken - quasi die Funktion umkehren.

So blöd das grad klingt, ich krieg das gedanklich grade nicht hin -.-

Kann mir jemand vielleicht dabei helfen?
Ich möchte hinterher wieder wieder eine funktionsfähige Datei darauskriegen 🙂
 
SBS hat gesagt.:
Jetzt möchte ich dieses Array wieder, als ganze Datei, auspacken - quasi die Funktion umkehren.

So blöd das grad klingt, ich krieg das gedanklich grade nicht hin -.-

Kann mir jemand vielleicht dabei helfen?
Ich möchte hinterher wieder wieder eine funktionsfähige Datei darauskriegen 🙂

Hi,

Also ist ja schön, dass du hier Code einfügst, der eine Datei ausliest, aber ich frage mich ehrlich gesagt was du a) mit auspacken meinst und b) wenn du den Code geschrieben und verstanden hast woran du gerade scheiterst.
Das fehlt mal komplett, du zeigst hier Code der Liest und sagst du willst Hilfe beim Gegenstück. Trotzdem habe ich das Gefühl du willst eher eine Lösung haben.
Was komplett fehlt ist dein Ansatz, was hast du schon versucht? Woran scheiterst du gerade? Was denkst du überhaupt wie man ran gehen könnte? ...

Das sollte man ruhig immer in einen Thread reinnehmen, dann kann man dir viel leichter helfen. Vorallem hast du dann überhaupt erst was davon, weil du dann etwas dazu lernst.

An sich solltest du bei der Arbeit mit Ressourcen (wie Dateien) immer auch Ressourcen-Schutzblöcke verwenden. Diese stellen sicher, dass eine Ressource trotz einem Fehler auch wieder "freigegeben" wird. Öffnest du eine Datei zum lesen, so wird je nach OS die Datei für andere Prozesse zum Schreiben gesperrt oder kann nicht verschoben werden, usw. Tritt bei dir ein Fehler auf, wird dass close() nie erreicht, ganz schlecht.
Deshalb solltest du hier immer Blöcke der Form
Code:
Stream s = new Stream();
try {
  ....
}
finally {
  s.close();
}
verwenden.

Ansonsten solltest du dir erstmal überlegen, was du benötigst um eine Datei zu schreiben?
Also einerseits wäre sicherlich das Ziel ganz gut, sprich die Datei in die geschrieben werden soll und dann brauchst du noch Daten die du schreiben möchtest. Hier also schon die Frage, was für Daten möchtest du überhaupt schreiben? Ich gehe hier einfach mal von einem Array von byte aus.

Das ganze sollten also die Argumente sein, die deine Methode braucht. Die Methode kümmert sich dann nur darum, dass diese Daten in die Datei kommen.
Gut, du hast jetzt irgendwie den Code da unten, hm, erstellt? (kopiert?)
Jedenfalls findest du hier einen FileInputStream und der kann etwas aus einer Datei lesen, was könnte man also verwenden um eine Datei zu schreiben? An dieser Stelle sei doch mal auf die Firma SUN verwiesen, die haben auf ihrer Seite java.sun.com eine Dokumentation, in der man auch das API findet, da sind alle Klassen sehr gut drin erklärt. Da schauen wir uns dann FileInputStream an und finden eine sehr ausführliche Erklärung und ein "see also File, FileDescriptor, FileOutputStream". Na ja, man sieht es hier vielleicht schon, aber FileOutputStream könnte etwas in eine Datei schreiben. Folgst du dem Link bestätigt sich dein Verdacht.
Da findest du dann sogar die Methode write(byte[] b) und siehe da, die schreibt das Array b in den Stream.
So, dass ganze als Code

Code:
protected void writeFile(File file, byte[] bytes) throws IOException {
  OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
  
  try {
    outputStream.write(bytes);
  }
  finally {
    outputStream.close();
  }
}

Das ist jetzt ungetestet, aber grob sollte es so klappen. Jedenfalls solltest du wirklich versuchen das API zu bemühen und ruhig nochmal genauer an den Stellen fragen, wo du etwas nicht richtig verstehst. Für den nächsten Thread dann auch der Tip, erstmal ein wenig selbst nachdenken und die Ansätze posten, dann kann man dir auch bei denen gut helfen! Davon hast du letztlich einfach mehr!

Gruß Der Anmeldeboykottierer
 
Moin, dank, aber ich habe bereits eine Methode die funktioniert,

davon mal abgesehen, den Code habe ich selbst erzeugt, hatte vorher jedoch noch nicht mit einem ByteArrayOutputStream gearbeitet, daher wusste ich nicht ob man das Array zwangsweise wieder mit einem entsprechenden Input Stream auslesen muss - muss man nämlich nicht 🙂
PS: Es war auch schon recht spät gestern 😉
 
@Anmeldeboykottierer

Da hast du dir wirklich wahnsinnig viel Mühe gegeben um einem
Anfänger prinzipielle Vorgehensweisen nahezubringen und dann sowas!

Anmeldeboykottierer hat gesagt.:
Code:
protected void writeFile(File file, byte[] bytes) throws IOException {
  OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(file));
  
  try {
    outputStream.write(bytes);
  }
  finally {
    outputStream.close();
  }
}

Schäm dich! :noe:

Keine Fehlerbehandlung anzugeben ist etwas, was gerade Anfängern
nun wirklich nicht beigebracht werden soll 🙁
 
🙂 joa das hab ich aber schon erkannt, so ein blutiger Anfänger bin ich ja nicht mehr, es ist nur 2 jahre her dass ich das letzte mal mit Java gearbeitet habe, daher machen mir auch einfach Sachen zwischenzeitig Probleme.

btw. Wo genau ist der Unterschied zwischen Fehlerabfangen mit try/catch und dem throws Exception Handling, was ist geeigneter? Was sollte man wann verwenden?
 
Wenn die aufrufenden Methoden über den Fehler informiert
werden müssen, muß man throws verwenden.

Beispielsweise liest du in deinem Programm ein Byte-Array ein.

Code:
fis.read(read);

Die read-Methode selbst muß schon eine Exception
werfen, damit du erkennen kannst, ob ein Fehler
aufgetreten ist.

Den Aufruf von fis.read(read) selbst widerum könntest
du in eine try-catch-Klausel verpacken wobei in der
catch-Klausel ein Fenster mit der Fehlermeldung aufgepoppt
wird oder der Fehler einfach auf System.err oder in eine
Logdatei ausgegeben wird.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben