我有这个程序从二进制文件中读取2 Kb数据,为它添加一些标题,然后将其写入新文件。
代码是
try {
FileInputStream fis = new FileInputStream(bin);
FileOutputStream fos = new FileOutputStream(bin.getName().replace(".bin", ".xyz"));
DataOutputStream dos=new DataOutputStream(fos);
fos.write(big, 0, big.length);
for (int n = 1; n <= pcount; n++) {
fis.read(file, mark, 2048);
mark = mark + 2048;
prbar.setValue(n);
prbar.setString("Converted packets:" + String.valueOf(n));
metas = "2048";
meta = metas.getBytes();
pc = String.valueOf(file.length).getBytes();
nval = String.valueOf(n).getBytes();
System.arraycopy(pc, 0, bmeta, 0, pc.length);
System.arraycopy(meta, 0, bmeta, 4, meta.length);
System.arraycopy(nval, 0, bmeta, 8, nval.length);
fos.write(bmeta, 0, bmeta.length);
fos.flush();
fos.write(file, 0, 2048);
fos.flush();
}
}catch (Exception ex) {
erlabel.setText(ex.getMessage());
}
首先它应该写入标题然后写入文件。但是输出文件中充满了不属于该文件的数据。它正在编写一些垃圾数据。可能是什么问题?
答案 0 :(得分:4)
缺少某些声明并不是很清楚,但看起来你的问题是fis.read()
方法:第二个参数是字节数组中的偏移量,而不是文件(常见错误)。< / p>
您可能想要使用相对读取。在写入缓冲区之前,还需要检查.read()
的返回值以查看实际读取的字节数。
常见的习语是:
InputStream is = ...
OutputStream os = ...
byte[] buf = new byte[2048];
int len;
while((len = is.read(buf)) != -1)
os.write(buf, 0, len);
is.close();
os.close();
这是写出元数据的一种非常奇怪的方式,我假设(未使用的)DataOutputStream
是什么?
您不需要继续刷新输出流,只需在完成后将其关闭。
答案 1 :(得分:1)
除了@Dmitri指出的内容之外,编写元数据的方式也存在严重问题。
您每次都在循环中编写元数据,这可能不对。
您实际上是通过"2048".getBytes()
为它分配4个字节,然后将超过4个字节复制到其中,然后写入4个字节。这也不是正确的,事实上它应该真正抛出ArrayIndexExceptions。
看起来元数据应该包含三个二进制整数。但是,您将String数据放入其中。我怀疑你应该直接为这些字段使用DataOutputStream.writeInt(),而不是所有String.valueOf()/getBytes()
和System.arraycopy()
无意义。
答案 2 :(得分:0)
我建议使用lib
社区支持,例如 apache common-io 用于IO
功能。
有usefule classes
和method
;
org.apache.commons.io.DirectoryWalker;
org.apache.commons.io.FileUtils;
org.apache.commons.io.IOCase;
FileUtils.copyDirectory(from, to);
FileUtils.writeByteArrayToFile(file, data);
FileUtils.writeStringToFile(file, data);
FileUtils.deleteDirectory(dir);
FileUtils.forceDelete(dir);