1

私のアプリケーションは、 TDAEntryと呼ばれるタイプのテキスト ファイルを編集できます。このような各エントリは、 TDAFormと呼ばれる、その形式を記述する別の種類のファイルに基づいています。TDAEntryテキスト ファイルの最初の行は、それが属するフォームの名前であり、その後に残りのデータ (テキスト形式) が続きます。

このようなファイルを開くために、簡略化した私のコードを次に示します。

InputStream entryInput = new FileInputStream(file);

BufferedReader entryReader = new BufferedReader(
    new InputStreamReader(entryInput)); // PROBLEMATIC #1

String formName = entryReader.readLine();

TDAForm form = new TDAForm(formName);

// create an entry with the right form and the data which follows in entryInput
TDAEntry entry = new TDAEntry(form, entryInput); // PROBLEMATIC #2

これが問題です。のソース コードをInputStreamReader読むと、このクラスのコードを読むことになります。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/sun/nio/cs/StreamDecoder.java#StreamDecoder.read(char%5B%5D%2Cint% 2Cint)

これはバッファリングされます。つまり、約 8000 バイト先まで読み取ります。これにより、InputStream「Problematic #2」の行が空になり、間違った場所になりますが、ファイルの最初の行だけが読み取られたかのように続行したいのです。TDAEntryのコンストラクター内で、ストリーム上に別の種類のリーダーを構築したり、別のことをしたりしたいと思うかもしれません。

明白な解決策の 1 つは、先のバイトを消費しない新しいデコーダーを作成することです。しかし、これを行うより簡単な方法があるかどうか疑問に思っています。この問題にどのように取り組みますか、または同じことを達成するための別のプログラミング構造を提案しますか?

どうもありがとう!

4

3 に答える 3

4

リーダーを渡すだけです。中断したところから読み続けます。

TDAEntry entry = new TDAEntry(form, entryReader); 
于 2013-08-16T20:19:44.917 に答える
1

バッファリングされたバージョンは mark() と reset() をサポートしているため、FileInputStream を BufferedInputStream にラップしてみることができます。

于 2013-08-16T20:39:07.320 に答える
0

バッファを制限したいだけなら、独自のクラスを書く必要はありません。2 番目のコンストラクターを使用してnew BufferedReader(new InputStreamReader(entryInput), 20);、バッファー サイズを制限することができます。

これが必ずしもこの問題を処理する最良の方法であるとは限りません。基本的に、空中でストリームを切り替えることは非常に悪い考えです。ヘッダーとエントリの両方を読み取る独自の InputStream 実装を作成できます。

于 2013-08-16T20:20:01.337 に答える