用 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 提示)

您应该可以将生成的 replaced 值分配给将在每次迭代时附加到结果文件的行替换:

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;
}