用 Java 替换文件中 HashMap 的值
Replacing values from HashMap in a file with Java
我卡在这部分了。目的是从具有这种格式的 file.ini 中获取值
X = Y
X1 = Y1
X2 = Y2
获取 Y 值并将它们替换为 scxml 文件而不是相应的 X 键,并保存新的 file.scxml
正如您从我粘贴的代码中看到的那样,我使用 HashMap 获取正确打印的键和值,尽管替换值的代码看起来正确,但仅适用于 HashMap 的第一个条目。
目前代码如下:
public String getPropValues() throws IOException {
try {
Properties prop = new Properties();
String pathconf = this.pathconf;
String pathxml = this.pathxml;
//Read file conf
File inputFile = new File(pathconf);
InputStream is = new FileInputStream(inputFile);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//load the buffered file
prop.load(br);
String name = prop.getProperty("name");
//Read xml file to get the format
FileReader reader = new FileReader(pathxml);
String newString;
StringBuffer str = new StringBuffer();
String lineSeparator = System.getProperty("line.separator");
BufferedReader rb = new BufferedReader(reader);
//read file.ini to HashMap
Map<String, String> mapFromFile = getHashMapFromFile();
//iterate over HashMap entries
for(Map.Entry<String, String> entry : mapFromFile.entrySet()){
System.out.println( entry.getKey() + " -> " + entry.getValue() );
//replace values
while ((newString = rb.readLine()) != null){
str.append(lineSeparator);
str.append(newString.replaceAll(entry.getKey(), entry.getValue()));
}
}
rb.close();
String pathwriter = pathxml + name + ".scxml";
BufferedWriter bw = new BufferedWriter(new FileWriter(new File(pathwriter)));
bw.write(str.toString());
//flush the stream
bw.flush();
//close the stream
bw.close();
} catch (Exception e) {
System.out.println("Exception: " + e);
}
return result;
}
所以我的 .ini 文件是例如
Apple = red
Lemon = yellow
它正确打印键和值:
Apple -> red
Lemon -> yellow
但仅在文件中将 Apple 替换为 red 而不是其他键
问题出在您的控制流程顺序上。
当您的 for
循环中的第一次迭代(对应于第一个条目 Apple -> red
)运行时,它会导致 BufferedReader rb
到达流的末尾,因此对后续迭代不做任何事情。
然后您必须为每次迭代重新初始化 BufferedReader
,或者更好的是,将 Map
条目的循环反转到 BufferedReader
读取循环中:
编辑(根据@David 提示)
您应该可以将生成的 replace
d 值分配给将在每次迭代时附加到结果文件的行替换:
public String getPropValues() throws IOException {
try {
// ...
BufferedReader rb = new BufferedReader(reader);
//read file.ini to HashMap
Map<String, String> mapFromFile = getHashMapFromFile();
//replace values
while ((newString = rb.readLine()) != null) {
// iterate over HashMap entries
for (Map.Entry<String, String> entry : mapFromFile.entrySet()) {
newString = newString.replace(entry.getKey(), entry.getValue());
}
str.append(lineSeparator)
.append(newString);
}
rb.close();
// ...
} catch (Exception e) {
System.out.println("Exception: " + e);
}
return result;
}
我卡在这部分了。目的是从具有这种格式的 file.ini 中获取值
X = Y
X1 = Y1
X2 = Y2
获取 Y 值并将它们替换为 scxml 文件而不是相应的 X 键,并保存新的 file.scxml
正如您从我粘贴的代码中看到的那样,我使用 HashMap 获取正确打印的键和值,尽管替换值的代码看起来正确,但仅适用于 HashMap 的第一个条目。
目前代码如下:
public String getPropValues() throws IOException {
try {
Properties prop = new Properties();
String pathconf = this.pathconf;
String pathxml = this.pathxml;
//Read file conf
File inputFile = new File(pathconf);
InputStream is = new FileInputStream(inputFile);
BufferedReader br = new BufferedReader(new InputStreamReader(is));
//load the buffered file
prop.load(br);
String name = prop.getProperty("name");
//Read xml file to get the format
FileReader reader = new FileReader(pathxml);
String newString;
StringBuffer str = new StringBuffer();
String lineSeparator = System.getProperty("line.separator");
BufferedReader rb = new BufferedReader(reader);
//read file.ini to HashMap
Map<String, String> mapFromFile = getHashMapFromFile();
//iterate over HashMap entries
for(Map.Entry<String, String> entry : mapFromFile.entrySet()){
System.out.println( entry.getKey() + " -> " + entry.getValue() );
//replace values
while ((newString = rb.readLine()) != null){
str.append(lineSeparator);
str.append(newString.replaceAll(entry.getKey(), entry.getValue()));
}
}
rb.close();
String pathwriter = pathxml + name + ".scxml";
BufferedWriter bw = new BufferedWriter(new FileWriter(new File(pathwriter)));
bw.write(str.toString());
//flush the stream
bw.flush();
//close the stream
bw.close();
} catch (Exception e) {
System.out.println("Exception: " + e);
}
return result;
}
所以我的 .ini 文件是例如
Apple = red
Lemon = yellow
它正确打印键和值:
Apple -> red
Lemon -> yellow
但仅在文件中将 Apple 替换为 red 而不是其他键
问题出在您的控制流程顺序上。
当您的 for
循环中的第一次迭代(对应于第一个条目 Apple -> red
)运行时,它会导致 BufferedReader rb
到达流的末尾,因此对后续迭代不做任何事情。
然后您必须为每次迭代重新初始化 BufferedReader
,或者更好的是,将 Map
条目的循环反转到 BufferedReader
读取循环中:
编辑(根据@David 提示)
您应该可以将生成的 replace
d 值分配给将在每次迭代时附加到结果文件的行替换:
public String getPropValues() throws IOException {
try {
// ...
BufferedReader rb = new BufferedReader(reader);
//read file.ini to HashMap
Map<String, String> mapFromFile = getHashMapFromFile();
//replace values
while ((newString = rb.readLine()) != null) {
// iterate over HashMap entries
for (Map.Entry<String, String> entry : mapFromFile.entrySet()) {
newString = newString.replace(entry.getKey(), entry.getValue());
}
str.append(lineSeparator)
.append(newString);
}
rb.close();
// ...
} catch (Exception e) {
System.out.println("Exception: " + e);
}
return result;
}