だから、私は、ファイルに3つのlong型を保存しようとしていますが、それは私がバイト配列にし、それらの保存、それらを多くのデータ変換されますので。それらを保存するための私の現在の方法:
try (FileOutputStream output = new FileOutputStream(path, true)) {
//Put the data into my format
byte[] data = new byte[24];
main.getLogger().log(Level.INFO, "Saving most sig bits");
System.arraycopy(ByteUtils.longToBytes(uuid.getMostSignificantBits()), 0, data, 0, 8);
System.arraycopy(ByteUtils.longToBytes(uuid.getLeastSignificantBits()), 0, data, 8, 8);
System.arraycopy(ByteUtils.longToBytes(player.getTokens()), 0, data, 16, 8);
//Write data in the format
output.write(data);
}
longToBytes方法:
private static ByteBuffer buffer = ByteBuffer.allocate(8);
public static byte[] longToBytes(long x) {
System.out.println(x);
buffer.putLong(0, x);
return buffer.array();
}
バイト配列をファイルに保存されますが、最初のバイトは切り捨てられます。longToByesでprint文は8三回を印刷します。
元long型は以下のとおりです。
-9089798603852198353、-5339652910133477779、5992
私はバイト配列を印刷する場合は、私が得ます:
-127、-38、-116、84、97、-116、78、47、-75、-27、-67、-8、11、-100、-2、109、0、0、0、0、 0、0、23、104(24バイト)
しかし、私は参照ファイルに:23バイト(最初のボックスであるÚŒTaŒN/μå½ø(VT記号)œþm(NUL)(NUL)(NUL)(NUL)(NUL)(NUL)(ETB)時間で表示されません。メモ帳++)
しかし、私は使用してそれを読めば、
bytes = IOUtils.toByteArray(new FileReader(file));
そうですか:
64、-38、-116、84、97、-116、78、47、-75、-27、-67、-8、11、-100、-2、109、0、0、0、0、0 、0、23、104(24バイト)
-127何とか64に置き換えられています。
私はところでそれを印刷するために「」でバイトをCONCAT。
使用しないでくださいFileReader
ファイルからの生のバイトを読み取ること。使用FileInputStream
代わりに。
問題はFileReader
、それが読み込むでchars
はない、bytes
いくつかの文字エンコーディング(デフォルト1何も指定しなかった場合)を使用してバイトを復号化するために試みることによって、ファイルから、。
bytes = IOUtils.toByteArray(new FileInputStream(file));
別の方法としては、使用することができるDataOutputStream
出力ストリームに長い直接書き込むと使用するためにDataInputStream
、入力ストリームから読み取ります。
try (DataOutputStream out = new DataOutputStream(new FileOutputStream(file))) {
out.writeLong(uuid.getMostSignificantBits());
out.writeLong(uuid.getLeastSignificantBits());
out.writeLong(player.getTokens());
}
try (DataInputStream in = new DataInputStream(new FileInputStream(file))) {
long uuidMSB = in.readLong();
long uuidLSB = in.readLong();
long tokens = in.readLong();
}