【发布时间】:2020-03-21 18:37:13
【问题描述】:
由于我无法控制的原因,我需要解析一个巨大的文件,该文件在文件的开头和结尾都有大量空字节,并且只有一小部分实际上是有效的(最多 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);
}
有没有更好的选择?
编辑:缓冲区中的有效字节对应于一个 XML 文件。
【问题讨论】:
-
文件中间会不会有空字节?我的意思是,在你打到第一个非零字节之后,在你到达最后一个非零字节之前,零字节会出现吗?
-
是的,可能有。
-
多大才算很大?是否保证不超过5kb的数据?
-
您可以做的一件事是不要将整个文件复制到内存中,而是过滤掉缓冲区(至少在开始时,结束时可能会很棘手,如果您知道的话,我想您也可以这样做有效载荷最多只有 5k),而您正在阅读它们。
-
fis.read(没有循环)是否可靠地像那样工作?随时停止复制不是免费的吗?