簡體   English   中英

Linux文件中的Java文件字符編碼移動/重命名

[英]Java file character encoding move/rename in Linux

我有這個重命名文件(或目錄)的java代碼。 當我使用一些特殊字符時Linux上存在問題,它在Windows上使用這些特殊字符。 我嘗試它的方式是這樣的:在Windows中

  • 我創造了一個名為“326½_6”的騙子

  • 我構建了一個jar文件,並直接在windows cmd(或linux shell)中調用它(java -jar),第一個param是上面的目錄,第二個param是一個新目錄的路徑。 這有效

然后,我使用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的默認行為, 較新的版本默認使用UTF-8

一種簡單的解決方案,使Java使用與創建目錄時SFTP使用的編碼相同的編碼。 這是通過在運行JVM時更改語言環境來完成的:

LANG=en_US.iso8859_1 java -jar YourProgram.jar

但是,必須存在區域設置en_US.iso8859_1才能使其正常工作。 您可以從分發的軟件包存儲庫中安裝新的區域設置。 如果沒有,您可以在我的博客中閱讀有關如何使用特定編碼 (以及一般的此文件名問題) 定義區域設置的信息

可能是文件源不存在。 在重命名之前檢查是否存在

renameTo()根本不可靠,尤其是在windows中,但也在unix類系統中。 我建議的是執行一些檢查,創建一些“重試”機制並查看這篇文章 你能指定你使用的編碼(通過查看我認為UTF-8的標簽)以及如何啟動你的程序?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM