1

バイナリファイルから2Kbのデータを読み取り、ヘッダーを追加して新しいファイルに書き込むこのプログラムがあります。
コードは

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());
  }

最初にヘッダーを書き込み、次にファイルを書き込む必要がありますが、出力ファイルはファイルに属していないデータでいっぱいです。ガベージデータを書き込んでいます。問題は何でしょうか。

4

3 に答える 3

4

一部の宣言が欠落しているため、明確ではありませんが、問題はfis.read()メソッドにあるようです。2番目の引数は、ファイルではなくバイト配列のオフセットです(よくある間違い)。

おそらく相対読み取りを使用する必要があります。.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目的であると思いますか?

出力ストリームをフラッシュし続ける必要はありません。完了したら閉じてください。

于 2012-10-19T04:30:14.613 に答える
1

@Dmitriが指摘したことに加えて、メタデータの記述方法に重大な問題があります。

  1. ループの周りで毎回メタデータを書き込んでいますが、これは正しくありません。

  2. 基本的に、を介して4バイトを割り当て、4バイトを"2048".getBytes()超える数をコピーして、4バイトを書き込みます。これも正しくはありません。実際、実際にはArrayIndexExceptionsをスローしているはずです。

  3. メタデータには3つの2進整数が含まれているように見えます。ただし、文字列データをその中に入れています。String.valueOf()/getBytes()これらのフィールドには、すべてのSystem.arraycopy()ナンセンスなしで、DataOutputStream.writeInt()を直接使用する必要があると思います。

于 2012-10-19T06:15:45.493 に答える
0

機能にはapachecommon-iolibのようにサポートされているコミュニティを使用することをお勧めします。便利なものと;があります。IOclassesmethod

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);
于 2012-10-19T06:20:19.637 に答える