Javaで、テキストファイルの指定した行を修正するプログラムを考えてるのですが分かりません。

どなたかご教授くださいませ。
具体的には、下記の内容のテキストファイルがあったとし、
1行目 あいうえお,かきくけこ
2行目 さしすせそ,たちつてと
3行目 なにぬねの,はひふへほ
・修正するメソッドに「まみむめも,やゆよ」を渡し、
結果
1行目 あいうえお,かきくけこ
2行目 まみむめも,やゆよ
3行目 なにぬねの,はひふへほ
となる。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2009/11/09 14:22:49
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:lizy No.2

回答回数45ベストアンサー獲得回数14

ポイント70pt

入力ファイルを1行ずつ読み込んで、修正対象行なら修正内容を出力、それ以外は入力ファイルの内容をそのまま出力するのが良いかと思います。

指定された行番号に対応する行の内容を置き換えるのであれば、こんな感じになります:

static void replace(LineNumberReader in, PrintWriter out, int lineNumber,
	String s) throws IOException {

	String line;
	while ((line = in.readLine()) != null) {
		if (in.getLineNumber() == lineNumber) {
			out.println(s);
		} else {
			out.println(line);
		}
	}
}
id:pikab1

回答ありがとうございます。

実際使うとしたら下記のような感じでしょうか?

これだと書き込む位置が指定できてないので、どうしたらいいものかと・・・。

せっかく教えて頂いたのに分からなくて申し訳ないです。

public static void main(String[] args) throws IOException {

BufferedReader br = null;

PrintWriter pw = null;

LineNumberReader lnr = null;

try {

br = new BufferedReader(new FileReader(path));

lnr = new LineNumberReader(br);

pw = new PrintWriter(new BufferedWriter(new FileWriter(path)));

replace(lnr, pw, 2, "まみむめも,やゆよ");

} catch(Exception e) {

e.printStackTrace();

} finally{

try{

if(pw != null){

pw.close();

}

if(lnr != null) {

lnr.close();

}

}catch(Exception n){

}

}

}

static void replace(LineNumberReader in, PrintWriter out, int lineNumber,

String s) throws IOException {

String line;

while ((line = in.readLine()) != null) {

if (in.getLineNumber() == lineNumber) {

out.println(s);

} else {

out.println(line);

}

}

}

2009/11/09 00:42:04

その他の回答2件)

id:velsel No.1

回答回数56ベストアンサー獲得回数6

ポイント20pt

プログラミングの性質上、一度テキストファイルを全て読み込み、編集し、その後にテキストに全て書き出すという流れが必須です

下記ページの文言丸ごとではありませんが、どこまでがわからないのかがわからないのでここまでしか助言することができません

 1. FileStreamのコンストラクタなどで、ファイルを開く。

 2. StreamReader.ReadToEnd()ですべてStringへ読み込む。

 3. そのStringで検索、置換をかける。

 4. そのStringを、StreamWrite([String])で一気に書き込む。

 5. Flush()して、ファイルを閉じる。

http://dobon.net/vb/bbs/log3-12/6804.html


もう少し具体的な、修正の性質や処理内容(検索・固定行列)などを挙げていただかなければなんともいえません


参考までに

http://www.javadrive.jp/start/stream/index.html

id:lizy No.2

回答回数45ベストアンサー獲得回数14ここでベストアンサー

ポイント70pt

入力ファイルを1行ずつ読み込んで、修正対象行なら修正内容を出力、それ以外は入力ファイルの内容をそのまま出力するのが良いかと思います。

指定された行番号に対応する行の内容を置き換えるのであれば、こんな感じになります:

static void replace(LineNumberReader in, PrintWriter out, int lineNumber,
	String s) throws IOException {

	String line;
	while ((line = in.readLine()) != null) {
		if (in.getLineNumber() == lineNumber) {
			out.println(s);
		} else {
			out.println(line);
		}
	}
}
id:pikab1

回答ありがとうございます。

実際使うとしたら下記のような感じでしょうか?

これだと書き込む位置が指定できてないので、どうしたらいいものかと・・・。

