如何替换通过属性加载的字符串中的空格

How to replaces white spaces from String loaded through properties

我正在从文件加载 属性,属性 包含路径(Windows 路径),我需要对其进行规范化以创建可用路径。问题是我无法替换“\”。

这是我的测试class:

public class PathUtil {

    public static String normalizeEscapeChars(String source) {
        String result = source;

        result = result.replace("\b", "/b");
        result = result.replace("\f", "/f");
        result = result.replace("\n", "/n");
        result = result.replace("\r", "/r");
        result = result.replace("\t", "/t");
        result = result.replace("\", "/");
        result = result.replace("\"", "/\"");
        result = result.replace("\'", "/'");
        return result;
    }

    public static void main(String[] args) {

        try(FileInputStream input = new FileInputStream("C:\Users\Rakieta\Desktop\aaa.properties")) {
            Properties prop = new Properties();
            prop.load(input);
            System.out.println(PathUtil.normalizeEscapeChars(prop.getProperty("aaa")));

        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

此处属性文件:

aaa=Intermix\koza , intermix\trace

实际输出为:

Intermixkoza , intermix/trace

需要的输出是:

Intermix/koza , intermix/trace

有什么建议吗?

使用双反斜杠 \ 转义 java 中的反斜杠。

当我复制你的代码时,我的 IDE 抛出了一个错误,指出 \k 不是有效的转义字符。所以我删除了整行。

result = result.replace("\k", "/k");
// I have not seen that escape character (Correct me if I am wrong)

我的输出是

aaa=Intermix/koza , intermix/trace

或者你试试 Connor 所说的

result = result.replace("\k", "/k");
// This code is replacing \k with /k in Intermix\koza. So it is kinda hard coded.

这也给出了相同的结果。

反斜杠已被 java.util.Properties class 解释。

要绕过它,您可以扩展它并调整 load(InputStream) 方法,如 this answer:

所示
public class PropertiesEx extends Properties {
    public void load(FileInputStream fis) throws IOException {
        Scanner in = new Scanner(fis);
        ByteArrayOutputStream out = new ByteArrayOutputStream();

        while(in.hasNext()) {
            out.write(in.nextLine().replace("\","\\").getBytes());
            out.write("\n".getBytes());
        }

        InputStream is = new ByteArrayInputStream(out.toByteArray());
        super.load(is);
    }
}