我想将原始数据块保存到文件中,然后逐个读取这些块。除了以下疑问之外,这没什么大不了的:
用作分隔符的确切字节数,即识别一个块的结尾和下一个的开头?鉴于块数据也可能通过随机机会包含这样的字节序列。
注意:块大小可变,包含随机数据。它们实际上是jpeg
张。
答案 0 :(得分:3)
您可以先将块的长度写为固定大小的值,例如:一个4字节的整数,后跟数据本身:
public void appendChunk(byte[] data, File file) throws IOException {
DataOutputStream stream = null;
try {
stream = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(file, true)));
stream.writeInt(data.length);
stream.write(data);
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
// ignore
}
}
}
}
如果您以后必须从该文件中读取块,则首先读取第一个块的长度。您现在可以决定是否读取块数据,或者是否跳过它并继续下一个块。
public void processChunks(File file) throws IOException {
DataInputStream stream = null;
try {
stream = new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
while (true) {
try {
int length = stream.readInt();
byte[] data = new byte[length];
stream.readFully(data);
// todo: do something with the data
} catch (EOFException e) {
// end of file reached
break;
}
}
} finally {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
// ignore
}
}
}
}
您还可以添加有关块的其他元数据,例如使用stream.writeUTF(...)编写文件的原始名称。您只需确保以相同的顺序编写和读取相同的数据。
答案 1 :(得分:1)
创建第二个文件,在其中将块的字节范围保存在块文件中,或将该信息添加到块文件的标头中。做了类似的事情,不要忘记字节范围比标题长度的附加偏移量。
int startbyte = 0;
int lastByte = 0;
int chunkcount = 0;
File chunkfile;
File structurefile;
for (every chunk) {
append chunk to chunkfile
lastByte = startByte + chunk.sizeInBytes()
append to structurefile: chunkcount startByte lastByte
chunkcount++;
startByte = lastByte + 1
}