せっかく教えて頂いたのに分からなくて申し訳ないです。

public static void main(String[] args) throws IOException {

BufferedReader br = null;

PrintWriter pw = null;

LineNumberReader lnr = null;

try {

br = new BufferedReader(new FileReader(path));

lnr = new LineNumberReader(br);

pw = new PrintWriter(new BufferedWriter(new FileWriter(path)));

replace(lnr, pw, 2, "まみむめも,やゆよ");

} catch(Exception e) {

e.printStackTrace();

} finally{

try{

if(pw != null){

pw.close();

}

if(lnr != null) {

lnr.close();

}

}catch(Exception n){

}

}

}

static void replace(LineNumberReader in, PrintWriter out, int lineNumber,

String s) throws IOException {

String line;

while ((line = in.readLine()) != null) {

if (in.getLineNumber() == lineNumber) {

out.println(s);

} else {

out.println(line);

}

}

}

2009/11/09 00:42:04
id:MarimoKoke No.3

回答回数3ベストアンサー獲得回数0

ポイント20pt

こんな感じかな?

>|Java|

private void hoge(int line, String str) {

try{

File file = new File("test.txt");

BufferedReader br = new BufferedReader(new FileReader(file));

ArrayList<String> strArr = new ArrayList<String>();

String s;

while((s = br.readLine()) != null) strArr.add(s);

br.close();

BufferedWriter bw = new BufferedWriter(new FileWriter(file));

for (int i = 0; i < strArr.size(); i++) {

if (i == line-1) bw.write(str + "\n");

else bw.write(strArr.get(i) + "\n");

}

bw.close();

}catch(Exception e){

System.out.println("ファイル読み込み失敗");

}

}

||<

  • id:lizy
    >>
    これだと書き込む位置が指定できてないので、どうしたらいいものかと・・・。
    <<

    書き込む位置=行番号で指定して行を丸ごと置き換える、と解釈したので上記のようなサンプルコードを書いてみました。

    行単位ではなく特定の位置(n行目のm番目の文字)という事でしょうか。あるいは行番号ではなく、特定の文字が出てきたら違う内容にする、といった感じでしょうか。
  • id:MarimoKoke
    MarimoKoke 2009/11/09 02:13:02
    すいません、可能であれば下記の部分を修正してもらえませんか?
    こちらからは修正できません。

    File file = new File("test.txt");
  • id:pikab1
    いえ、おっしゃる通り
    書き込む位置=行番号で指定して行を丸ごと置き換える
    の解釈で問題ありません。

    とりあえず、
    lizy様の方法だと、バッファに全て取り込んでから一行ずつ修正対象行かを確認して書き込む。
    marimokoke様の方法だと、Listに全て取り込んでから〃。

    という事ですね。ご解答ありがとうございました。

    >> marimokoke様
    本文修正の件ですが、直し方が分かりません・・・。ので、とりあえず管理者に問い合わせました。
  • id:lizy
    とりあえず解釈が間違ってなかったようで良かったです。

    >lizy様の方法だと、バッファに全て取り込んでから一行ずつ修正対象行かを確認して書き込む。

    私の方法の場合、全てを取り込むのではなく「入力から1行読んで、出力に1行書き出す」を入力の最後まで繰り返す形になっています。

    で、書き出す際に現在の行番号を確認して、置き換えたい行番号の場合は入力側の内容ではなく与えられた文字列を代わりに出力する、としています。

    置換の条件が行番号だけであれば、全部を取り込まなくても行単位の処理で対処可能なので、ファイルサイズによっては使用メモリを押さえられるかと思います(メモリには1行分しか持たないので)
  • id:pikab1
    br = new BufferedReader(new FileReader(path));
    lnr = new LineNumberReader(br);

    この時点でバッファに全データを持つので同じだと思ったのですが、
    まず、バッファの意味が分かってないので、駄目ですね。ちょっと勉強し直します。

    とりあえず、この質問としては終了させていただきます。
    ありがとうございました。
  • id:hatena
    回答にローカル環境が含まれるとのことでしたので、3の回答につき、はてなにより訂正を行いました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません