我从外部进程接收到一个字符串。我想用那个字符串来创建一个文件名,然后写入那个文件。这是我执行此操作的代码片段:
String s = ... // comes from external source
File currentFile = new File(System.getProperty("user.home"), s);
PrintWriter currentWriter = new PrintWriter(currentFile);
如果 s 包含无效字符,例如基于 Unix 的操作系统中的“/”,则会(正确地)抛出 java.io.FileNotFoundException。
我怎样才能安全地编码字符串,以便它可以用作文件名?
编辑:我希望的是为我执行此操作的 API 调用。
我可以做这个:
String s = ... // comes from external source
File currentFile = new File(System.getProperty("user.home"), URLEncoder.encode(s, "UTF-8"));
PrintWriter currentWriter = new PrintWriter(currentFile);
但我不确定 URLEncoder 是否可靠用于此目的。
原文由 Steve McLeod 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您希望结果类似于原始文件,SHA-1 或任何其他哈希方案都不是答案。如果必须避免冲突,那么简单地替换或删除“坏”字符也不是答案。
相反,你想要这样的东西。 (注意:这应该被视为一个说明性的例子,而不是复制和粘贴的东西。)
该解决方案提供了一种可逆编码(无冲突),其中编码字符串在大多数情况下类似于原始字符串。我假设您使用的是 8 位字符。
URLEncoder
有效,但它的缺点是它编码了大量合法的文件名字符。如果您想要一个不保证可逆的解决方案,那么只需删除“坏”字符而不是用转义序列替换它们。
上述编码的反向应该同样可以直接实现。