2017-08-13 6 views
1

私はそうのような方法があります:ファイルリーダーを包んだbufferedreaderは、filereaderからファイルポインタを取得しますか?

public void LoadFromFile(){ 
String record; 
try{ 
     FileReader reader = new FileReader("Friends.txt"); 
     BufferedReader bin = new BufferedReader(reader); 
     while((record = bin.readLine()) != null){ 
      //do some stuff 
     } 
     clientinfo = homeAddress.LoadFromFile(reader); 

方法homeAddress.LoadFromFile(リーダー)上記と呼ばれるように別のクラスにあり、次のとおりです。

public String[] LoadFromFile(FileReader areader){ 
String record; 
    try{ 
     BufferedReader bin = new BufferedReader(areader); 
     while((record = bin.readLine()) != null){ 
      //do some stuff 
      } 
     } 
     bin.close(); 
     bin = null; 

私の質問は、私は、ありますその間に同じFileReaderを使用しているので、BufferedReaderを囲むと、BufferedReaderはFileReaderからファイルポインタ(読み込みを開始する場所)を使用しますか?

最初のBufferedReaderは、ファイルポインタを更新して、2番目のBufferedReaderがどこから開始するのかを認識しますか?

+0

filereaderオブジェクトではなく、binに格納されているbufferedreaderを渡していますか? – Ferrybig

答えて

2

ここでのキーは、「バッファされた」という単語です。いいえ、第2のLoadFromFileBufferedReaderは、発信者の中のBufferedReaderがどこで中断したかを正確に把握することはできません。 the documentationから:

文字、配列、行を効率的に読み取りを提供するように、文字入力ストリームから緩衝文字テキストを読み込み。

BufferedReaderがファイルに先読みし、そのバッファにそのデータを保持することを意味します(私の強調)

。したがって、2番目のBufferedReaderは、最初の文字が最初に読み取られた—であるため、最初のBufferedReaderから消費したものと2番目のものから消費するものの間にギャップがある可能性があります。

代わりにBufferedReaderを2番目の方法に渡し、それに応じて署名を変更します。

一般に、そのシグネチャは既にビットオフです。ファイルや他の種類のストリームから読み込みを行っているかどうかを知ったり、気にする必要はありません。知る必要があるのは、BufferedReader(それはreadLineに依存しているので)から読み取っていることです。


サイドノート:読み取り中に例外が発生した場合、あなたのコードでは、あなたが(特にFileReader)を読者によって割り当てられた非JVMのリソースをクリーンアップする機会を持っていません。これは、try--リソースとは、本当に便利ですです:そこ

try (
    FileReader reader = new FileReader("Friends.txt"); 
    BufferedReader bin = new BufferedReader(reader); 
) { 
    while((record = bin.readLine()) != null){ 
     //do some stuff 
    } 
    clientinfo = homeAddress.LoadFromFile(reader); 

、例外がreadLineで発生した場合でも、読者がクリーンアップされます。

+0

私は、最初のbufferedreaderが途切れていた場所を継続することに興味がある方法でOPの質問を読んでいます。それでリセットが実装されても、それは役に立たないかもしれません。 – eis

+0

@eis:最初のブロックは、次のメソッドに渡す前に(readLineが 'null'を返すまで)最後まで読み込んでいますので、始めからやりたいと思いました。しかし、それは前提なので、間違っている可能性があります。 :-) –

+0

私は '/ /いくつかのものは'それに '中断 'を持っているかもしれないと思った。そうでなければ、質問はそれほど私には意味をなさない。 – eis

0

source code of BufferedReaderから読み取る次の文字のインデックスに内部変数nextCharがあることがわかります。したがって、変数を自分で保存するか、bufferedreaderインスタンスを回り込まない限り、「ポインタ」は続かない次の呼び出しに。

これはテストに十分に簡単です:

友達。TXT:

foo 
bar 

コード:

import org.junit.Test; 

import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 

public class FileReadingTest { 
    @Test 
    public void LoadFromFile() throws IOException { 
     String record; 
     try { 
      FileReader reader = new FileReader("Friends.txt"); 
      BufferedReader bin = new BufferedReader(reader); 
      while ((record = bin.readLine()) != null) { 
       System.out.println("1: read " + record); 
       break; 
      } 
      LoadFromFile(reader); 
     } catch (FileNotFoundException foo) { 
      System.out.println("file not found from " + new File(".").getAbsolutePath()); 
     } 
    } 
    public void LoadFromFile(FileReader areader) { 
     String record; 
     try { 
      BufferedReader bin = new BufferedReader(areader); 
      while ((record = bin.readLine()) != null) { 
       System.out.println("2: read " + record); 
      } 
      bin.close(); 
      bin = null; 
     } catch (IOException ex) { 
      throw new IllegalStateException(ex); 
     } 
    } 
} 

実行:

1: read foo 

Process finished with exit code 0 

だから、第二のリーダでも最初の読み込みが完了しなかった場合でも、読む機会を得ることはありません。また、最初の読み込み後にbin.close()を導入すると、2番目の読みはjava.io.IOException: Stream closedとなります。

コメントに示唆されているように、最初のものが途切れていた2番目の方法で読み続ける場合、最も単純な方法は同じbufferedreaderインスタンスを渡すことです。適切な時期にリソースを解放することに注意する必要があります。

+0

私は、私が最初にbufferedreaderを停止し、2番目のbufferedreaderを中断したところで続ける方法はありますか? – ak94

+0

@ArielKropp最も簡単な方法は、同じbufferedreaderインスタンスを渡すことだけかもしれません。もう1つの選択肢は、読み込まれた文字の量を変数に格納し、読者を完全に閉じてから、最初の新しい読み込みの前にskip skip(amountOfChars)を呼び出すことです。同じバッファリングされた読者を本当に使いたいと思うのですか? – eis

関連する問題