2

Java アプレットを編集していて、パフォーマンスの問題が発生しています。より具体的には、アプレットは、クライアントのマシンにエクスポートする必要があるイメージを生成します。

これは実際には概念実証の段階にあるので、我慢してください。現時点では、イメージは事前に定義された場所でクライアント マシンにエクスポートされます (これは、将来、保存ダイアログなどに置き換えられます)。ただし、32kb のファイルの場合、このプロセスには約 15 秒かかります。

問題のメソッド全体で論理的な間隔でコンソールにメッセージを出力する「ヒップバイザヒップ」プロファイリングをいくつか行いました。驚いたことに、ボトルネックは jpeg エンコーディングではなく、実際のデータ ストリーム書き込みプロセスにあるようです。

私は Java とそのメソッドの基本的な知識しか持っていないことを覚えておいてください

だからゆっくりしてください:p - 私は主に、解決策そのものではなく、問題を解決するための提案を探しています。

魔法が起こるコードのブロックは次のとおりです。

ByteArrayOutputStream jpegOutput = new ByteArrayOutputStream();
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(jpegOutput);
encoder.encode(biFullView);
byte[] imageData = jpegOutput.toByteArray();

String myFile="C:" + File.separator + "tmpfile.jpg";
File f = new File(myFile);

try {
dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream(myFile),512));
dos.writeBytes(byteToString(imageData));
dos.flush();
dos.close();
}
catch (SecurityException ee) {
    System.out.println("writeFile: caught security exception");
}
catch (IOException ioe) {
    System.out.println("writeFile: caught i/o exception");
}

前述したように、system.out.println() を使用して、パフォーマンスのボトルネックを DataOutputStream ブロックに絞り込みました。ハードウェア統計が異なるさまざまなマシンを使用しても、全体的なパフォーマンスにはほとんど影響がないようです。

ポインタ/提案/方向性は大歓迎です。

編集: 要求に応じて、byteToString():

public String byteToString(byte[] data){
  String text = new String();
  for ( int i = 0; i < data.length; i++ ){
    text += (char) ( data[i] & 0x00FF );
  }
  return text;
}
4

3 に答える 3

1

標準のImageIO API を使用することもできます (com.sun.image.codec.jpeg パッケージのクラスは、コア Java API の一部ではありません)。

String myFile="C:" + File.separator + "tmpfile.jpg";
File f = new File(myFile);
ImageIO.write(biFullView, "jpeg", f);
于 2009-03-09T11:22:35.577 に答える