現在、Android を使用するプロジェクトに取り組んでいますVpnService
。パフォーマンス テスト中に、返されたメソッドFileInputStream
に対して作成したからの読み取りが遅いことがわかりました。同じための私の作業コードスニペットは以下のとおりです。FileDescriptor
establish()
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
です。
質問:
BufferedInputStream
a を a の上にラップすることFileDescriptor
がまったく不可能な場合、私の理解にギャップはありますか? JVMで同じことを試したことはありません。- それとも、これは Android 固有のニュアンスですか? その場合、これを克服し、バッファリングされた読み取りを確実にする方法。
どんな助けでも大歓迎です!