- ベストアンサー
テキストファイルの読み書き
テキストファイルの途中や最後に行を挿入する方法がわかりません。 一度String型の配列に入れて順番を入れ替えるとか考えたのですが、 もっとうまい方法を知っていたら教えて下さい。 よろしくお願いします。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
回答がないようなので、横から失礼します。 >ただif文でファイルを閉じる判断されていますが、 >そのまま閉じてはいけないのでしょうか? たとえば、FileWriterを使う場合、こう書きたくなります。 try { FileWriter fw = new FileWriter("test.txt"); fw.wirte("あいうえお"); } catch (IOException ex) { System.out.println("書き込みエラー"); } finally { try { fw.close(); } catch (IOException ex) {} } しかし、コンパイルエラーとなります。 変数fwの宣言がtry節にあるためfinally節のfwはスコープ外になってしまいます。 よって、こう書くことが考えられます。 FileWriter fw; try { fw = new FileWriter("test.txt"); fw.wirte("あいうえお"); } catch (IOException ex) { System.out.println("書き込みエラー"); } finally { try { fw.close(); } catch (IOException ex) {} } しかし、これでもエラー。 fw = new FileWriter("test.txt");の行で例外が発生した場合、fwが初期化されないまま、finally節を通る可能性があり、警告が出ます。 よって、こう書き直します。 FileWriter fw = null; try { fw = new FileWriter("test.txt"); fw.wirte("あいうえお"); } catch (IOException ex) { System.out.println("書き込みエラー"); } finally { try { fw.close(); } catch (IOException ex) {} } 変数fwをnullで初期化しましたが、しかし、まだ問題が残ります。 やはり、fw = new FileWriter("test.txt");行で例外が発生した場合、fw が nullのままfinally節にいたってしまいます。 今度はNullPointerExceptionが発生してしまいます。 これを回避するためには、 FileWriter fw = null; try { fw = new FileWriter("test.txt"); fw.write("あいうえお"); } catch (IOException ex) { System.out.println("書き込みエラー"); } finally { if (fw != null) { try { fw.close(); } catch (IOException ex) {} } } こう書く必要があるわけです。 また、こういう書き方もできると思います。 try { FileWriter fw = new FileWriter("test.txt"); try { fw.write("あいうえお"); } finally { fw.close(); } } catch (IOException ex) { System.out.println("書き込みエラー"); }
その他の回答 (4)
- javakari
- ベストアンサー率66% (4/6)
回答が遅くなって申し訳ないです^^; if文の説明は、PecoPlusさんの説明のとおりです。 PecoPlusさん、ありがとうございましたm(__)m
- javakari
- ベストアンサー率66% (4/6)
ファイルの最後に挿入するだけなら、 FileWriterでappendをtrueに指定するとできますヨ。 import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; /** * ファイルの最後に * 文字列を追加する */ public class InsertTest { public static void main(String[] args) { //ファイル名指定 File file = new File("test.txt"); FileWriter fw = null; PrintWriter pw = null; try { fw = new FileWriter(file, true);//ファイル最後に追加するモード pw = new PrintWriter(fw); pw.println("あいうえお");//追加する文字 } catch (IOException e) { e.printStackTrace(); } finally { if(pw != null){ pw.close(); } if(fw != null){ try { fw.close(); } catch (IOException e){} } } } }
- tachiwa
- ベストアンサー率34% (25/73)
同じファイルに書くというのはあまりに乱暴です。このアルゴリズムでは中身が消えてしますでしょう。 2行目と最後に空白行を入れるように変えてみました。ご自身で色々試す事が重要ですよ。 import java.io.*; class NextHelloEditor02 { public static void main(String args[]){ try{ BufferedReader reader = new BufferedReader(new FileReader("test.txt")); PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter("test02.txt"))); String line; int i = 0; while((line = reader.readLine())!= null){ writer.println(line); i++; if(i == 2){ //2行目なら空白を入れる writer.println(" "); } } writer.println(" ");//最後に空白を入れる。 reader.close(); writer.close(); } catch(IOException e){ System.out.println(e); } } }
お礼
ご返答ありがとうございます。 同じファイルを操作しないものなのですね。 確かに同じファイルにしたら中身が全て消えましたし。 挿入のほうはうまくいきました。 ありがとうございました。
- tachiwa
- ベストアンサー率34% (25/73)
一行ごとに空白行を入れるサンプルです。参考になりませんか。 import java.io.*; class NextHelloEditor02 { public static void main(String args[]){ try{ BufferedReader reader = new BufferedReader(new FileReader("test.txt")); PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter("test01.txt"))); String line; while((line = reader.readLine())!= null){ writer.println(line); writer.println(" "); } reader.close(); writer.close(); } catch(IOException e){ System.out.println(e); } } }
補足
早速の回答ありがとうございます。 読み込みと書き込みのファイルを同じファイルで、 指定した何行目かまたは最後の行だけを操作する事はできないのでしょうか。
補足
ご返答ありがとうございます。 早速試してうまくいきました。 ただif文でファイルを閉じる判断されていますが、 そのまま閉じてはいけないのでしょうか?