You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android环境下文件名校验与长度限制问题咨询(API 25)

Android文件名长度校验问题解答

问题背景

在Android 7.1.1(API 25)模拟器上运行Java代码时,创建包含长孟加拉语名称的文件触发java.io.FileNotFoundException(文件名过长)异常,但downloadFile.toString().length()返回值为142,远低于认知中的255字符限制。相关代码:

File downloadFile = new File("/storage/emulated/0/MyDownload/আমার সোনার বাংলা আমি তোমায় ভালোবাসি চিরদিন তোমার আকাশ তোমার বাতাস আমার প্রাণে বাজায় বাঁশি ও মা ফাগুনে তোর.mp4");
FileOutputStream outputStream = new FileOutputStream(downloadFile, true);

报错信息:

java.io.FileNotFoundException: /storage/emulated/0/MyDownload/আমার সোনার বাংলা আমি তোমায় ভালোবাসি চিরদিন তোমার আকাশ তোমার বাতাস আমার প্রাণে বাজায় বাঁশি ও মা ফাগুনে তোর.mp4 (File name too long)

核心问题解答

1. 校验对象:文件名还是完整路径?

Android基于Linux文件系统,核心限制是单个文件名(不含父路径)的字节数,而非字符数;同时完整路径的总字节数也有系统级限制(通常为4096字节),但你遇到的问题根源是文件名的字节长度超标。

2. 正确的校验方式

  • 文件名字节长度校验:提取纯文件名后,计算其UTF-8编码的字节数(而非字符数),因为孟加拉语等非英语字符在UTF-8下通常占2-3字节,字符数142对应的字节数很可能超过255限制:
String fileName = downloadFile.getName();
int byteLength = fileName.getBytes(StandardCharsets.UTF_8).length;
if (byteLength > 255) {
    // 文件名字节长度超标,需截断或重命名
}
  • 完整路径字节长度校验:避免触发路径总长度限制:
String fullPath = downloadFile.getAbsolutePath();
int pathByteLength = fullPath.getBytes(StandardCharsets.UTF_8).length;
if (pathByteLength > 4096) {
    // 完整路径字节长度超标
}

3. 多语言文件名适配建议

  • 绝对不要以字符数作为判断标准,必须以UTF-8编码后的字节数为准。
  • 若文件名过长,可采用「截断字符+唯一标识后缀」的方式保留唯一性,比如截取前200字节对应的字符,再加上文件内容的MD5前8位,避免重名冲突。

内容的提问来源于stack exchange,提问作者Abhijit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 18:51:03