繁体   English   中英

Java:如何“修剪”字节数组?

[英]Java: How to “trim” a byte array?

所以我有一些代码从文件读取一定数量的字节并返回结果字节数组(这基本上用于分块文件通过网络发送(最终)base64编码的ascii文本)。

它工作正常,除了生成文件的最后一个块时,它不是一个完整的块。 因此,生成的字节数组不满。 但是,它是一个恒定的大小,这意味着文件被重新组装,有一大堆额外的数据(可能是0)附加到末尾。

我怎样才能使文件的最后一个块的byte []真正只包含它需要的数据? 代码如下所示:

 private byte[] readData(File f, int startByte, int chunkSize) throws Exception {
    RandomAccessFile raf = new RandomAccessFile(f, "r");
    raf.seek(startByte);
    byte[] data = new byte[chunkSize];
    raf.read(data);        
    raf.close();
    return data;
}

因此,如果chunkSize大于文件中的剩余字节,则返回一个完整大小的byte [],但它只有半满的数据。

您必须检查RandomAccessFile.read()的返回值以确定读取的字节数。 如果它与chunkSize不同,则必须将数组复制到较小的数组并返回。

private byte[] readData(File f, int startByte, int chunkSize) throws Exception {
    RandomAccessFile raf = new RandomAccessFile(f, "r");
    raf.seek(startByte);
    byte[] data = new byte[chunkSize];
    int bytesRead = raf.read(data);
    if (bytesRead != chunkSize) {
         byte[] smallerData = new byte[bytesRead];
         System.arraycopy(data, 0, smallerData, 0, bytesRead);
         data = smallerData;
    }
    raf.close();
    return data;
}

RandomAccessFile.read()返回读取的字节数,因此您可以根据需要复制数组:

private byte[] readData(File f, int startByte, int chunkSize) throws Exception {
    RandomAccessFile raf = new RandomAccessFile(f, "r");
    raf.seek(startByte);
    byte[] data = new byte[chunkSize];
    int read = raf.read(data);
    raf.close();
    if (read == data.length) return data;
    else
      return Arrays.copyOf(data, read);
}

如果您使用的是Java 6之前的版本,那么您需要自己实现Arrays.copyOf

byte[] r = new byte[read];
System.arraycopy(data, 0, r, 0, read);
return r;

您还可以使用文件的大小来计算剩余的字节数。

private byte[] readData(File f, int startByte, int chunkSize) throws Exception {
    RandomAccessFile raf = new RandomAccessFile(f, "r");
    raf.seek(startByte);
    int size = (int) Math.min(chunkSize, raf.length()-startByte);
    byte[] data = new byte[size];
    raf.read(data);
    // TODO check the value returned by read (throw Exception or loop)
    raf.close();
    return data;
}

这样您就不会创建其他阵列而不需要副本。 可能不是一个很大的影响。
IMO的一个重点:检查read返回的值,我认为它可以小于剩余的字节数。 javadoc说:

读取的字节数最多等于b的长度

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM