2013-04-22 150 views
0

好吧,我真的很困惑我寫的一些代碼。它是一個DataSetter(不知道它的更好的名字......),並有方法來更改我的數據文件(data.txt)中的數據。該數據具有以下格式:@key=value (eg. @version=1.0)。現在,我試圖運行這一行代碼:文件似乎總是空

new DataSetter().setValue("version", "1.1"); 

它只是清除文件。這幾乎是它所做的一切。現在,我認爲它會清除該文件,因爲它會生成一個新的文件,該文件完全是空的,但名稱相同。這裏是我的代碼:

import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.Scanner; 

/** 
* This class contains methods to set specific data in the data.txt file. <br> 
* The data is rewritten every time a new value is set. 
* 
* @author Casper van Battum 
* 
*/ 
public class DataSetter { 

    private static final File DATA_FILE = new File("resources/data.txt"); 
    private static final String lineFormat = "@%s=%s"; 

    private FileOutputStream out; 
    private DataReader reader = new DataReader(); 
    private HashMap<String, String> dataMap = reader.getDataMap(); 
    private Scanner scanner; 

    public DataSetter() { 

     try { 
      out = new FileOutputStream(DATA_FILE, false); 
     } catch (FileNotFoundException e) { 
      e.printStackTrace(); 
     } 

    } 

    public void setValue(String key, String newValue) { 
     openDataFile(); 

     String oldLine = String.format(lineFormat, key, dataMap.get(key)); 
     dataMap.put(key, newValue); 
     String newLine = String.format(lineFormat, key, newValue); 

     try { 
      replace(oldLine, newLine); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 

     closeDataFile(); 

    } 

    private void replace(String oldLine, String newLine) throws IOException { 
     ArrayList<String> tmpData = new ArrayList<String>(); 
     while (scanner.hasNextLine()) { 
      String currentLine = scanner.nextLine(); 
      tmpData.add((currentLine == oldLine) ? newLine : currentLine); 

     } 

     out.write(new String().getBytes()); 

     String sep = System.getProperty("line.separator"); 
     StringBuffer sb = new StringBuffer(); 
     for (String string : tmpData) { 
      sb.append(string + sep); 

     } 

     FileWriter writer = new FileWriter(DATA_FILE); 
     String outString = sb.toString(); 
     writer.write(outString); 
     writer.close(); 

    } 

    private void openDataFile() { 
     try { 
      scanner = new Scanner(DATA_FILE); 
     } catch (FileNotFoundException ex) { 
      ex.printStackTrace(); 
     } 

    } 

    private void closeDataFile() { 
     scanner.close(); 

    } 

} 

所以運行的setValue()方法後,我只是一個空文件... 我真的出來的想法就是如何解決這個...

+0

*我真的很困惑我寫了一些代碼*,那麼你是怎麼寫的? – NINCOMPOOP 2013-04-22 15:17:27

+0

'新的FileOutputStream(DATA_FILE,false)'將永遠清除你的'DATA_FILE'。 – DaoWen 2013-04-22 15:19:59

+0

什麼是setvalue方法。在那裏看不到寫入文件的一行代碼。 – 2013-04-22 15:20:59

回答

2

您截斷當你去輸出你在tmpDataArrayList從掃描儀讀取的元素與

new FileOutputStream(DATA_FILE, false) 

所以什麼都沒有你的數據文件被寫入。

ArrayList<String> tmpData = new ArrayList<String>(); 
while (scanner.hasNextLine()) { 
    String currentLine = scanner.nextLine(); // never gets called 
    ... 
} 

更新一個文本文件中的典型策略是創建與舊文件的內容(File#renameTo)的臨時文件,寫入文件,然後刪除臨時文件關閉所有打開的流文件後的數據被讀取。

+0

這是「典型戰略」的一個慣例嗎?或者你也可以這樣做,例如,添加一個掃描器,將內容(包括新的)寫入數組而不是臨時文件,並將數據重寫到data.txt文件中?或者按照你所描述的方式來做它會更好嗎? – Creator13 2013-04-22 16:12:44

+0

由於您只能閱讀(除非使用'RandomAccessFile'),因此不是一個慣例,而是更清晰的使用。如果使用'Scanner'寫入數組,內容可能會很大,因此可能會有巨大的內存佔用空間:) – Reimeus 2013-04-22 16:23:55

+0

好的,然後我會用臨時文件來做。無論如何,它並不是太多額外的代碼。 – Creator13 2013-04-22 16:26:11