Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Zahlen als Bytes in eine Datei speichern, daraus wieder auslesen
Wie in dem Subject kurz beschrieben, muss ich Zahlen in eine Datei als Bytes speichern und diese wieder auslesen spaeter. Ich hatte mir dafuer erst ein kurzes Beispiel schreiben wollen.
Also in die Datei schreiben:
Java:
FileOutputStream writer;
try {
writer = new FileOutputStream(filePath);
for (int i =0;i < 2000000-1;i+=2) {
writer.write(BigInteger.valueOf(i).toByteArray()); //Das hier falsch??
writer.write(BigInteger.valueOf(i+1).toByteArray()); //Das hier falsch??
}
writer.flush();
writer.close();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
Damit ich das machen kann, muss ich ja erst mal die ints in Bytes umwandeln, ich dachte das soll das:
BigInteger.valueOf(i).toByteArray()) uebernehmen, oder ist das FALSCH?
Weil wenn ich dann die Datei wieder einlese, ganz einfach mit:
Java:
try {
FileInputStream st = new FileInputStream(filePath;
BufferedInputStream bufin = new BufferedInputStream(st);
int length;
byte[] eineZahl = new byte[2];
try {
while ((length = bufin.read(eineZahl)) != -1) {
for (int i = 0; i < length; i++) {
System.out.print(eineZahl[i] + " ");
}
System.out.println();
}
st.close();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
} catch (FileNotFoundException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}
kommen nur zahlen von 1 bis 128 raus und dann negative zahlen :S
ich glaube das Problem liegt darin, dass du vergessen hast die Datentypen zu beachten und BigInteger macht da auch noch Probleme.
Das Problem mit den Datentypen:
Primitive Datentypen bestehen mehr als nur aus einem Byte (hier ein Beispiel):
byte: 8 Bit -> 1Byte
int: 32 Bit -> 4Byte
long: 64 Bit -> 8Byte
Wenn du jetzt z.B. eine int in ein byte-Array wandelst und dieses abspeicherst, werden 4Byte gespeichert. Du gibst jedes Byte einzeln aus. D.h. du müsstest die 4 aufeinanderfolgenden Bytes auslesen, zusammensetzen und dann ausgeben.
BigInteger:
Beim erzeugen der byte-Arrays mit BigInteger macht dir jedoch auch noch BigInteger selbst Probleme.
Aus der JavaInsel:
Mit der Klasse BigInteger ist es uns möglich, beliebig genaue Zahlen anzulegen, zu verwalten und damit zu rechnen. Die BigInteger-Objekte werden dabei immer so lang, wie die entsprechenden Ergebnisse Platz benötigen (engl. infinite word size). ...
D.h. wenn du das Array abspeicherst, weißt du später nicht wieviele bytes BigInteger für die Zahl gebraucht hat. Die Zahl könnte so 4 Byte oder vielleicht 8 Byte groß sein. Wenn du nun mehrere Zahlen in byte Arrays wandelst und diese hintereinander schreibst, weißt du nicht welche bytes zusammengehören bzw. wo die eine Zahl aufhört und die andere anfängt.
Übrigens -> 1-128 und die negativen Zahlen:
Das liegt am Zweierkomplement. (siehe hier)
Kleiner Tipp: Benutz die Klassen DataInputStream und DataOutputStream. Diese enthalten Methoden "writeInt", "writeFloat", ect.. sowie die dazugehörigen "readInt", "readFloat", etc.. Beispiel hierfür:
Java:
DataOutputStream dout;
try {
dout= new DataOutputStream(new FileOutputStream(filePath));
for (int i =0;i < 2000000-1;i+=2) {
dout.writeInt(i); //Das hier falsch??
dout.writeInt(i + 1); //Das hier falsch??
}
dout.close();
} catch (IOException ex) {
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}