gpt4 book ai didi

java - 是否有跨平台的 Java 方法来删​​除文件名特殊字符?

转载 作者:IT老高 更新时间:2023-10-28 20:28:16 28 4
gpt4 key购买 nike

我正在制作一个跨平台应用程序,它可以根据在线检索的数据重命名文件。我想清理从当前平台的 Web API 获取的字符串。

我知道不同的平台有不同的文件名要求,所以我想知道是否有跨平台的方法来做到这一点?

编辑:在 Windows 平台上不能有问号“?”在文件名中,而在 Linux 中,您可以。文件名可能包含此类字符,我希望支持这些字符的平台保留它们,否则,将它们删除。

另外,我更喜欢不需要第三方库的标准 Java 解决方案。

最佳答案

正如其他地方所建议的,这通常不是您想要做的。通常最好使用 File.createTempFile() 等安全方法创建临时文件。

您不应该使用白名单来执行此操作,而只能保留“好”字符。如果文件仅由中文字符组成,那么您将删除其中的所有内容。由于这个原因,我们不能使用白名单,我们必须使用黑名单。

Linux 几乎允许任何可能是真正痛苦的事情。我只想将 Linux 限制在与 Windows 相同的列表中,这样您以后就不用担心了。

在 Windows 上使用这个 C# 片段,我生成了一个在 Windows 上无效的字符列表。此列表中的字符比您想象的要多得多(41 个),因此我不建议您尝试创建自己的列表。

        foreach (char c in new string(Path.GetInvalidFileNameChars()))
{
Console.Write((int)c);
Console.Write(",");
}

这是一个“清理”文件名的简单 Java 类。

public class FileNameCleaner {
final static int[] illegalChars = {34, 60, 62, 124, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 58, 42, 63, 92, 47};
static {
Arrays.sort(illegalChars);
}
public static String cleanFileName(String badFileName) {
StringBuilder cleanName = new StringBuilder();
for (int i = 0; i < badFileName.length(); i++) {
int c = (int)badFileName.charAt(i);
if (Arrays.binarySearch(illegalChars, c) < 0) {
cleanName.append((char)c);
}
}
return cleanName.toString();
}
}

编辑:正如斯蒂芬建议的那样,您可能还应该验证这些文件访问仅发生在您允许的目录中。

以下答案包含示例代码,用于在 Java 中建立自定义安全上下文,然后在该“沙箱”中执行代码。

How do you create a secure JEXL (scripting) sandbox?

关于java - 是否有跨平台的 Java 方法来删​​除文件名特殊字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1155107/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com