2016-04-25 87 views
0

我正在設計一個程序,根據數據的標籤將存儲在文本文件中的數據拆分爲兩個單獨的文件。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具有BADtest.txt-pos爲空)。有人能向我解釋發生了什麼,以及如何解決這個錯誤?

+2

您通過循環創建一個新的'PrintWriter'每次。您可以追加到文件,也可以將循環外部的初始化。你只看到最後一個的原因是你每次通過循環覆蓋**文件。 – KevinO

+1

傳入'PrintWriter'(s)或以追加模式打開新的輸出流。 –

+0

OMG,這是我試圖編程24小時不睡覺。謝謝。我是新的兩個stackoverflow,我應該刪除這個問題嗎? –

回答

0

因爲在評論中指出了錯誤。我想表達KevinO和Elliott Frisch的解決方案。

如上所述,我將創建一個新的PrintWriter,並在其默認模式下創建PrintWriter覆蓋文件。因此,它總是保存基於單個樣本的兩個文件。

要糾正這個錯誤,我已經退出了PrintWriter的實例是在Scanner對象的嘗試 - 以資源塊

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"); 
       } 
      } 
     } 
    } 
} 
相關問題