我正在設計一個程序,根據數據的標籤將存儲在文本文件中的數據拆分爲兩個單獨的文件。Java - 使用多個PrintWriter,但只保存最後一個println
以下是該數據的一個小版本。
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
具有BAD
和test.txt-pos
爲空)。有人能向我解釋發生了什麼,以及如何解決這個錯誤?
您通過循環創建一個新的'PrintWriter'每次。您可以追加到文件,也可以將循環外部的初始化。你只看到最後一個的原因是你每次通過循環覆蓋**文件。 – KevinO
傳入'PrintWriter'(s)或以追加模式打開新的輸出流。 –
OMG,這是我試圖編程24小時不睡覺。謝謝。我是新的兩個stackoverflow,我應該刪除這個問題嗎? –