FileOutputStream 在获取路径中包含日文的文件时抛出 FileNotFoundException
FileOutputStream throw FileNotFoundException when get File with Japanese in path
当使用 Google 驱动器 API 时,我在这里使用此 downloadMetadataFile() 来处理文件:
public void downloadMetadataFile(String fileId, String folderStorePath, String fileName) throws IOException, GeneralSecurityException, GoogleException {
String path = folderStorePath + "/" + fileName
java.io.File file = new java.io.File(path);
try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
Drive drive = createDrive();
drive.files().get(fileId)
.executeMediaAndDownloadTo(fileOutputStream);
}
}
当文件夹存在时使用上述方法 (izakayaTemplate + 居酒屋):
- 当path=/reports/template/izakayaTemplate/template3.png时,方法工作文件并从Google Drive
下载template3.png成功
- 当 path=/reports/template/居酒屋/template3.png 时,该方法在第
try (FileOutputStream fileOutputStream = new FileOutputStream(file))
行抛出 FileNotFoundException
有人可以为我解释一下这种行为吗?
注:
- 我用的是SpringBoot 2.5,Java8,驱动APIv3
- 我运行在 Amazon linux1 上将这个项目作为 DaemonTool 的一项服务。
在运行配置文件中,我设置了
-Dfile.encoding=UTF-8
-Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 \
更新 1:
调试了一段时间后,我发现我创建的新文件的CanonicalPath是错误的,但我不知道为什么会这样。
- getPath: /reports/template/居酒屋/template3.png
- getAbsolutePath: /reports/template/居酒屋/template3.png
- getCanonicalPath: /reports/template/???/template3.png
经过搜索,我找到了解决这个问题的方法:
- 解决方法:在文件运行
中添加export LANG=ja_JP.UTF-8
- 说明:
canonicalPath
是文件系统认为引用其指向的文件系统对象的规范方式的路径。因此,为了使系统获得正确的 canonicalPath,环境必须像本文档中那样设置正确的语言环境:https://docs.oracle.com/cd/E23824_01/html/E26033/glset.html。在我的问题中,正确的语言环境是ja_JP.UTF-8
当使用 Google 驱动器 API 时,我在这里使用此 downloadMetadataFile() 来处理文件:
public void downloadMetadataFile(String fileId, String folderStorePath, String fileName) throws IOException, GeneralSecurityException, GoogleException {
String path = folderStorePath + "/" + fileName
java.io.File file = new java.io.File(path);
try (FileOutputStream fileOutputStream = new FileOutputStream(file)) {
Drive drive = createDrive();
drive.files().get(fileId)
.executeMediaAndDownloadTo(fileOutputStream);
}
}
当文件夹存在时使用上述方法 (izakayaTemplate + 居酒屋):
- 当path=/reports/template/izakayaTemplate/template3.png时,方法工作文件并从Google Drive 下载template3.png成功
- 当 path=/reports/template/居酒屋/template3.png 时,该方法在第
try (FileOutputStream fileOutputStream = new FileOutputStream(file))
行抛出 FileNotFoundException
有人可以为我解释一下这种行为吗?
注:
- 我用的是SpringBoot 2.5,Java8,驱动APIv3
- 我运行在 Amazon linux1 上将这个项目作为 DaemonTool 的一项服务。
在运行配置文件中,我设置了
-Dfile.encoding=UTF-8
-Dsun.jnu.encoding=UTF-8 -Dfile.encoding=UTF-8 \
更新 1: 调试了一段时间后,我发现我创建的新文件的CanonicalPath是错误的,但我不知道为什么会这样。
- getPath: /reports/template/居酒屋/template3.png
- getAbsolutePath: /reports/template/居酒屋/template3.png
- getCanonicalPath: /reports/template/???/template3.png
经过搜索,我找到了解决这个问题的方法:
- 解决方法:在文件运行 中添加
- 说明:
canonicalPath
是文件系统认为引用其指向的文件系统对象的规范方式的路径。因此,为了使系统获得正确的 canonicalPath,环境必须像本文档中那样设置正确的语言环境:https://docs.oracle.com/cd/E23824_01/html/E26033/glset.html。在我的问题中,正确的语言环境是ja_JP.UTF-8
export LANG=ja_JP.UTF-8