出于我无法控制的原因,我需要解析一个巨大的文件,该文件的开头和结尾都有一个空字节的范围,而实际上是一小部分有效(最多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);
}
还有其他更好的选择吗?
我认为您的解决方案相当有效。实际上,您正在从数组的两端查找前1的索引,然后创建一个数据子数组。
为什么您觉得需要改进算法?
谨慎:过早的优化是编程中所有邪恶(或至少是大多数邪恶)的根源,quote by Donald Knuth