gpt4 book ai didi

java - 文件似乎总是空的

转载 作者:行者123 更新时间:2023-12-02 07:05:36 25 4
gpt4 key购买 nike

好吧,我真的对我写的一些代码感到困惑。它是一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com