Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

ファイルの読込み

色々考えたのですが解決策が見つからず…。

テキストファイル
abc
defg
hijkl
opqrst

例えば上記のようなファイルがあってRandomAccessFileクラスを使用して読み込もうとしています。3行目まで順次に読み込んでその後2行目、1行目と逆順に読み込もうとしているのですがファイルポインタの位置を行毎に戻すコマンドってないのですか?バイト毎に戻すコマンドはあったのですが…

17

回答

6819

閲覧

17件の回答

評価

0

質問する場合は、

>色々考えたのですが

の内容を書いてみましょう。
実際には何もしていないのに、とにかく聞いちゃおうという人もいて、こういう人にはあまり回答したくなりません。
本当に試しているのなら、惜しいところまで行っているのか、全然違うことをしているのか、それによって回答が違います。

ひとまずヒントだけ書いておけば。
バイト位置しか扱ってくれないのなら、行番号からバイト位置を、自分で引けるように作っておけばいいということになります。
プログラミングは、自分のしたいことをするのに一番適していそうなモノを用いつつも、それで足りない部分を自分で作る、ということがたくさんあります。

評価

0

返事有難うございます。
そのやり方もあるのですが、私が読み込もうとしているファイルはとても大きすぎるため、そのやり方でjavaを起動するとメモリ不足になってしまうためそのやりかたは使えませんでした。なので配列などによるメモリを使わずに読み込むやりかたを考えています。

評価

0

そこでC言語ではseekコマンドによって行単位でファイルポインタを移動することができたのですが、javaで探したところそのようなコマンドが見当たらないので質問させていただきました。

評価

0

>そのやり方もあるのですが、私が読み込もうとしているファイルはとても大きすぎるため、そのやり方でjavaを起動するとメモリ不足になってしまうためそのやりかたは使えませんでした。
えーと…いったい何千万行のものを読みこもうとしているんでしょうか?

評価

0

このファイルと他にも何個かのファイルを読み込むのでメモリ不足になってしまいました。1ファイルだいたい10Gぐらいです。

評価

0

すいません1Gです。

評価

0

>C言語ではseekコマンドによって行単位でファイルポインタを移動することができた
私もCを使ってる人間なんですが、Cで「seek」なるコマンドは記憶にないんですが。

で、ファイルを全部メモリに読みこむと書いた覚えはないんですが。

評価

0

とりあえず、いずれにせよメモリは増やしておかねばならないようですね。
Java VMへの引数に

-Xmx720M

のような指定をしておけば、実行時に確保するメモリを増やすことができます。
これでもダメであれば、同時にファイルを開かないように、設計を変更するしかないでしょう。

評価

0

c言語にはseekはあります。
500000行ぐらいです。それだけの配列の領域を取るだけでも重くなってしまい、そのファイルを4つも読み込むとメモリ不足になってしまうのです。

私は別にプログラムにアルゴリズムを聞いているわけではありません。ただ単に行単位でファイルポインタを移動することができるコマンドの有無を聞いているだけです。そんなに意地悪をしないでください。

評価

0

ありません。以上です。

評価

0

もしかして関数のfseekの事じゃないですか?

http://cham.ne.jp/piro/p_stdfunc.html

評価

0

こんなのが役にたつかも。

キーワードに到達するまでファイル・ポインタを進める 
http://www.sage-p.com/compone/toda/blex2.c.htm#idxF

評価

0

すいません。行毎でしたよね?
上記ページに
”次の行までファイル・ポインタを進める”
という項目があります。 

評価

0

すいません。JAVAの質問でしたね。
間違えました。

評価

0

いや、fseekもバイト位置なんですよ…。

評価

0

逆に聞きたいんですが、
ファイルの1行のデータが固定長でも無いのに、ランダムアクセスできるんですか?
私はC・Javaを問わず無理だと思ってたんですけど。

BufferedReaderで不要な行を読み飛ばすか、行の末尾を空白埋めして固定長データにするのが良いんじゃないでしょうか?

評価

0

いわゆる「ランダムアクセス」とは違いますが、「ポインタを自由に移動できる」という点が重要です。
これができれば、ランダムアクセスと言って問題ないです。
あとは、「自分が」どれだけ作り込むかなので。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。