首页 > 解决方案 > 读取 InputStream 字节并写入 ByteArrayOutputStream

问题描述

我有代码块从 InputStream 读取提到的字节数并使用 ByteArrayOutputStream 返回一个字节 []。当我将该 byte[] 数组写入文件时,文件系统上的结果文件似乎已损坏。谁能帮我找出下面代码块中的问题。

public byte[] readWrite(long bytes, InputStream in) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    int maxReadBufferSize = 8 * 1024; //8KB
    long numReads = bytes/maxReadBufferSize;
    long numRemainingRead = bytes % maxReadBufferSize;
    for(int i=0; i<numReads; i++) {
        byte bufr[] = new byte[maxReadBufferSize];
        int val = in.read(bufr, 0, bufr.length);
        if(val != -1) {
            bos.write(bufr);
        }
    }
    if(numRemainingRead > 0) {
        byte bufr[] = new byte[(int)numRemainingRead];
        int val = in.read(bufr, 0, bufr.length);
        if(val != -1) {
            bos.write(bufr);
        }
    }
    return bos.toByteArray();
}

标签: javaiostream

解决方案


我对问题陈述的理解

从ByteArrayOutputStream中的给定InputStream中读取字节数。 最后,返回一个字节数组

主要意见

  • 做了大量工作以确保以 8KB 的块读取字节。
    此外,最后剩余的奇数块被单独读取。

  • 还做了很多工作来确保我们从正确的偏移量中读取。

我的看法

  • 除非我们正在读取一个非常大的文件(>10MB),否则我看不到读取 8KB 块的正当理由。

  • 让 Java 库完成维护偏移量并确保我们不会读取超出限制的所有艰苦工作。例如:我们不必给出偏移量,只需一遍又一遍地执行inputStream.read(b),将读取下一个大小为 b.length 的字节数组。同样,我们可以简单地写入outputStream

代码

public byte[] readWrite(long bytes, InputStream in) throws IOException {
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    byte[] buffer = new byte[(int)bytes];

    is.read(buffer);
    bos.write(buffer);

    return bos.toByteArray();
}

参考

关于 InputStreams
字节数组到人类可读格式


推荐阅读