1

アイコンサイズの画像をバイト単位でmysqlデータベースに保存しました。次に、データベースからそれらのファイルバイトを取得し、swingアプリケーションでそれらの画像を表示する必要があります。データベースからバイトを取得し、変換するメソッドがあります。ファイルに戻しますが、そのファイルをディスクに書き込む必要があります

これが私の方法です、

public void downloadFile(int FamerId) throws Exception {
  String sql = "SELECT * FROM images WHERE famer_id=?";
  Connection con = JDBCConnectionPool.getInstance().checkOut();
  PreparedStatement ps = con.prepareStatement(sql);        
  ps.setInt(1, FamerId);
  ResultSet resultSet = ps.executeQuery();

  int count = 0;

  while (resultSet.next()) {
    ByteArrayInputStream bais;
    ObjectInputStream inputStream;

    bais = new ByteArrayInputStream(resultSet.getBytes("image"));
    inputStream = new ObjectInputStream(bais);
    SaveFile sf = (SaveFile) inputStream.readObject();
    FileOutputStream out = new FileOutputStream("fileLocation/" + resultSet.getString("image_name"));
    byte[] bytes = sf.getArray();

    int c = 0;
    while (c < bytes.length) {
      out.write(bytes[c]);
      c++;
    }

    out.close();
    inputStream.close();
    bais.close();            
    JDBCConnectionPool.getInstance().checkOut();
  }
}

しかし、この方法では必要なものが得られません。助けてください。

4

2 に答える 2

3

ImageIOクラスを使用して、バイト ストリームから直接イメージを読み取ることができます。もちろん、以前に画像データを互換性のある形式で書き込んでいると仮定します。コードでバイトデータを読み取るときに中間オブジェクト入力ストリームを使用するという事実を考えると、これは言いにくいです。中間ファイルを使用せずにデータベースから直接イメージを作成する方法の例を次に示します。

bais = new ByteArrayInputStream(resultSet.getBytes("image"));
final BufferedImage image = ImageIO.read(bais);
// pass the image to your Swing layer to be rendered.

そして、このコードを使用できるようにするために、データベースにデータを書き込む方法の例:

final ByteArrayOutputStream baos = new ByteArrayOutputStream(64000);
ImageIO.write(image, "PNG", baos);
final byte[] data = baos.toByteArray();
// write data to database
于 2012-04-27T03:28:53.503 に答える
0

あなたの質問への答えは、プラットフォームに依存します。ドキュメントから

ファイル出力ストリームは、データを File または FileDescriptor に書き込むための出力ストリームです。ファイルが使用可能かどうか、またはファイルを作成できるかどうかは、基盤となるプラットフォームによって異なります。特に、一部のプラットフォームでは、一度に 1 つの FileOutputStream (または他のファイル書き込みオブジェクト) だけが書き込み用にファイルを開くことができます。このような状況で、関連するファイルが既に開いている場合、このクラスのコンストラクターは失敗します。

FileOutputStream は、画像データなどの raw バイトのストリームを書き込むためのものです。文字のストリームを書き込むには、FileWriter の使用を検討してください。

したがって、ファイルに書き込みたい場合、ファイルが作成される場合と作成されない場合があります。

ファイルを作成せず、byte[] (ファイルのコンテンツ) だけに関心がある場合は、@Perception が提供するソリューションを使用するか、既に作成した inputStream を渡すことができます。

于 2012-04-27T03:32:16.130 に答える