2013-04-22 84 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