プロが教える店舗&オフィスのセキュリティ対策術

例えば以下のようなCSV形式のデータが10000行あるとします。
 1,10,15,3
 2,1,5,1
 70,2,4,2
 2,4,5,6
 11,1,9,9
 ・・・

上記ファイルから、例えば9999行目を取得したい場合、
現在は以下のような手順で9998行をループで読み込んでから、
9999行目を取得しています。(エラー処理などは省いています)
 BufferedReader br = new BufferedReader(new FileReader("hoge.csv"));
 for( int i=0; i<9998; i++ ){ br.readLine(); }
 System.out.println("9999行目="+br.readLine());

ただし、上記の通りループを9998回まわし、
データを1行ずつ読み込むのは非常に効率が悪いです。
できれば、br.readLine(9999); といった感じで行数を直接指定できる方法があるならば、
無駄な処理を省けて見栄えも速度も良くなると思うのですが、
Javaの標準のクラスではこういったことは可能なのでしょうか?

私なりに調べてみたのですが調べ方が悪いのか知識が及ばないため、
こちらで質問させていただきました。
もしご存知の方がおられましたらアドバイスいただけますと助かります。
よろしくお願いします。

A 回答 (3件)

Javaはしばらくいじってないのであれですが・・・



仮にreadline(9999)というような関数があるとしても内部的には
for(int i=0;i<9998);i++){
br.readline()
}
と同じことをしていて スペック的にはほとんど変わらないはずです。
9999行目を読み込むためには 1行目から順に最初からファイルを読んでいって改行の数を数えてやる必要があるので・・・


見栄えがというのであれば自分でBufferedReader を継承して独自のクラスを作ってしまったらいかがでしょう?
readline(int line)だけ書いてやるだけだから5分とかからないし・・・


なおJavaは最近いじってないので標準関数でご希望のものがあるかはわかりませんが
自分だったらそんなことで悩んでる暇があったら自分で書いちゃいます。
    • good
    • 0
この回答へのお礼

改行コードがいくつ入ってるかを調べないと駄目ということは、
あまり速度的にも改善は見込めなさそうですね。
見栄えよりも出来れば速度的に改善したかったので、
改善しようと思ったらデータの形式自体を変えないと無理でしょうか…。
ご回答ありがとうございました。

お礼日時:2011/04/19 16:41

「各行の長さが一定である」などの条件がない限り, 本質的にはどうしようもありません. ほかの人も書かれていますが, 「見栄え」はき

れいになっても効率は変わらないです.
    • good
    • 1
この回答へのお礼

見栄えよりも出来れば速度的に改善したかったので、
他の方も仰るとおりデータの形式自体を変えないと無理みたいですね…。
でもこれでモヤモヤが取れました。
ご回答ありがとうございました。

お礼日時:2011/04/19 16:41

JAVAを全く知らない私が言うのもなんですが、


特定の行ということは、改行コードがいくつ入っているということを読んで調べないと
どこから始まっているのかわからないとおもいます。(のでむりだとおもいます。)
    • good
    • 0
この回答へのお礼

うーんなるほど。
改行コードがいくつ入ってるかを調べないと駄目ということは、
あまり速度的にも改善は見込めなさそうですね。
ご回答ありがとうございました。

お礼日時:2011/04/19 16:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A