1

現在、Android を使用するプロジェクトに取り組んでいますVpnService。パフォーマンス テスト中に、返されたメソッドFileInputStreamに対して作成したからの読み取りが遅いことがわかりました。同じための私の作業コードスニペットは以下のとおりです。FileDescriptorestablish()

private val vpnIf0 = FileInputStream(fd)

suspend fun readVpnIf0(): IPDatagram = withContext(Dispatchers.IO) {
    val bytes = ByteArray(BUFFER_SIZE)
    val count = vpnIf0.read(bytes)
    return@withContext IPMarshaller.marshal(bytes, count)
}

コードを最適化するために、他のすべてを同じに保ちながら、次のようにラップFileInputStreamしました。BufferedInputStream

private val vpnIf0 = BufferedInputStream(FileInputStream(fd))

しかし、今私の読み取りメソッドが機能しなくなり、ここにエラーが表示されます。

Caught java.io.IOException: Invalid argument
        at java.io.FileInputStream.available0(Native Method)
        at java.io.FileInputStream.available(FileInputStream.java:389)
        at java.io.BufferedInputStream.read(BufferedInputStream.java:355)
        at java.io.FilterInputStream.read(FilterInputStream.java:107)

.txt間違ったことをしていないことを確認するために、ファイルと aを使用してまったく同じ読み取りアプローチを試みたところBufferedInputStream、魅力的に機能しました。実装をさらに調べると、以下に示すように、メソッドFileInputStreamの近くにいくつかのコメントが表示されます。available()私には、Android は標準の JDK よりもわずかに変更されたバージョンを使用しているようです。

// BEGIN Android-changed: available() implementation changed from bare native.
public int available() throws IOException {
    // Android-added: close() check before I/O.
    if (closed) {
        throw new IOException("Stream Closed");
    }

    return available0();
}

private native int available0() throws IOException;
// END Android-changed: available() implementation changed from bare native.

注:BufferedInputStream私が持っているユース ケースは、Android の世界での使用例FileInputStreamですFileDescriptor。ここで、FileDescriptorは仮想ネットワーク インターフェイス/dev/tun0です。

質問:

  1. BufferedInputStreama を a の上にラップすることFileDescriptorがまったく不可能な場合、私の理解にギャップはありますか? JVMで同じことを試したことはありません。
  2. それとも、これは Android 固有のニュアンスですか? その場合、これを克服し、バッファリングされた読み取りを確実にする方法。

どんな助けでも大歓迎です!

4

0 に答える 0