我有这段重命名文件(或目录)的 Java 代码。当我使用一些特殊字符时在 Linux 上出现问题,它在 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");
}
谢谢!
最佳答案
看起来 Linux 上的 Java 期望文件和目录名称以 UTF-8 编码,但是当 WinSCP 创建目录时,它将名称编码为 latin1 或类似的东西,而新名称在 UTF-8 中无效.显然这是 WinSCP 的默认行为,the newer versions use UTF-8 by default .
使 Java 使用与创建目录时 SFTP 使用的相同编码的简单解决方案。这是通过在运行 JVM 时更改语言环境来完成的:
LANG=en_US.iso8859_1 java -jar YourProgram.jar
不过,必须存在 en_US.iso8859_1 区域设置才能工作。您可能能够从您的发行版的软件包存储库安装新的语言环境。如果没有,您可以阅读 how to define a locale with a specific encoding (以及关于这个文件名问题的一般信息)在我的博客中。
关于Linux 中的 Java 文件字符编码移动/重命名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13046038/