2

TCPを使用してサーバーに接続する簡単なソケットアプリを作成しています。時々 2 バイト値を読み取る必要があるため、すべて次のようになります。

public byte[] read(int bytes)
{
    byte b[] = new byte[bytes];
    try {
        in.read(b); //in is InputStream from properly connected Socket.getInputStream()
    return b;
    } catch (IOException e) {
        return null;
    }
}

この関数は、指定されたバイト数を受け取り、それを配列で返す必要があります。問題は、残りが利用可能になる前に 1 バイトを読み取り、奇妙なデータを返すことがあるということです。

byte a[]=read(2); //Program is blocked here untill some bytes arrive...
System.out.prntln(a[0]); //always correct
System.out.prntln(a[1]); //unprintable character (probably 0 or -1)

私の簡単な修正は、読み取るのに十分なデータがあるかどうかを確認する while ループを追加することでした。

public byte[] read(int bytes)
{
    byte b[] = new byte[bytes];
    try {
        while (in.available()<bytes); //It does the thing
        in.read(b);
    return b;
    } catch (IOException e) {
        return null;
    }
}

しかし、そのループはプロセッサの能力 (実際には 1 つのコア) を 100% 使用しているため、非常に厄介です。その関数を書き直す方法はありますか (param と戻り値はまったく同じでなければなりません)、正しく動作しますか?

事前にサンクス:)

4

2 に答える 2

2

それを捨てて、DataInputStream.readFully() を使用してください。

于 2013-06-23T03:41:34.760 に答える