事情的起因是这样的...最近有这样一个需求:读取JavaWeb项目中本地文件夹(固定路径,写在配置文件中)下的所有文件,然后导入到系统中.最直接的解决办法就是使用java.io.File的listFiles方法列出这个文件夹下的所有文件,然后再做处理,我们也是这样做的。在本地测试没有问题,但是一旦部署到生产环境(Linux系统环境),问题就来了:由于文件是通过FTP上传到固定文件夹,所以有一些中文名字的文件,分别是上传到linux系统后,中途出现乱码,程序无法读取。于是开始查看tomcat编码和操作系统编码格式,都设置为UTF-8。在Tomcat中添加:catalina.sh:exportLANG=zh_CN.UTF-8Linux服务器编码:vi/etc/sysconfig/i18nLANG="zh_CN.UTF-8"注意:查看操作系统编码的命令是echo$LANG.检查操作系统语言命令:locale统一编码后,问题依旧。这时候才明白,由于文件是在windows下生成的,默认编码是gbk,所以需要对文件名进行转码。使用convmv转码文件名要对文件名进行转码,需要使用convmv,这是一个转码工具。在线安装convmvLinux中的安装命令如下:yuminstallconvmv如果系统没有联网,或者yum命令被屏蔽,可以先下载程序包,然后安装。使用软件包安装步骤1)。下载地址为:https://pkgs.org/download/convmv根据操作系统版本选择对应的版本下载:找到下载地址:2)。安装并将文件复制到一个路径下(如home),执行安装命令:sudorpm-ivhconvmv-1.15-2.el7.noarch.rpm使用convmv转码中文文件名安装好convmv后,就可以使用convmv将中文文件名转码起来。为了操作方便,可以写一个shell脚本对文件名进行转码:#!/bin/bashconvmv-fgbk-tutf-8-r--notest/opt/ftp上面的命令是把/opt/ftppath的所有文件名统一转码为utf8。这样程序就可以读取中文名称的文件了。应用在JavaWeb项目中,每次上传新文件都手动执行上面的shell脚本显然是不现实的,所以最简单的方法就是用Java调用shell脚本,让它自动转码。Java调用shell脚本的代码如下:List();commend.add("convmv");commend.add("-f");commend.add("gbk");commend.add("-t");commend.add("utf-8");commend.add("-r");commend.add("--notest");commend.add("/opt/ftp");try{ProcessBuilderbuilder=newProcessBuilder();builder.command(commend);Processproc=builder.start();proc.waitFor();}catch(Exceptione){e.printStackTrace();}至此,问题解决。以上就是本次分享的全部内容,欢迎讨论。
