Linux 中的 Java 文件字符编码移动/重命名

标签 java file-io encoding utf-8

我有这段重命名文件(或目录)的 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/

相关文章:

xml - 如何处理 XML GENERATE 命令中的 xml 编码?

java - 如何在Java中读取输入文本文件而不必每次都更改文件名

java - 如何拆分和加入加密消息?

python - 从 Django 的媒体目录中打开数据文件

java - 为什么不添加文件而不是覆盖文件?

Java - 如何在文件中存储(多子)树?

c# - HttpClient 解码编码的 Url?

java - 将 Java 3d 对象写入自定义文件类型

java - 解析日期字符串时出现 ParseException

java - 为什么我的 MultipartFile 是空的