2

我在 Java 中有一种情况,我有一个返回 InputStream 的方法,我想这样做,以便每当有人在该 InputStream 上调用 close 函数时,代码中的其他地方都会得到通知(如回调)。

但是,我返回的实际 InputStream 是由库调用返回的 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

您可以使用 Java bean 事件机制来做到这一点。

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 回答