iteye_12606
2009-12-25 12:18 阅读 310
已采纳

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条回答 默认 最新

  • 已采纳
    xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxx 2009-12-28 13:10

    echo "测试" | native2ascii
    \u6d4b\u8bd5

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

    这样看看?

    点赞 评论 复制链接分享
  • cfy_9310guo cfy_9310guo 2009-12-25 12:18

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

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

    点赞 评论 复制链接分享
  • xxxxxxxxxxxxxxxxx xxxxxxxxxxxxxxxxx 2009-12-25 13:10

    太不优雅了,给你写了一段跨平台的
    [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]

    点赞 评论 复制链接分享

相关推荐