【问题标题】:Map invalid character to valid character while creating a file and back to original name when read filename创建文件时将无效字符映射到有效字符,读取文件名时映射回原始名称
【发布时间】:2017-05-23 10:02:57
【问题描述】:

我需要在创建文件时将无效字符映射到其他一些字符,例如“/”到“_”(正斜杠到下划线),因为文件名不允许放置斜杠、问题、双引号等。

假设我有

String name = "Message Test - 22/10/2016";

现在我想用上面的字符串写一个文件,但由于斜杠而出错。

所以我想在写入文件时将斜杠像所有无效字符一样映射到任何其他字符。写完后,我需要读取所有文件名并显示在页面上。

我以某种方式映射字符,所以文件名应该是

Message_Test_-_22-10-2016

当我在网络上显示它时,我需要将文件名作为原始名称返回,例如

Message Test - 22/10/2016

我正在使用java。任何人都可以帮助我解决这个问题,我该如何开始编写这种方法,或者是否有任何 api 或是否有任何其他方法。

我不想使用数据库来将别名文件名与原始文件名关联起来

【问题讨论】:

  • 我认为无论如何你都需要保存你的映射。想象一下有人想要保存一个名为“Message_Test - 22-10-2016”的文件。您将名称更改为“Message_Test__-_22-10-2016”。如果没有映射,将很难找出您需要替换哪个 _

标签: java string character filenames invalid-characters


【解决方案1】:

我需要将无效字符映射到其他一些字符,例如“/”到“_”

它不够健壮,因为它假定您从不在文件名中使用_ 字符。
如果您使用它,如何知道存储为my_file 的文件在您的应用程序中是否应该显示为my_filemy/file

我认为更可靠的方法是使用一个文件(例如 JSON 或 XML)来存储每个文件的两个属性:

  • 存储的文件名
  • 在您的应用程序中代表它的视觉名称

它需要一个额外的文件,但它使事情变得更加清晰。

【讨论】:

  • 是的,你说得对。但我有一千个或可能是数百万个文件。附加文件可以吗?
  • 在这种情况下,额外的文件在性能和内存消耗方面是个坏主意。您应该通过一组应该一起工作的相关文件来使用一个映射文件,并且这组相关文件应该有一个合理的大小。我不知道您的域,但如果我将文件系统与文件系统并行,它可能是一个按目录的映射文件。
【解决方案2】:

您可以使用地图来存储映射:

例如

Map<Character,Character> map = new HashMap<Character,Character>();
map.put('/','_');

然后替换1次遍历中的字符:

for(int i=0;i<str.length();i++){
  char c = str.charAt(i); 
  if( map.containsKey(c) )
    str.replace(c,map.get(c));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 2020-03-25
    • 2022-08-16
    相关资源
    最近更新 更多