2017-06-30 5 views
1

データを読み込むための引数としてInputStreamをとるクラスがあります。Java InputStreamがソケットから来ているかどうか確認してください

public Foo { 
    private DataInput in; 

    public Foo(InputStream ism) { 
    in = new DataInputStream(ism); 
    } 

    public byte readByte() throws IOException { 
    return in.readByte(); 
    } 
} 

時には、この入力ストリームは例えば、ソケットから来るかもしれない、

ism = new BufferedInputStream(sock.getInputStream()); 
foo = new Foo(ism); 

私の質問は、それはすなわち、入力ストリームがソケットから来ることはFoo内から確認することができ、それはネットワークの、ありますローカルI/OではなくI/O?

socket.getInputStream 

以降は、抽象クラスを返します。テストする具体的な入力ストリーム実装がわかりません。

編集:この構造を持つ大きなJavaソフトウェアがあるという動機があります。 Fooは多くの場所に作成されます。ファイル入力ストリームのある場所とソケット入力ストリームのある場所読み取りがネットワークを介して行われると、ソフトウェアのパフォーマンスが低下する可能性があります。だから私は可能性があるかどうかを確認したいのですが、コードの多くを変更することなく、このソフトウェアの2つのシナリオを区別するためにトレースします。 AspectJを使って、この既存のソフトウェアに大きな混乱を招かないようにするために、トレースを書きます。

+2

いいえ(少なくとも醜いリフレクションベースのソリューションはありません)、これはBufferedInputStreamにラップするためです。しかし、気にする必要はありません。InputStreamはInputStreamです。InputStreamです。あなたは何を達成しようとしていますか? –

+1

いいえ、 'Foo'のインターフェース全体をソケットとは独立していて、ソケットから隔離して書いています。 'Foo'にソケットについて知りたければ、ソケットを与えなければなりません。 – pvg

+0

Fooがローカルファイルの読み込みの代わりにネットワーク読み込みをしているときに区別するために、トレースを行う必要があります。 – Oxdeadbeef

答えて

1

問題は、入力ストリームが別の入力ストリームの周りに構築され、そのソケットがちょうど入力ストリームを返すFilterInputStreamできることです。

一つのアプローチ、非常に汚れ&バギー:つまり、ルートInputStreamを見つけ、再帰的に/ループそれはFilterInputStreamのインスタンスである場合、その親のInputStream(保護されたフィールドin)を確認してください。次に、ルートのクラスをチェックします。名前がソケットから来た場合、名前にはおそらく "Socket"が含まれています。

AspectJのアイデア(それほど多くの経験はありません):返されたInputStreamを後で確認するためのリスト(または同様のもの)を格納するSocketのgetInputStreamメソッドに追加する必要があります。 InputStreamをマークします(フラグ/メソッドを追加しますか?)。

0

入力ストリームの2つのスーパークラスを作成してから、Fooクラスに渡すことができます。

のFooクラスの次に
NetworkInputStream nis = new NetworkInputStream(sock.getInputStream()); 
Foo networkFoo = new Foo(nis); 

FileInputStream fis = new FileInputStream(file.getInputStream()); 
Foo fileFoo = new Foo(fis); 


public class NetworkInputStream extends BufferedInputStream {} 

public class FileInputStream extends BufferedInputStream {} 

public Foo(InputStream ism) { 
    if (ism instanceof NetworkInputStream) { 
     //Do whatever if it's from network stream 
    } 
    if (ism instanceof FileInputStream) { 
     //Do whateverelse 
    } 
    in = new DataInputStream(ism); 
} 
関連する問題