質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

5579閲覧

BufferedWriter, BufferedReader を使った書き込み

otftrough

総合スコア476

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

1クリップ

投稿2015/10/21 14:01

import java.IO.*;
Javaでlog.txtというファイルに、改行して下へ下へ書き込みをしていきたいのですが、コンパイルはできますが思うように動いてくれません。
以下の3つの変数は初期化してあります。
int sumCustomer; //客の合計人数
int sumPrice; //購入金額の合計
int price; //商品の価格

java

1try{ 2 //log.txtをreaderとwriterで開く 3 BufferedReader br = new BufferedReader(new FileReader("log.txt")); 4 BufferedWriter bw = new BufferedWriter(new FileWriter("log.txt")); 5 6 //1行ずつ調べて、何か書かれていたら改行して次の行を調べる 7 while(br.readLine() != null) bw.newLine(); 8 9 bw.write(sumCustomer + "人目"); 10 bw.newLine(); 11 bw.write((sumPrice / price) + "個 ... " + sumPrice + "円"); 12 13 br.close(); 14 bw.close(); 15} catch(IOException e){}

これだと、実行するたびにファイルの1行目から上書きされてしまって、前のデータが残りません。
どこがおかしいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

FileWriterのコンストラクタで,第2引数にtrueを指定すると「追記モード」になり,存在するファイルに追記できます.

質問とは関係ないですが,br,bwなどのリソースはfinallyブロックでcloseするか,Java7以降ならtry-with-resources文を使う事をおすすめします.

java

1BufferedReader br = null; 2BufferedWriter bw = null; 3try{ 4 br = new BufferedReader(new FileReader("log.txt")); 5 bw = new BufferedWriter(new FileWriter("log.txt")); 6 //略 7} catch (IOException e){ 8} finally { 9 try{ 10 if(br != null) br.close(); 11 } catch (IOException e){} 12 try{ 13 if(bw != null) bw.close(); 14 } catch (IOException e){} 15}

java

1try(BufferedReader br = new BufferedReader(new FileReader("log.txt")); 2 BufferedWriter bw = new BufferedWriter(new FileWriter("log.txt"))){ 3} catch (IOException e){}

投稿2015/10/21 14:08

編集2015/10/21 14:15
swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otftrough

2015/10/21 14:23

まずtry-catch-finallyの使い方を勉強し直してみます。 結局、私の文はどこがおかしくて改行されなかったのでしょうか?
swordone

2015/10/21 14:26

「改行されないこと」が問題だったのですか? あと根本の原因は,「同じファイルを使ってbr,bwを生成している」というところにありそうですが…
guest

0

ベストアンサー

FileWriterの追記モードと、try-with-resourcesについては、swordoneさんの書かれている通りです。

追記するのであれば、BufferedReaderの部分は丸ごと要らなそうですね。
(どうしても追記の時だけ改行を付けたいのであれば、そのままで良いですけど)

また、ファイルに改行付きのテキストで書き込むような用途であれば、BufferedWriterよりもPrintWriterのほうが便利です。

lang

1// Java7以降 2 3// import java.io.*; 4 5// System.out.printlnのような感覚で使える 6try (PrintWriter out = new PrintWriter(new FileWriter("log.txt", true))) { 7 out.println(sumCustomer + "人目"); 8 out.println((sumPrice / price) + "個 ... " + sumPrice + "円"); 9 10 // フォーマッターを使うとさらに分かり易い 11 // out.printf("%d個 ... %d円%n", (sumPrice / price), sumPrice); 12} catch (IOException e) { 13 e.printStackTrace(); 14}

参考リンク:

FileWriter - Java SE 8 API ドキュメント
http://docs.oracle.com/javase/jp/8/api/java/io/FileWriter.html

PrintWriter - Java SE 8 API ドキュメント
http://docs.oracle.com/javase/jp/8/api/java/io/PrintWriter.html

投稿2015/10/21 14:22

編集2015/10/21 14:33
argius

総合スコア9388

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

otftrough

2015/10/21 14:39

なにそれ超便利
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問