0

私の以前の質問を参照して。

私は次のアプローチでプログラムを作成しました:
プログラムは最初にファイルから 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());
}

プログラムはエラーなしで実行されますが、ファイルは正しく作成されません。アプローチが間違っているか、コードが間違っています。

助けてください

4

2 に答える 2

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();
于 2012-09-14T08:18:30.517 に答える
1

最初に最小のものから:

int v=(mark/filesize)*100;

常に0になる整数除算を使用していると思います。

int v = mark * 100 / filesize;

byte[] オブジェクト (fileたとえば) は一度作成され、リストに何度も追加されます。最後の上書きの n 個のコピーを取得します。

于 2012-09-14T08:18:13.527 に答える