Java 文件到字节[]的读取不正确

Java 文件到字节[]的读取不正确,java,java-io,Java,Java Io,我正在保存/读取字节数组。当我打印保存的字节时,它们都是正确的值,但当我读取它们时,在保存的每个字节之间有3个随机负数,在字节末尾有一堆额外的随机值,所有负数都消失了 阅读代码: byte[] tmpData = new byte[(int) file.length()]; try { tmpData = IOUtil.readFully(file); } catch (IOException e) { e.printStackTrace(); } IOUtil.readFul

我正在保存/读取字节数组。当我打印保存的字节时,它们都是正确的值,但当我读取它们时,在保存的每个字节之间有3个随机负数,在字节末尾有一堆额外的随机值,所有负数都消失了

阅读代码:

byte[] tmpData = new byte[(int) file.length()];
try {
    tmpData = IOUtil.readFully(file);
} catch (IOException e) {
    e.printStackTrace();
}
IOUtil.readFully

public static byte[] readFully(File file) throws IOException {
    Checks.notNull(file, "File");
    Checks.check(file.exists(), "Provided file does not exist!");
    InputStream is = new FileInputStream(file);
    Throwable var2 = null;

    byte[] var8;
    try {
        long length = file.length();
        if (length > 2147483647L) {
            throw new IOException("Cannot read the file into memory completely due to it being too large!");
        }

        byte[] bytes = new byte[(int)length];
        int offset = 0;

        int numRead;
        for(boolean var7 = false; offset < bytes.length && (numRead = is.read(bytes, offset, bytes.length - offset)) >= 0; offset += numRead) {
            ;
        }

        if (offset < bytes.length) {
            throw new IOException("Could not completely read file " + file.getName());
        }

        is.close();
        var8 = bytes;
    } catch (Throwable var12) {
        var2 = var12;
        throw var12;
    } finally {
        $closeResource(var2, is);
    }

    return var8;
}
读取字节: 10, 0, 10, 0, 10, 0, 10, 0, 10, 28, 10, 1, 10, 1, 10, 28, 10, 2, 10, 1, 10, 36, 10, 1, 10, 1, 10, 31, 10, 0, 10, 2, 10, -17, -65, -65, 10, 0, 10 文件中的数据(使用记事本++打开) 空白行,0,0,0,0,28,1,1,28,2,1,$,1,1,31,0,2,0,2
由于某些原因,前面没有写入文件的负数被读取。

只需使用标准库(
import java.nio.file.Files;


请编辑您的问题,使其包含一个可由其他人编译和测试的问题,该问题表明文件中存在存储或从您的代码中读取的随机字节。请记住,
Writer
用于写入字符/文本,而不是用于写入“二进制”数据。您可能想使用
FileOutputStream
对象将“二进制”数据写入文件。我自己检查了该文件,它看起来,FileOutputStream可能会修复负片的不足,但读取如何?读取原则上没有错,但在某种意义上它需要与写入对称,所以实际上要写入普通字节(例如
文件。写入(路径,字节)
)因为这就是你正在阅读的内容。读写器是为文本设计的,所以二进制数据可能会被使用的字符编码所破坏。文件没有改变任何东西,仍然输出10,0,10,10,10,0,0,10,28,10,1,10,1,10,28,10,2,10,1,10,36,10,1,10,1,10,10,10,10,-17,-65,10,0,0,10,@Big_Bad\E确保您正在写入的数据是
byte[]
而不是
int[]
并使用
文件写入。写入
BufferedWriter writer = new BufferedWriter(new FileWriter(path, false));
int[] data = new int[] { 19,0,0,0,0,28,1,1,28,2,1,36,1,1,31,0,2,-1,0,2 }
for(int bytes : data) { writer.write(bytes); }
byte[] tmpData = Files.readAllBytes(file.toPath());
Files.write(file.toPath(), bytes);