2

Java で InputStream を返すメソッドがある状況があり、その InputStream で close 関数を呼び出すたびに、コード内の他の場所 (コールバックなど) が通知されるようにしたいと考えています。

ただし、私が返す実際の InputStream は、ライブラリ呼び出しによって返される InputStream のサブクラスであるため、直接制御することはできません。

私の現在の解決策は、コンストラクターのライブラリ呼び出しによってインスタンス化される InputStream メンバー変数を持つ InputStream のサブクラスを作成することです。 close() 関数は特別なことをします。

これは機能しますが、close() が呼び出されたときに単一のイベントを実行できるように、まったく新しいクラスを作成し、必要なすべてのメソッドをオーバーライドする必要があるというオーバーヘッドを削減したいと考えています。

4

3 に答える 3

4

Apache Commons IOには、さまざまなフィルタリング I/O ストリームがあり、説明したことをより簡単に行うことができます。

于 2012-11-01T00:24:29.550 に答える
3

InputStream のユーザーに対して透明にしたい場合は、ほとんどこの方法で行う必要があります。とはいえ、FilterInputStream がすべての基本的な作業を行うため、すべてのコードを自分で記述する必要はありません (close()メソッドをオーバーライドするだけで済みます)。

于 2012-11-01T00:47:14.503 に答える
1

これを行うには、JavaBeanイベントメカニズムを使用できます。

http://docs.oracle.com/javase/tutorial/javabeans/writing/events.html

これは、リスナーとブロードキャスターが同じJVMで実行されていることを前提としています。

これが私が念頭に置いていたものです:

package io;

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeSupport;
import java.io.IOException;
import java.io.InputStream;

/**
 * BroadcastingInputStream broadcasts to interested listeners when it closes.
 * @author Michael
 * @since 10/31/12 8:34 PM
 * @link http://stackoverflow.com/questions/13169206/possible-in-java-to-create-an-event-when-a-function-is-called-on-a-particular-ob/13169271#comment17920062_13169271
 */
public class BroadcastingInputStream extends InputStream {

    private InputStream is;
    private PropertyChangeSupport propertyChangeSupport;

    public BroadcastingInputStream(InputStream is) {
        this.is = is;
        this.propertyChangeSupport = new PropertyChangeSupport(this);
    }

    @Override
    public int read() throws IOException {
        return this.is.read();
    }

    public void addCloseListener(PropertyChangeListener closeListener) {
        this.propertyChangeSupport.addPropertyChangeListener(closeListener);
    }

    public void removeCloseListener(PropertyChangeListener closeListener) {
        this.propertyChangeSupport.removePropertyChangeListener(closeListener);
    }

    @Override
    public void close() throws IOException {
        super.close();
        this.propertyChangeSupport.firePropertyChange("closed", false, true);
    }
}
于 2012-11-01T00:15:56.343 に答える