1

我有这个重命名文件(或目录)的java代码。当我使用一些特殊字符时,Linux 上会出现问题,它可以在 Windows 上使用这些特殊字符。我尝试的方式是这样的:在windows中

  • 我创建了一个名为“326½_6”的目录

  • 我构建了一个 jar 文件,并直接在 windows cmd(或 linux shell)中调用它(java -jar),第一个参数是上面的目录,第二个参数是新目录的路径。这有效

然后我使用 SFTP (WinSCP) 将目录传输到 Linux 服务器。我重复上面的步骤,但它不起作用。我得到这个输出:

移动 /home/user/testarea/326�_6/ 到 /home/user/testarea/test5/

--- 无法执行重命名 -------

有没有办法在 Linux 机器上完成这项工作???

编码:

  public static void main(String [] args) {
    String source = args[0];
    String dest = args[1];
    System.out.println(" - Moving " + source + " to " + dest);

    File sourceFile = new File(source);
    File destinationFile = new File(dest);

    if (!sourceFile.renameTo(destinationFile)) {
        System.out.println("--- could not perform rename -------");
    }

    System.out.println("Finished moving");
 }

谢谢!

4

3 回答 3

2

看起来 Linux 上的 Java 期望文件和目录名称以 UTF-8 编码,但是当 WinSCP 创建目录时,它会将名称编码为 latin1 或类似的名称,并且新名称在 UTF-8 中无效。显然这是 WinSCP 的默认行为,较新的版本默认使用 UTF-8

使 Java 使用与 SFTP 在创建目录时使用的相同编码的简单解决方案。这是通过在运行 JVM 时更改语言环境来完成的:

LANG=en_US.iso8859_1 java -jar YourProgram.jar

但是,必须存在语言环境 en_US.iso8859_1 才能使其正常工作。您可能能够从您的发行版的软件包存储库中安装新的语言环境。如果没有,您可以在我的博客中阅读有关如何使用特定编码定义语言环境(以及一般有关此文件名问题)的信息。

于 2012-10-24T15:09:08.247 回答
1

可能是文件源不存在。在 renameTo 之前检查存在

于 2012-10-24T09:45:49.603 回答
0

renameTo() 根本不可靠,尤其是在 windows 中,但在类 unix 系统中也是如此。我建议执行一些检查,创建一些“重试”机制并查看这篇文章。你能指定你使用的是什么编码(通过查看我认为是 UTF-8 的标签)以及你如何启动你的程序?

于 2012-10-24T09:43:49.850 回答