私たちはラボでいくつかの演習を行いました。そのうちの1つは、ファイル転送方法をFileInputStream
からBufferedInputStream
に変換することです。これは、要求されたファイルを送信するWebサーバーにGET要求を送信するクライアントです。 私は簡単な解決策を思いつきましたが、それが正しいかどうかをチェックしたかっただけです。FileInputStreamからBufferedInputStreamへの変換
オリジナルコード:
try {
FileInputStream fis = new FileInputStream(req);
// req, String containing file name
byte[] data = new byte [fis.available()];
fis.read(data);
out.write(data); // OutputStream out = socket.getOutputStream();
} catch (FileNotFoundException e){
new PrintStream(out).println("404 Not Found");
}
私の試み:
try {
BufferedInputStream bis = new BufferedInputStream (new FileInputStream(req));
byte[] data = new byte[4];
while(bis.read(data) > -1) {
out.write(data);
data = new byte[4];
}
} catch (FileNotFoundException e){
new PrintStream(out).println("404 Not Found");
}
ファイルは、単純なHTMLページが含まれていたindex.htmlという名前のWebページが、あります。 ファイルの倍数が4の倍数でない場合、whileループの最後の実行時にデータ配列に前回の実行時の文字が含まれているため、毎回配列を再割り当てする必要があります。これはブラウザに表示されます。 デバッグの目的でデータサイズとして4を選択しました。 出力が正しいです。
これは良い解決策ですか、それとも良くできますか?
返信ありがとうございます。 hdに格納されたファイルの場合、FileInputStreamはすべての読み取り操作でディスクにアクセスしますが、BufferedInputStreamは一般的にはより効率的になります。ファイルがネットワーク経由で提供される場合も同じですか?これは私の場合ですか?または、基本的に違いはありませんか? –
FileInputStreamはすべての読み取りでOSにアクセスします.OSは予測的に先読みを使用することができ、たびに頻繁にディスクにヒットします。 BufferedInputStreamは、読み込んだデータのブロックが非常に小さい場合にのみ役立ちます。 << 512バイト、読み込むバッファよりも。すなわち、魔法ではなく、より大きなバッファを読み取ることによって、あなたがすでにやっていることをやっているだけです。 –