Java:データ可用性、クローズド状態などのためのInputStream規約

私は、ローカルファイルを扱うように設定されているInputStreamを持っていますが、後でネットワーク経由でファイルから読み込む機能を追加したいのです。私はInputStreamがこれに合わせていると仮定します。

私が抱えている問題は、明らかにInputStreamはデータをいつでも利用できるとは保証されておらず、データは後で利用できるようになる可能性があります。確かに私はそれを正しく理解している。使用可能なデータの絶対サイズ(バイト数)を決定する方法や、InputStreamが閉じられているかどうかを判断する方法はありません。そこにファイルがある場合は、利用可能なものを必要する必要があります。
InputStreamを処理しているメソッドは、おそらくそれを読み込みます。データがない場合は、それを保持する理由はありません。さらに悪いことに、利用可能なデータがあるかどうかはわかりません。

だから私の質問は、ファイルがネットワーク上またはローカルで読み取られている場合、どうすればそれがオープン/クローズされているかを判断し、場合によっては反対側のファイルのサイズを判断できますか?なぜこのクラスは裸であるのですか?

ベストアンサー

InputStream
抽象クラスは、ファイルだけでなく、あらゆるソースからバイトを読み込むクラスです。その子孫は特定のソースのためのメソッドを提供します。たとえば、
SocketInputStream はソケットからバイトを読み取るときに
FileInputStream を使用してファイルからバイトを読み取ることができます。

これは、 InputStream
がファイル以外のソースに意味をなさないため、ファイルサイズを決定する方法を提供しない理由です。

私は、ネットワーク上のファイルを読むことによって正確に何を意味するのかよく分かりません。リモートファイルシステムからファイルを読み込むことを意味するならば(例えばNFS経由で)、
File クラスの
length()メソッドを使用してファイルのサイズを取得できます:

File file = new File("/path/to/file");
System.out.println(file.length());

FileInputStream を呼び出して取得した
FileDescriptor インスタンスで valid()メソッドを使用して
FileInputStream )メソッドを
‘FileInputStream’オブジェクトに追加します。

boolean isOpen(FileInputStream stream)
{
    return stream.getFD().valid();
}

もちろん、 Leaky Abstractionの法則が適用されます。

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です