在Java中,如何从字节数组的开始和结尾有效地修剪0'

问题描述 投票:1回答:1

出于我无法控制的原因,我需要解析一个巨大的文件,该文件的开头和结尾都有一个空字节的范围,而实际上是一小部分有效(最多5 KB)。这是我想出的代码:

@NonNull
public static byte[] readFileToByteArray(@NonNull File file, boolean bTrimNulls) throws IOException {
    byte[] buffer = new byte[(int) file.length()];
    FileInputStream fis = null;
    try {
        fis = new FileInputStream(file);
        if (fis.read(buffer) == -1) {
            throw new IOException("EOF reached while trying to read the whole file");
        }
    } finally {
        closeSafely(fis);
    }
    if (!bTrimNulls) {
        return buffer;
    }
    int nFirstValidByteIndex = 0;
    for (int i = 0; i < buffer.length; i++) {
        if (buffer[i] != 0) {
            nFirstValidByteIndex = i;
            break;
        }
    }
    int nLastValidByteIndex = 0;
    for (int i = buffer.length - 1; i > 0; i--) {
        if (buffer[i] != 0) {
            nLastValidByteIndex = i;
            break;
        }
    }
    return copyBufferRange(buffer, nFirstValidByteIndex, nLastValidByteIndex + 1);
}

还有其他更好的选择吗?

java arrays parsing trim
1个回答
0
投票

我认为您的解决方案相当有效。实际上,您正在从数组的两端查找前1的索引,然后创建一个数据子数组。

为什么您觉得需要改进算法?

谨慎:过早的优化是编程中所有邪恶(或至少是大多数邪恶)的根源quote by Donald Knuth

© www.soinside.com 2019 - 2024. All rights reserved.