java 程序调用Unix/Linux 中的Shell,然后shell中含中文名的问题

各路好手,小弟项目中遇到如下问题,急需各位大侠出手相助,现将问题描述如下:
小弟的项目是用Java开发的,IDE是 Mac OS 下的 Eclipse(Linux/Unix下也是相同的问题)。程序中需调用系统的 shell 命令,例如:

String line;
String[] cmd = new String[3];
cmd[0] = "/bin/sh";
cmd[1] = "-c";
cmd[2] = "du -sh /Users/测试"

Process proc = Runtime.getRuntime.exec(cmd);
InputStreamReader is = new InputStreamReader(proc.getInputStream());
BufferedReader br = new BufferedReader (is);
while ((line = br.readLine ()) != null) {
System.out.println(line);
}

du 命令是用来读取文件大小的shell命令,本程序需要读取“/Users/测试”这个文件夹的大小。现在问题来了,源程序没有经过打包,直接在Eclipse中点击Run按钮,这样是可以直接显示正确结果的,如“123M /Users/测试”这种形式,但是打包成jar包时,shell命令就不识别中文名了,也就无法执行du命令。打开终端,在命令行下键入 “du -sh /Users/测试”也是可以显示正确结果。所以小弟想应该是Shell的环境变量设置有问题。请问,应该如何在程序中设置shell的环境变量,确保打包后的程序能正常调用含中文参数的shell命令。
请各路好手出手相助!
问题补充
To zhoun:
我在命令行执行echo $LANG结果是zh_CN.UTF-8;所以按照你写的执行了一下,结果报“java.io.IOException: LANG=zh_CN.UTF-8: not found”异常。
问题补充:
To Ihavegotyou:
多谢你的回答,呵呵。
不过小弟仅仅是拿 du 命令作为一个例子,使用其他Linux/Unix命令的时候,对于中文参数,还是会面临一样的问题的。
问题补充:
多谢您的回答。目前问题已解决。我将程序拿出来,在命令行下制定字符集进行编译如: javac -encoding UTF-8 test.java 然后运行的时候也是指定相同字符集 java -Dfile.encoding=UTF-8 ... 这样就能正常运行了。所以问题就是,双击可运行jar包时,调用的字符集和原先编译的字符集不一样。

3个回答

echo "测试" | native2ascii
\u6d4b\u8bd5

cmd[2] = "du -sh /tmp/\u6d4b\u8bd5" ;

这样看看?

cmd[0]="LANG=zh_CN.UTF-8";
cmd[1]="/bin/sh";
.......

其中LANG是你正确的语言环境,
echo $LANG看看是什么, 替换一下

太不优雅了,给你写了一段跨平台的
[code="java"]static long totalSize = 0;
public static void visit(File f) {
totalSize += f.length();
}

public static void walk(File f) {
visit(f);
if (f.isDirectory()) {
String list[] = f.list();
for (int i = 0; i < list.length; i++)
walk(new File(f, list[i]));
}
}

//测试
public static void main(String args[]) {
walk(new File("/tmp/cc"));
System.out.println("totalSize=" + totalSize);
}[/code]

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问