JavaFX中使用Properties保存文件路径时如何去除转义字符?
嘿,这个场景我太熟悉了!Java的Properties类默认遵循标准的properties文件规范,所以会自动把路径里的反斜杠(\)转义成\\,还会给冒号前面加个转义的反斜杠,这就是你看到C\:\\Program Files...的原因。要让保存后的配置文件里是用户能直接修改的正常路径(比如C:\Program Files\Genymobile\Genymotion\tools\adb.exe),得绕开Properties.store()的默认转义逻辑,下面给你两种靠谱的方案:
方案一:自定义写入逻辑,手动输出键值对
放弃用Properties.store(),改用普通的文件写入流来输出键值对,这样完全可控,不会自动转义:
// 假设你已经把adb路径存入了prop对象 try (BufferedWriter writer = new BufferedWriter(new FileWriter("config"))) { // 遍历Properties的所有键值对 for (String key : this.prop.stringPropertyNames()) { String value = this.prop.getProperty(key); // 直接写入key=value,不做任何转义 writer.write(key + "=" + value); writer.newLine(); } } catch (IOException e) { e.printStackTrace(); }
这样保存后的config文件里,路径就是完全正常的adb=C:\Program Files\Genymobile\Genymotion\tools\adb.exe,用户直接修改路径就行,不用加转义字符。
不过要注意:读取的时候也不能用Properties.load()了,因为默认的load方法会把\当成转义字符解析,导致路径出错。读取时也要自定义逻辑:
Properties customProp = new Properties(); try (BufferedReader reader = new BufferedReader(new FileReader("config"))) { String line; while ((line = reader.readLine()) != null) { // 拆分键值对(注意处理值里有等号的情况,如果你的值不会有等号,直接split就行) String[] parts = line.split("=", 2); if (parts.length == 2) { customProp.setProperty(parts[0].trim(), parts[1].trim()); } } } catch (IOException e) { e.printStackTrace(); } // 之后就能正常获取路径了 String adbPath = customProp.getProperty("adb");
方案二:使用Apache Commons Configuration库(如果允许引入第三方包)
如果你项目里可以引入第三方依赖,Apache Commons Configuration库的PropertiesConfiguration类默认就不会转义反斜杠,用起来很省心:
首先引入依赖(Maven为例):
<dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-configuration2</artifactId> <version>2.8.0</version> </dependency>
然后写入配置:
PropertiesConfiguration config = new PropertiesConfiguration(); config.setProperty("adb", this.adb); config.save("config");
读取配置:
PropertiesConfiguration config = new PropertiesConfiguration("config"); String adbPath = config.getString("adb");
这样保存的配置文件里路径就是正常的,用户手动修改也不用加转义,读取的时候也能正确解析路径。
为什么默认的Properties.store()会转义?
顺便提一句,标准的properties文件格式里,\是转义字符,用来表示特殊字符(比如换行、制表符,或者把空格、等号这些作为值的一部分)。所以Properties类的store方法严格遵循这个规范,自动转义是符合标准的,但确实给用户手动修改带来了麻烦,所以才需要上面的解决方案。
内容的提问来源于stack exchange,提问作者Midhun Monachan

