ただいまjavaを勉強中で、RandomAccessFileでいろいろやってみているところです。
RandomAccessFileで文字列を読み書きするときは
readUTF() と writeUTF() を使うってことでいいんでしょうか?
そう思って今やっているのですが、うまくいかないことがあります。
writeUTF() で文字列をいくつか書き込んで、
後で任意の位置の文字列を書き換えようとしています。
で、まず、いくつデータを書き込んだのか調べるために、
readUTF() とカウンタを使って数えようと思ったんですが、
繰り返しの最中にファイルの末尾に達してしまい、終了してしまいます。
さっきまではそれで数えられていた気がしたんですが、
ちょっとどこかをいじった後、できなくなってしまいました。
上書きについては、元のファイルの、任意の位置の手前までデータを読み込んでファイルポインタを進めて
その後上書きしたいデータを書き込むようにしました。
全体的によろしくないやり方でしたら、そのあたりも指摘していただけるとうれしいです。
どうぞよろしくお願いします。
No.3ベストアンサー
- 回答日時:
どこで例外が発生しているかは確認しましたか?
(a) while(ra.getFilePointer() < ra.length()) { ... }のループでファイルの終わりまで読む
(b) for(i = 0; i < (number * 2); i++) { ... }のループで書き換える位置の前まで読む
(c) 書き換えるデータをwriteUTF() 2回で書く
(d) for(i = cnt; i < datacnt; i++) { ... }のループで書き換えない残りのデータを書く
という手順になっていますが、(a)でファイルの終わりまで読み終わっているので、(b)でその続きを読もうとすると例外が発生するのは当然です。
(a)と(b)の間でファイルポインタをファイルの先頭に戻す必要があります。ファイルを一度クローズしてからオープンし直すか、seek(0L)を呼んでください。
ANo.1で「writeUTF()で書き出されたデータは任意の位置の文字列を書き換えるのには向きません」と書いたのは、たとえばファイルの中の「あいうえお」という文字列の一部だけを書き換えて「あい☆□○♪えお」にするようなことを想定していました。そのような使い方にreadUTF()/writeUTF()が向かないのは確かです。
補足に書いていただいたような使い方ならreadUTF()/writeUTF()でも問題ないと思います。
再び回答ありがとうございます。
まさに、(a)と(b)の間で例外が起こっていました。
ファイルポインタをファイルの先頭に戻したら、ちゃんと書き換えてくれました。
すごいケアレスミスに気づかず、本当に申し訳ありません……。
とても助かりました。
ありがとうございました。
No.2
- 回答日時:
> readUTF() と writeUTF() を使うってことでいいんでしょうか
いえ、普通にwriteやreadでもOKです。
書き込もうとするデータ用にいろいろ用意されているので
適切なものをどうぞ。
> readUTF() とカウンタを使って数えようと思ったんですが、
> 繰り返しの最中にファイルの末尾に達してしまい、終了してしまいます。
ずっとファイルを読んでいけば
そのうち末尾に到達します。
当たり前です。
> で、まず、いくつデータを書き込んだのか調べるために、
いくつ、というのは今までに何バイトのデータをファイルに出力したのか
っていう意味でしょうか?
それともwriteUTFを実行した数ですか?
ファイルにはwriteUTFを実行した情報は書き込まれていないので
writeUTFをするときに自前でカウントしない限り判断できません。
いまいち状況が分からなくて
こちらとしても何を聞き返していいのか・・・。
もう少し情報をお願いします。
この回答への補足
回答ありがとうございます。
No.1の方の解答の補足にも書きましたが、
いくつデータを~というのは、writeUTFを実行した回数です。
forを使ってwriteUTFを実行して、forを抜けた後、カウンタを変数に保存しました。
ファイルを最後まで読み込むと、EOFExceptionで、catchに飛んでしまいますよね。
そうならないように、ファイルを全部読み込むことはできないんでしょうか?
もしかして、catchからtryの中に戻ってくることができるんでしょうか。
No.1の方が提案してくれた、
read(byte[] b)やwrite(byte[] b)についていろいろ調べたんですが、
世の中では常識なのか、これについて説明してくれるところはまだ見つかりません。
どう使うのか、どうしてこれを使うのか、よくわからないままです。
情報が足りなくてすみません。
まだ足りなかったらもっとすみません。
No.1
- 回答日時:
どのような書き換えをしたいのか、どんなコードを書いたのか、補足に貼ってください。
> RandomAccessFileで文字列を読み書きするときは
> readUTF() と writeUTF() を使うってことでいいんでしょうか?
writeUTF()で書き出されたデータは任意の位置の文字列を書き換えるのには向きません。
read(byte[])とwrite(byte[])を使ってbyteの配列を読み書きするほうが汎用性は高いでしょう。
> いくつデータを書き込んだのか調べるために、
> readUTF() とカウンタを使って数えようと思ったんですが、
数えているのは文字数ですか、それともバイト数ですか? その両者を区別しないと期待した結果は得られないと思います。
この回答への補足
回答ありがとうございます。
やりたいのは、名前と電話番号を読み書きすることです。
数えたいのは、名前と電話番号が何セットあるかということです。
書いたコードです。
String name = "ドラえもん";
String pnumber = "090-1111-1111";
RandomAccessFile ra = new RandomAccessFile(fname, "rw");
while(ra.getFilePointer() < ra.length()) {
data[i] = ra.readUTF();
i++;
}
int datacnt = i;
System.out.println("データの数:" + (datacnt / 2));
int number = 2;//書き換える位置
int cnt = 0;
for(i = 0; i < (number * 2); i++) {
ra.readUTF();
cnt++;
}
ra.writeUTF(name);
cnt++;
ra.writeUTF(pnumber);
cnt++;
for(i = cnt; i < datacnt; i++) {
ra.writeUTF(data[i]);
}
勉強がぜんぜん足りてないからなんでしょうが、
こうする以外に思いつきません。
すみませんがよろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- PDF 2つのPDFを重ねる方法はありますか? 4 2023/01/30 14:04
- マンガ・コミック 漫画家はみな書道が得意か? 漫画家で悪筆の人はいるか? 5 2023/08/16 09:05
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Excel(エクセル) 【VBA】指定フォルダに格納中のテキストファイルをエクセルで処理し結果のエクセルを新規フォルダに保存 1 2022/03/25 14:19
- その他(プログラミング・Web制作) Windowsのマクロプログラムで、こんなことできますか? 3 2022/06/28 14:30
- Visual Basic(VBA) EXCEL VBA 単語置き換え について質問です ブック名 ぶぶぶ シート名 ししし セル V3〜 3 2023/03/08 01:41
- システム CSVファイルのマッピング処理の省力化 1 2022/11/24 00:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
なぜデータの整合性を確認する...
-
EXCEL VBAでテキストファイルの...
-
バイナリファイルの比較につい...
-
バイナリエディタのつかいかた
-
入力ファイルをバイナリにする利点
-
MacからWinにファイルを添付す...
-
fwriteでの書き込み
-
C言語とシリアル通信の送受信...
-
【python】Excelファイルを読み...
-
awkの文字列比較はPOSIXロケー...
-
FTPでエクセルをPUTするとファ...
-
エクセルVBA 2千万行のCSVファ...
-
テキストデータをSQLServerに取...
-
バイナリーデータの一部データ...
-
エラー:ストリームの終わりを...
-
バイナリデータ処理
-
C言語でBMPファイルの内容を表...
-
ページ読み込み時に自動的にsub...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッファとは何ですか
-
Microsoft VBAで2GBを超えるフ...
-
EXCEL VBAでテキストファイルの...
-
エクセルVBA 2千万行のCSVファ...
-
VBA バイナリ―から文字列にす...
-
ページ読み込み時に自動的にsub...
-
【python】Excelファイルを読み...
-
エラー:ストリームの終わりを...
-
EOF
-
テキストデータをSQLServerに取...
-
MacからWinにファイルを添付す...
-
バイナリエディタのつかいかた
-
リストビュー ⇔ 別ファイル構...
-
入力ファイルをバイナリにする利点
-
24ビットのWaveデータの中身に...
-
FTPでエクセルをPUTするとファ...
-
VB2010 COMポートからのバイナ...
-
バイナリ形式のXMLファイルを読...
-
JavaScriptの実行速度が遅い
-
バッファサイズについて
おすすめ情報