1

私は解決策を見つけることができなかった問題に直面しています。そこで、これを読んでくださっている皆様にお願いがあります。この点で私を助けてください。

「.png」ファイルから画像ファイルをBlob形式でApache derby dbに保存しています。ファイルは問題なく保存されました。

derby から読み返すには、まずデータを Blob として取得し、それを InputStream に変換してから、次のコードを使用して、作成したクラス「Person」オブジェクトに格納します。

Blob patientPhoto = rs.getBlob("photo");

person.setPhoto(patientPhoto.getBinaryStream());

Class Person の概要を以下に示します。

 Public class Person {
    private String personName;
    private InputStream photo;

public void setPhoto(InputStream photo){
        this.photo = photo;
    }
Public InputStream getPhoto(){
    return photo;
    }
 }

最初に、ダービーに画像とともに保存した Person の 4 つのオブジェクトがあります。次に、これらの 4 人の人物オブジェクトを derby から取得し、Vector 配列に格納します。以下に示すように、ベクトル配列から取得して、それらを1つずつ表示し始めます

Method-1: ベクトル配列から人物オブジェクトを初期化する方法

Person data = new Person();

int i=0;

data = vector[i++];

方法-2:人物写真の表示方法

InputStream img = data.getPhoto();

// The image recieved from db should be buffered as it is not real file
// but bytes of streams

BufferedImage buffImg = null
    if(img!=null){
      try {
        buffImg = ImageIO.read(img);
      } catch (IOException e) {
         e.printStackTrace();
      }

    //a panel with JLabel where Image will be displayed

    pnlImg.setImage(buffImg);
    }

try {
    img.close();
    } catch (IOException e) {
      e.printStackTrace();
    }

インデックス 0 から 3 までのベクトル配列から取得した 4 つの写真はすべて正常に表示されましたが、人物オブジェクトをベクトル インデックス 2 から 0 まで逆方向に取得しようとすると、ヌル ポインター例外がスローされます。コード ImageIO.read(img); 「img」が null でない間は null 値を返します。

「img」がnullではないのにnullと表示される理由がわかりません。ベクトル インデックス 0 から 3 に移動している間は機能し、その後逆方向に移動すると機能しません。私を助けてください

4

2 に答える 2

1

Blob の InputStream は、現在そのレコードに配置されている間のみ有効であると思います。したがって、 getBinaryStream() から取得した値が長期間有効であるとは期待しないでください。

代わりに、アプリケーションは、ブロブを取得したらすぐにストリームからバイトを読み取る必要があります。その後、結果セットの次のレコードに進むことができます。

そのため、setPhoto() メソッドが InputStream から独自のバイト配列にデータを読み取るように Photo クラスを変更し、getPhoto() が呼び出されたときに独自の ByteArrayInputStream を Photo のプライベート バイト配列に返すことができるようにします。

于 2013-02-21T14:56:15.413 に答える