如果您希望结果类似于原始文件,则SHA-1或任何其他哈希方案都不是答案。如果必须避免冲突,那么简单替换或删除“不良”字符也不是答案。
相反,您想要这样的东西。(注意:这应该作为说明性示例,而不是要复制粘贴的内容。)
char fileSep = '/'; // ... or do this portably.char escape = '%'; // ... or some other legal char.String s = ...int len = s.length();StringBuilder sb = new StringBuilder(len);for (int i = 0; i < len; i++) { char ch = s.charAt(i); if (ch < ' ' || ch >= 0x7F || ch == fileSep || ... // add other illegal chars || (ch == '.' && i == 0) // we don't want to collide with "." or ".."! || ch == escape) { sb.append(escape); if (ch < 0x10) { sb.append('0'); } sb.append(Integer.toHexString(ch)); } else { sb.append(ch); }}File currentFile = new File(System.getProperty("user.home"), sb.toString());PrintWriter currentWriter = new PrintWriter(currentFile);
此解决方案提供了可逆编码(无冲突),其中在大多数情况下,编码后的字符串类似于原始字符串。我假设您使用的是8位字符。
URLEnprer可以,但是它的缺点是它对很多合法的文件名字符进行编码。
如果您想要一个无法保证的可逆解决方案,则只需删除“不良”字符,而不是用转义序列替换它们。
上面编码的相反过程应同样直接实现。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)