我正在运行一个独立的Java进程,该过程将数据写入父目标目录中的多个XLSX文件,并且在完成后,将整个目标目录划定并上传到云,并提供下载链接给用户。XLSX文件名和zip文件的名称是用户定义的,无法更改。
问题与创建的XLSX文件的名称。如果用户选择的文件名是日语,例如
サインサイン纸cpn_ 2.xlsx
系统中创建的相应文件的形式是:
??????????? cpn_?2?.xlsx
相同的文件正在上传到云,用户正在看到乱码的文件名。但是,zip文件的日语名称没有乱码,只用日语。
以下是用于创建XLSX文件的代码示例:
String fileName = userGivenName + "_" + randomUUID + ".xlsx";
File file = new File(tmpParentDirectoryName, fileName);
FileOutputStream outputStream = new FileOutputStream(file);
workbook.write(outputStream);
在这种情况下,创建的XLSX文件的绝对路径就像:
/tmpdirectorypath/??????????????? cpn_?2?_0C6B37EE-97C4-44D4-B80D-DFE5EAFE0045.XLSX
就像上面一样,在同一 tmpdirectory
中创建了多个XLSX文件完成后,以下是创建zip文件并上传到云的代码示例:
File[] files = getFilesInFolder(tmpDirectory);
if (ArrayUtils.isEmpty(files)) {
continue;
}
File zipFile = new File(targetDirectory, compressedFileName);
createZipFile(files, zipFile);
String url = uploadFile(compressedFileName, zipFile);
以下代码将数据写入zip文件:
public static void createZipFile(File[] files, File zipFile) {
if (ArrayUtils.isEmpty(files)) {
return;
}
byte[] buffer = new byte[1024];
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream(zipFile));
try {
for (File file : files) {
FileInputStream fis = new FileInputStream(file);
try {
String fileName = URLDecoder.decode(file.getName(), "UTF-8");
ZipEntry zipEntry = new ZipEntry(fileName);
zos.putNextEntry(zipEntry);
int length;
while ((length = fis.read(buffer)) > 0) {
zos.write(buffer, 0, length);
}
zos.closeEntry();
} finally {
IOUtils.closeQuietly(fis);
}
}
} finally {
IOUtils.closeQuietly(zos);
}
}
上传的zip文件具有正确的日语名称,但是zip文件的zip条目已乱七八糟的XLSX文件名。
独立的Java过程具有以下编码选项:
-Dfile.encoding=UTF-8 -Dsun.jnu.encoding=UTF-8
以下是Locale命令的输出:
locale
LANG=en_IN.UTF-8
LC_CTYPE="en_IN.UTF-8"
LC_NUMERIC="en_IN.UTF-8"
LC_TIME="en_IN.UTF-8"
LC_COLLATE="en_IN.UTF-8"
LC_MONETARY="en_IN.UTF-8"
LC_MESSAGES="en_IN.UTF-8"
LC_PAPER="en_IN.UTF-8"
LC_NAME="en_IN.UTF-8"
LC_ADDRESS="en_IN.UTF-8"
LC_TELEPHONE="en_IN.UTF-8"
LC_MEASUREMENT="en_IN.UTF-8"
LC_IDENTIFICATION="en_IN.UTF-8"
LC_ALL=
有人可以指导我在这里做错什么吗?我希望与用户给出的同一文件名上传。
我终于能够破解它。问题在于执行Java过程的Mesos奴隶的系统属性。从属上的过程是由Mesos Master Scheduler使用启动脚本启动的。因此,默认的Java语言环境属性未正确设置在从属上。
我在从属的启动脚本中添加了以下行:
export LANG=en_IN.UTF-8
明确将语言环境属性添加到启动脚本后,能够解决问题。