Java - 使用多个PrintWriter但仅保存最后一个println

时间:2016-04-25 02:24:15

标签: java file-io

我正在设计一个程序,根据该数据的标签将存储在文本文件中的数据拆分为两个单独的文件。

以下是该数据的小版本。

0,1,2,normal. 
5,5,5,strange.
2,1,3,normal.

我使用一个类来存储每一行​​作为样本。该类解析该行以将最后一个值存储为标签。我将每一行封装为一个对象,因为我打算稍后添加功能。

以下是Sample

的代码
import java.util.Scanner;

public class Sample {
    String[]str_vals = new String[3];
    String label;
    Sample(Scanner line) {
        for (int i=0; i<3; i++) {
            str_vals[i] = line.next();
        }
        label = line.next();
    }
    String getValsForCSV() {
        StringBuilder retval = new StringBuilder();

        for (int i=0; i<3; i++) {
            retval.append(str_vals[i]).append(",");
        }
        retval.append(label).append(".");
        return retval+"";
    }
    String getLabel() {
        return label;
    }
}

以下是相关代码。我的Separator课程。

import java.io.*;
import java.util.Scanner;

public class Separator {
    public static final String DATAFILE = "src/etc/test.txt";
    public static void main(String[] args) throws FileNotFoundException {
        runData();
    }
    public static void runData() throws FileNotFoundException {
        try (Scanner in = new Scanner(new File(DATAFILE))) {
            // kddcup file uses '.\n' at end of each line
            // setting this as delimiter which will consume the period
            in.useDelimiter("[.]\r\n|[.]\n|\n");
            Sample curr;
            while(in.hasNext()) {
                // line will hold all fields for a single sample
                Scanner line = new Scanner(in.next());
                line.useDelimiter(", *");
                curr = new Sample(line);
                try (
                    PrintWriter positive = new PrintWriter(new File(DATAFILE+"-pos"));
                    PrintWriter negative = new PrintWriter(new File(DATAFILE+"-neg"));
                ) {
                    if (curr.getLabel().equals("normal")) {
                        positive.println("GOOD");
                    } else {
                        negative.println("BAD");
                    }
                }
            }
        }
    }
}

我遇到的这个问题是代码只会将最后看见的Sample保存到各自的文件中。因此,对于上述数据,test.txt-neg将为空,test.txt-pos将有一行GOOD;它没有预期的两个GOOD

如果我将test.txt数据修改为仅包含前两行,则文件状态将被反转(即test.txt-neg具有BADtest.txt-pos为空。有人可以向我解释发生了什么,以及如何解决这个错误?

1 个答案:

答案 0 :(得分:0)

因为评论中指出了错误。我想赞扬KevinO和Elliott Frisch的解决方案。

如上所述,我每次都要创建一个新的PrintWriter并在其中创建PrintWriter覆盖文件的默认模式。因此,它始终基于单个样本保存两个文件。

要更正此错误,我已将PrintWriter的实例化提取到Scanner对象的try-with-resource块中

import java.io.*;
import java.util.Scanner;

public class Separator {
    public static final String DATAFILE = "src/etc/test.txt";
    public static void main(String[] args) throws FileNotFoundException {
        runData();
    }
    public static void runData() throws FileNotFoundException {
        try (
            Scanner in = new Scanner(new File(DATAFILE));
            PrintWriter positive = new PrintWriter(new File(DATAFILE+"-pos"));
            PrintWriter negative = new PrintWriter(new File(DATAFILE+"-neg"));
        ) {
            // kddcup file uses '.\n' at end of each line
            // setting this as delimiter which will consume the period
            in.useDelimiter("[.]\r\n|[.]\n|\n");
            Sample curr;
            while(in.hasNext()) {
                // line will hold all fields for a single sample
                Scanner line = new Scanner(in.next());
                line.useDelimiter(", *");
                curr = new Sample(line);
                if (curr.getLabel().equals("normal")) {
                    positive.println("GOOD");
                } else {
                    negative.println("BAD");
                }
            }
        }
    }
}