字节从文件中读取错误?

Big*_*d_E 5 java

因此,我试图将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);
                }
Run Code Online (Sandbox Code Playgroud)

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();
}
Run Code Online (Sandbox Code Playgroud)

字节数组已保存到文件,但第一个字节被截断。longToByes中的print语句将打印8次三遍。

原始多头是:

-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个字节)

但是在文件中我看到:ÚŒTaŒN/ µå½ø(VT符号)–þm(nul)(nul)(nul)(nul)(nul)(nul)(etb)h,它是23个字节(第一个框未显示在记事本++)

但是如果我用

bytes = IOUtils.toByteArray(new FileReader(file));
Run Code Online (Sandbox Code Playgroud)

我懂了:

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。

我用“”将字节连起来以顺便打印一下。

xia*_*.li 5

不要用于FileReader从文件读取原始字节。使用FileInputStream代替。

问题FileReader在于,它试图通过使用某些字符编码对字节进行解码来读取文件,而chars不是bytes从文件中读取(如果未给出则为默认字符)。

bytes = IOUtils.toByteArray(new FileInputStream(file));
Run Code Online (Sandbox Code Playgroud)

或者,您可以用于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();
}
Run Code Online (Sandbox Code Playgroud)