- PR -

DataInputStreamでのカレント操作

投稿者投稿内容
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-11-22 08:45
引用:

かんぱちさんの書き込み (2006-11-18 07:32) より:
FileInputStream fis = new FileInputStream(_filepath);
DataInputStream dis = new DataInputStream(fis);
boolean keyFlg = true;
 while (keyFlg) {
  line = dis.readLine();
  if (line == null) {
   keyFlg = false;
  } else {
   //次行チェック
   if (dis.readLine()==null) {

   }
  }
 }


最大でもひとつ手前までだけが分かれば良いのならば、1行分のバッファー用の String をひとつ持っておき、それを使いまわすほうが良いと思います。
それだけでできることなのに、ストリームをバックワード方向にさかのぼるなどといったことは、(言葉は悪いですが)おぞましいと感じます。
コード:
 String lastLine = null;
 while (true) {
  String line = dis.readLine();
  if (line == null) {

   // 終端処理いろいろ。。。

   break;
  }

  // lastLine と line の両方を使って、うんちゃらかんちゃら。。。

  lastLine = line;
 }


のような感じが良いと思います。ただし、これはこれでパズルのようであり、分かりにくいこともあります。
バグのなさを優先するならば、緊急避難的に、
コード:
 List lines = new ArrayList();
 while (true) {
  String line = dis.readLine();
  if (line == null) {
   break;
  }
  lines.add(line);
 }

 // あとは lines を使ってのんびり処理。。。



みたいなほうが、誰であっても見た目は分かりやすいとは思います。しかし、プロとしてはやるべきではないでしょうけど。。。

引用:

dis.readLine()は非推奨を承知の上、あえてやってます。


良く分かりませんが、では、ノーコメントで。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-11-22 16:56
引用:

unibonさんの書き込み (2006-11-22 08:45) より:
最大でもひとつ手前までだけが分かれば良いのならば、1行分のバッファー用の String をひとつ持っておき、それを使いまわすほうが良いと思います。



そうですね。それで簡単にできる場合も多いと思います。

引用:

それだけでできることなのに、ストリームをバックワード方向にさかのぼるなどといったことは、(言葉は悪いですが)おぞましいと感じます。



□ mark()/reset()の場合

「バックワード方向にさかのぼる」というよりは、

不定長なストリーム上に適切なWindowサイズを持つSavepointを設けて、
仮定と異なるデータの場合にはSavepointまでRollbackする形にできます。

想定以上の量のデータを読み込ませないように工夫する必要はありますが。

□ Pushback系の場合

本来ストリーム上に存在しなかったデータでも書き戻せる分、
謝ったデータを混入させてしまう可能性があります。

逆手に取って意図的に細工したデータを混入させることにも使えますけど。

#unibonさんの表現だと、これが一番おぞましいかと。

□ 変数で次の行を管理する場合

ひとつのメソッドで簡潔に解析できる場合はシンプルに作れますが、
解析が複雑だったり、複数のメソッドで構成される場合は
より広いスコープで扱えるように管理する必要が出てきます。

どちらにせよ、変数の管理を誤るバグは潜みやすいです。

というわけで、どれも一長一短なんですよね。

スキルアップ/キャリアアップ(JOB@IT)