- PR -

同一ファイルの読み込み、書き込みってできません?

投稿者投稿内容
kami
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 95
お住まい・勤務地: 大手町
投稿日時: 2005-04-20 13:34
こんにちわ、よろしければまたお知恵をお借りできればと思います。

今現在、カードリーダー(ドアなどについてる)から、IDカードをかざして
ロックをはずして入退室するというものの、ログ解析のシステムを作ってます。

昨日はそれの表示の方法でこちらにお邪魔させていただきました。

今日はですね、ログ削除に関しての質問です。
たとえば、「log.txt」というログが記載されたファイルがあるとします。
ログ削除期間を選択し、実行ボタンを押します。
(2005年4月31日までのログを削除します。) といった感じです。

そうしたときに
FileReader fr = new FileReader(( fPath ));
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(( fPath ));
BufferedWriter bw = new BufferedWriter(fw);

としました。
これは、元ファイルからヒットしなかった部分(削除しない部分)だけを検索し
元ファイルから、元ファイルに上書きしようとしてこう考えました。

ですが、読み込んだあとにすぐライターを使うとその時点でtxtファイルの中身が
消去されてしまいます。

グーグルで調べたところ、全部が 読み込みファイルを書き込みファイルが別でした。
(調べた範囲ないでは = 全部)

これって、同ファイルからはできないってことなのでしょうか?

また、別に良い方法や一般的な方法などがありましたら教えていただければと思います。
昨日に引き続きですがよろしくお願い致します。





シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-04-20 13:49
追加モードでなければ、同一パスへの書き込みは上書きになると思いますが…

Readerを明示的にclose()を呼び出しましたか?
していないと、GCで処分されるまでReaderのFDが開きっぱなしになるので、
タイミングによってはWriterのopen操作やwrite操作が失敗してしまうか
もしれません。
kami
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 95
お住まい・勤務地: 大手町
投稿日時: 2005-04-20 13:54
と、いうことは、、、私のやり方がまずいって事になります。

FileReader fr = new FileReader(( fPath ));
BufferedReader br = new BufferedReader(fr);
FileWriter fw = new FileWriter(( fPath ));
BufferedWriter bw = new BufferedWriter(fw);

for文 で 日付の変数をまわす{
if(文字列検索){
削除するものじゃなければ
  bw.write(変数);
} // if 文
} // for 文

fr.close();
fw.close();

って感じになってます。

これは、読み込んだものを一回バッファなりにいれて
リーダーを閉じ、ライターを開いて書き込みをしろ って
ことです?


シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-04-20 14:00
それはかなりまずそうですね。
こう変えてください。

FileReader fr = new FileReader(( fPath ));
BufferedReader br = new BufferedReader(fr);
StringWriter bw = new StringWriter();

for文 で 日付の変数をまわす{
if(文字列検索){
削除するものじゃなければ
  bw.write(変数);
} // if 文
} // for 文

br.close();
bw.close();

FileWriter nfw = new FileWriter(( fPath ));
BufferedWriter nbw = new BufferedWriter(nfw);
nbw.write(bw.toString());
nbw.close();


[ メッセージ編集済み 編集者: シュン 編集日時 2005-04-20 15:32 ]
kami
ベテラン
会議室デビュー日: 2004/08/21
投稿数: 95
お住まい・勤務地: 大手町
投稿日時: 2005-04-20 14:07
返信ありがとうございます。

一時退避しないとだめでしたか、、、
どうもありがとうございました^^

これから、打ち直しをしてみたいと思います。

以上です、ありがとうございました。
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2005-04-20 15:16
引用:

シュンさんの書き込み (2005-04-20 14:00) より:
FileReader fr = new FileReader(( fPath ));
BufferedReader br = new BufferedReader(fr);
StringWriter bw = new StringWriter();

for文 で 日付の変数をまわす{
if(文字列検索){
削除するものじゃなければ
  bw.write(変数);
} // if 文
} // for 文

br.close();
bw.close();

FileWriter nfw = new FileWriter(( fPath ));
BufferedWriter nbw = new BufferedWriter(fw);
nbw.write(bw.toString());
nbw.close();



えええ〜〜〜。これでもかなりまずそうですが...。

質問者に自分で気づいてもらうためにあえて「どこが」「どう」とは指摘しないでおきます。
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-04-20 15:30
オンメモリに全文を一時的にもつのが厳しいこともあるかと思い
ますが、そういう場合はこんな感じでファイルに退避ですかね。

File src = new File(fPath);
FileReader fr = new FileReader(src);
BufferedReader br = new BufferedReader(fr);
File tmp = File.createTempFile("foo","bar");
FileWriter fw = new FileWriter(tmp);
BufferedWriter bw = new BufferedWriter(fw);

for文 で 日付の変数をまわす{
if(文字列検索){
削除するものじゃなければ
  bw.write(変数);
} // if 文
} // for 文

br.close();
bw.close();

if(src.delete()){
 tmp.renameTo(new File(fPath));
}

[ メッセージ編集済み 編集者: シュン 編集日時 2005-04-20 15:31 ]
びしばし
大ベテラン
会議室デビュー日: 2002/03/13
投稿数: 181
投稿日時: 2005-04-20 15:46
あ、いや、シュンさんを責めているわけでは...ってそのように見えますね。すみません。

引用:

シュンさんの書き込み (2005-04-20 15:30) より:
オンメモリに全文を一時的にもつのが厳しいこともあるかと思い
ますが、そういう場合はこんな感じでファイルに退避ですかね。



おっしゃるとおりですね。
タイトルに沿った、というか質問の本質部分の回答は「テンポラリファイルを作成するといいよ」でいいと思います。(ディスクフル時はお手上げ)

# で、ほかの部分もまだまずいところがあるのですが、それは本人に気づいてもらわないとこの先(本人も、振り回される周りも)困ることなので、指摘しないでおきます。

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