package main;importjava.awt.image.DataBufferByte;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.InputStream;importjava.io.OutputStream;importjavax.imageio.ImageIO;publicclassMain{publicstaticvoidmain(String[] args){try(OutputStream outputStream =newFileOutputStream("C:\\Users\\user\\Desktop\\image.txt")){byte[] components =((DataBufferByte)ImageIO.read(newFile("C:\\Users\\user\\Desktop\\image.png")).getRaster().getDataBuffer()).getData();//Aus einem Bild das byte-array erstellen.
outputStream.write(components);//Die bytes als String in eine Datei schreiben.}catch(FileNotFoundException e){
e.printStackTrace();}catch(IOException e){
e.printStackTrace();}try(InputStream inputStream =newFileInputStream("C:\\Users\\user\\Desktop\\image.txt")){byte[] components =newbyte[inputStream.available()];for(int i =0, b;(b = inputStream.read())!=-1;)
components[i]=Byte.parseByte(Byte.toString((byte) b));//Einzelne bytes, die wie Strings behandelt werden, sollen zu bytes gemacht werden, sodass das gleiche array entsteht.}catch(FileNotFoundException e){
e.printStackTrace();}catch(IOException e){
e.printStackTrace();}}}
Wie schaffe ich es bytes, die als Strings gespeichert wurden, so einzulesen, dass sie wieder diesen gleichen Werten entsprechen? Ich habe keine Ahnung wie ich sowas machen soll.
Also du hast in einem Array als Byte 1 2 3 4 stehen, schreibst '1' '2' '3' '4' in eine Datei und möchtest nun aus diesen Zeichen das Array rekonstruieren?
read() liefert ein Byte unsigned in einem int zurück, also ein Wert von 0 bis 255.
Da ein char aus zwei Bytes besteht, müsstest du zwei Bytes einlesen und diese mit dem Shift Operator zu einem char casten. Daraus erstellst du einen String und parst diesen zurück in ein byte.
Aber dein Code tut etwas anderes:
Er ließt ein Bild ein, erstellt ein byte Array daraus, schreibt dieses Byte Array nicht als String, sondern einfach als bytes, wie sie im Array sind und ließt sie dann sehr kompliziert wieder ein.
PS: Zum Einlesen benutzt man eher eine while-Schleife, da du nicht weißt, wie groß die Datei ist.
Ich hatte mir das so gedacht:
Jedes Pixel eines Bildes soll in dieser Liste mit 4 Werten vorkommen. Tut es ja auch.
Diese Werte sind dann immer als byte in der Liste. Z.B. "-1 0 0 0 ..."
Mit diesen Werten kann ich das Bild erstellen (zu unsigned ints "a: 255 b: 0 g: 0 r: 0...")
Mit als String speichern, meine ich einfach, dass die bytes jeweils durch ein Zeichen repräsentiert werden und so gespeichert. In diesem Fall, finge die Datei dann so an: "ÿ " (3 Leerzeichen)
Wenn ich die Datei einlese, will ich diese Zeichen in die dafür stehenden Werte umdrehen.
Also aus "ÿ " soll "-1 0 0 0" werden und so in die Liste kommen.
Die Zeichen sind nur eine Entsprechung der Bytes, nicht die Bytes selber.
So ist z.B. 01100001 = 97 entspricht a.
Was du einließt, ist aber nicht das a, sondern 01100001 = 97. Also musst du nur das int in ein byte verwandeln.
Ok, ich denke das habe ich verstanden.
Nun das Umwandeln:
Wenn ich die ints, zu bytes gecastet ausgebe, bekomme ich die richtigen Ergebnisse "255 0 0 0" -> "-1 0 0 0"
Aber wenn ich die gecastet in der Liste haben will, wird immer 0 eingetragen.
Das muss irgendwas mit den Werten von read() zu tun haben, da ich das schon mit eigenen Werten ausprobiert habe.
Ich muss mir mal dringend etwas suchen, das mir diese bytes richtig erklärt. Anscheinend habe ich mir die anders vorgestellt.