2012-03-14 5 views
1

私はByteArrayInputStreamクラスがjava.ioパッケージから使用できるのかどうか疑問に思っていましたか?以下のようなバイト配列を使用するか、またはそれ自身のクラスと比較することであった場合:バイトをファイルから取得されていないByteArrayInputStreamと自分のクラス

private int pos = 0; 
private final byte[] total; 

public Reader(final byte[] total) { 
    this.total = total; 
} 

public int read() { 
    return ((int) total[pos++]) & 0xFF; 
} 

、それがバイト/パケットを受信したサーバになるはずでした。この関数は、ByteArrayInputStreamの関数と同じです。私はByteArrayInputStreamクラスが使用されるかどうか不思議で、Javaのメモリに配置されるバイト数を増やしますか?しかし、基本的に、パフォーマンスが賢明で、どちらがお勧めですか?

ありがとうございます。

EDIT *マーク()とスキップ()メソッドの違いは何ですか?関数は同じように見えました。ちょうどその位置が変更され、1つはバイトをスキップしてスキップします。

+4

クラスは、土曜日の朝に書かれたクラスと何年にもわたって維持されています... – UmNyobe

答えて

2

read()の実装では、ByteArrayInputStreamのものと驚くほど似ています

public synchronized int read() { 
return (pos < count) ? (buf[pos++] & 0xff) : -1; 
} 

だけ余分なオーバーヘッドが私を無視検討する​​、から来ています。 ByteArrayInputStreamは基本的にはbyte[]の周りの薄いラッパーです。あなたは何を達成したいですか?

2

Javaが特定の機能を持つクラスを提供している場合は、必ずそのクラスを使用して、自分の時間を使いましょう。 ByteArrayInputStreamは、コードと比較してさらに2つの整数を格納するので、その差はごくわずかです。その読み込み方法は、あなたが書いたものと本質的に同じです。

パフォーマンス的には、一度に複数のバイトを読み取るほうがずっと良い結果が得られます。ここでも、ByteArrayinputStreamはこの機能を提供します。

+0

さて、mark()とskip()の違いは何ですか?ああ、あなたが言ったように、一度に1バイト以上読むことは、JavaのSystem.arraycopyメソッドを使用しないでしょうか?遅いと思われると聞きました... – AuroX

+0

Skipを使用すると、いくつかのバイトをスキップして、読み込まないようにすることができます。マークでは、後でストリーム内のいくつかのバイトを戻すことができます。 –

+0

バッファーにデータを読み込むには、おそらくSystem.arraycopyを使用します。これは、一度に1バイトの読み取りとコピーよりもはるかに高速です。それはOSのメモリー操作に依存することができるので非常に高速です(これは、標準的なCライブラリーの 'memcpy'機能と本質的に同じです)。これが、System.arraycopyメソッドを利用できるようにする要点です。 –

2

私は通常、既存のjava.ioクラスを使用して調べます。これはよく

  • をデバッグすることがあります

    1. それは
    2. 他の開発者がそれに精通しているであろう他のクラスとよく対話するなど適切なインタフェースを実装します
    3. あなたの開発時間を節約できます

    そうする説得力理由がありますしない限り、私は本当に車輪の再発明ではないでしょう。

  • 関連する問題