参考我的previous question。
我用以下方法制作了这个程序:
程序首先从文件中读取2k数据并将其存储到字节数组中
然后,要添加到每个数据包的数据也存储在一个数组中,并且两者都被添加到数组列表中。
然后将数组列表写入文件的输出流。
守则在这里:
File bin=chooser.getSelectedFile();
int filesize=(int)bin.length();
int pcount=filesize/2048;
byte[] file=new byte[filesize];
byte[] meta=new byte[12];
int arraysize=pcount*12+filesize;
byte[] rootfile=new byte[46];
ArrayList al = new ArrayList();
String root;
prbar.setVisible(true);
int mark=0;
String metas;
try{
FileInputStream fis=new FileInputStream(bin);
FileOutputStream fos=new FileOutputStream(bin.getName().replace(".bin", ".xyz"));
ObjectOutputStream os=new ObjectOutputStream(fos);
root="46kb"+"5678"+"0000"+pcount+"MYBOX"+"13"+"S208";
rootfile=root.getBytes();
for(int n=0;n<=pcount;n++)
{
fis.read(file, 0, 2048);
mark=mark+2048;
int v=(mark/filesize)*100;
prbar.setValue(v);
metas="02KB"+"1234"+n;
meta=metas.getBytes();
al.add(rootfile);
al.add(meta);
al.add(file);
}
os.writeObject(al.toArray());
}
catch(Exception ex){
erlabel.setText(ex.getMessage());
}
程序运行时没有任何错误,但文件未正确创建。 方法是错误的还是代码。
请帮助
答案 0 :(得分:2)
您似乎正在编写自己的二进制格式,但您正在使用具有自己标头的ObjectOutputStream。 writeObject以允许Java进程反序列化该对象的方式写入对象而不是数据,例如用它的类层次结构和字段名称。
对于二进制文件,我建议你使用一个普通的DataOutputStream和一个BufferedOutputStream,它会更高效,并且可以做你想要的。
我还建议您在生成数据时编写数据,而不是使用ArrayList。这将使用更少的内存,使代码更简单,更快。
我会更像这样编写代码
File bin = chooser.getSelectedFile();
int filesize = (int) bin.length();
int pcount = (filesize + 2048 - 1) / 2048;
byte[] file = new byte[2048];
FileInputStream fis = new FileInputStream(bin);
String name2 = bin.getName().replace(".bin", ".xyz");
OutputStream os = new BufferedOutputStream(new FileOutputStream(name2));
byte[] rootfile = ("46kb" + "5678" + "0000" + pcount + "MYBOX" + "13" + "S208").getBytes("UTF-8");
for (int n = 0; n < pcount; n++) {
os.write(rootfile);
byte[] metas = ("02KB" + "1234" + n).getBytes("UTF-8");
os.write(metas);
int len = fis.read(file);
os.write(file, 0, len);
int percent = 100 * n / pcount;
prbar.setValue(percent);
}
ow.close();
答案 1 :(得分:1)
首先是最小的东西:
int v=(mark/filesize)*100;
我认为使用整数除法总是为0。
int v = mark * 100 / filesize;
byte []对象(例如file
)创建一次,并多次添加到列表中。
你得到最后一次覆盖的n份副本。