0

バイトレベルではなく、テキストレベルでファイルを(ある種の文字セットでエンコードして)読みたいとしましょう。だから私はReaderクラスが必要です。バッファリングされたリーダとインプットストリームの異なるネスト可能

また、読み込みをバッファしたいとしましょう。これを行うには少なくとも3つの方法があります。

public static void main(String[] args) throws Exception { 

    BufferedReader r1 = new BufferedReader(new FileReader("foo.txt")); 
    BufferedReader r2 = new BufferedReader(new InputStreamReader(new FileInputStream("foo.txt"))); 
    InputStreamReader r3 = new InputStreamReader(new BufferedInputStream(new FileInputStream("foo.txt"))); 
} 

R1とR2はほとんど同じ、InputStreamReaderからFileReader継承しているのであり、実質的にそれの基底クラスでInputStreamを置きます。この場合のバッファリングは、バイトがテキストにデコードされた後に文字レベルで行われます。

しかし、第3の場合は、バッファリングがバイト読み取りとテキストのデコードとの間で行われるため、多少異なります。バッファリングはバイトがテキストにデコードされる前に行われます。

ご質問は、これらのケースの間に大きな違いがありますか? 1つのオプションが他のオプションよりも優れているエッジケースはありますか? FileReader

答えて

1

実装:

public class FileReader extends InputStreamReader { 
    public FileReader(String fileName) throws FileNotFoundException { 
     super(new FileInputStream(fileName)); 
    } 
} 

だから、あなたが見る、あなたの最初の2行はまったく同じチェーンにつながります。

3番目のオプションはパフォーマンスにはあまり適していません。 InputStreamReaderは、byteストリームからcharストリームへの文字エンコーディング変換を行う必要があります。これはバイト単位では遅くブロック単位では高速です。

InputStreamReaderの参照用のjavadoc

にInputStreamReaderのread()メソッドのいずれかを呼び出すたびは、1つまたは複数のバイトが基本となるバイト入力ストリームから読み出されないことがあります。バイトから文字への効率的な変換を可能にするために、現在の読取り操作を満足するのに必要なバイト数よりも多くのバイトを下位のストリームから先読みすることができる。

効率を最大限に高めるために、InputStreamReaderをBufferedReader内にラップすることを検討してください。たとえば:オプション1と

BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 

ゴーこれは、オプション2よりも短いですし、まったく同じことをして、オプション3は良い選択ではありません。

関連する問題