java - 文件似乎总是空的

标签 java file-io stream

好吧,我真的对我写的一些代码感到困惑。它是一个 DataSetter(不知道更好的名称......),并且具有更改我的数据文件(data.txt)中的数据的方法。该数据具有以下格式:@key=value(例如@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() 方法后,我只有一个空文件...... 我真的不知道如何解决这个问题......

最佳答案

您正在使用

截断数据文件
new FileOutputStream(DATA_FILE, false)

因此,当您输出从扫描仪读取的 tmpData ArrayList 中的元素时,不会写入任何内容。

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

更新文本文件的典型策略是使用旧文件的内容 ( File#renameTo ) 创建一个临时文件,将数据写入文件,然后在关闭正在读取的文件的任何打开的流后删除临时文件。

关于java - 文件似乎总是空的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16150617/

相关文章:

java - Cucumber 未定义的步骤,虽然使用 IntelliJ 定义

java - 如何在 Play Framework 中复制上传的文件?

C# - 使用 Response.TransmitFile() 或 Response.WriteFile() 流式传输 PDF,然后选择一个页面

events - Esper 对战 Coral8。 . .事件流处理

java - 在 Swing 应用程序中嵌入 JFXPanel 在添加/删除时失败

java - 与 Swing : Wait for the UI 同步

java - 大数据文件输出

java - 如何在java中打开位于项目文件夹以外的文件夹中的文本文件(或任何文件)

arrays - 正确使用 Fortran 流写入和读取整数数组

Java算术表达式