3

a への書き込みBufferedWriterと への書き込みを切り替えるために a を使用しようとしていますが、ファイル以外への書き込みにa を使用したことはありません。FileStringBufferedWriter

このコンパイル可能なコードを見てください:

public static void main(String[] args) {
    try (BufferedWriter fileWriter = new BufferedWriter(new FileWriter(new File("file.txt")));
            StringWriter sw = new StringWriter();
            BufferedWriter stringWriter = new BufferedWriter(sw)) {

        LinkedList<Record> records = new LinkedList<>();
        records.add(new Record("name1", "text1", 20.4));
        records.add(new Record("name2", "text2", -78));
        records.add(new Record("name3", "text3", 11.56));
        records.add(new Record("name4", "text4", 56));
        records.add(new Record("name3", "text3", -44));

        for(Record record : records) {
            BufferedWriter writer;
            if(record.amount < 0) {
                writer = stringWriter; // write to string if amount is less than zero
            } else {
                writer = fileWriter; // write to file if not
            }

            writer.append(record.name);
            writer.append(",");
            writer.append(record.text);
            writer.append(",");
            writer.append(String.valueOf(record.amount));
            writer.newLine();

        }

        String less_than_zero_amounts = sw.toString();
        System.out.println("Less than zero:" + less_than_zero_amounts);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

static class Record {
    String name;
    String text;
    double amount;

    public Record(String name, String text, double amount) {
        this.name = name;
        this.text = text;
        this.amount = amount;
    }

    public String getText() {
        return text;
    }

    public String getName() {
        return name;
    }

    public double getAmount() {
        return amount;
    }
}

ファイルの出力は(正しく)

name1,text1,20.4
name3,text3,11.56
name4,text4,56.0

しかし、プログラムの出力はStringWriter.

確かに、 を使用してStringWriterそれを に与えるのBufferedWriterは予感でした。BufferedWritera を aに出力に切り替えることができる方法であればString、問題は解決します。

4

2 に答える 2

4

バッファの内容を出力にフラッシュするには、「flush()」を呼び出す必要があります: http://docs.oracle.com/javase/7/docs/api/java/io/BufferedWriter.html#flush()

BufferedWriter オブジェクト間で選択するのではなく、それを追加する必要がありますが、おそらく単純にWriterオブジェクト間で選択する必要があります... StringWriter には独自のバッファーがあるため、その上に BufferedWriter のレイヤーを追加する必要はありません。 .

于 2015-02-19T05:27:39.490 に答える
3

の場合FileWritertry-with-resourcesは を呼び出しclose()BufferedWriterそれが に伝播して、FileWriter作成したすべてのものをフラッシュします。

にも同じことがStringWriter起こりますが、その時点で空のコンテンツを消費しようとした後に発生します。を呼び出す前にflush()、対応する必要があります。BufferedWritertoString()StringWriter

于 2015-02-19T05:30:30.097 に答える