2012-04-03 13 views
0

といくつかの問題は、私はJavaの機能を持っている:次のようにBufferedReaderの

public HashMap<String, ArrayList<Double>> embedWords(BufferedReader buffR1 {    
    ArrayList<String > arrayList = new ArrayList<String>(); 
    arrayList = getWords(buffR1); 
    System.out.println("Word size:"+ arrayList.size()); 

     ArrayList<ArrayList<Double>> arrList = getWordFeature(buffR1); 
    System.out.println("Size of arrList:embedWords:"+arrList.size()); 
    } 

をここで、問題はサイズ値を与えることはできません両方の機能getWordsのとgetWordFeatures、です。私は機能getWords非ゼロ値.But時にアンコメントを返すgetWordFeature機能をコメントすると次のように、出力は次のようになります。

Word size:15055 
Size of arrList:embedWords: 0 

答えて

4

ですから、基本的にBufferedReaderが一度消化し、あなたの入力して、それを「食べる」ということ、を教えて「もう一度読む」ことはありませんか?

ストリームとリーダーはこのように設計されているので、これは驚くべきことではありません。

+0

この状況をどのように克服できますか? – thetna

+0

'getWords()'と 'getWordFeature()'が一回のメソッドで何をしていても、入力を一度読み取ることができます。 – darrengorman

+0

また、 'getWords'が読者の言葉だけを読み込んで分割すると、' getWordFeature(Reader r) 'を' getWordFeature(List words) 'に書き換えることができます。 –

1

機能は、getWordFeature機能が呼び出されるまでにbuffR1ストリームの内容を既に読み込んでいます。ストリームを避けるためにストリームを呼び出す前に、ストリームの内容を読み取る必要があります。

最初に内容を配列に読み込んで、barrとしましょう。

ByteArrayOutputStream bout = new ByteArrayOutputStream(); 
int c; 
while ((c = buffR1.read()) != -1) { 
    bout.write(c); 
} 
byte[] barr = bout.toByteArray(); 

そしてbarrの内容でByteArrayInputStreamを使用して関数を呼び出します。

getWords(new ByteArrayInputStream(barr)); 
getWordFeature(new ByteArrayInputStream(barr)); 

私はこのメソッドを変更/リファクタリングすることができない場合、これが最良のソリューションだと思います。このソリューションは、クラスとして適切に実装するとかなりクールです。