2017-09-12 4 views
0

現在、int []へのキーの名前を持つファイルにhashmapからint []を保存しています。この正確なキーは別のプログラムから到達可能でなければなりません。したがって、私はファイルの名前を英語のみの文字に切り替えることはできません。しかし、ファイル名の文字セットとしてISO_8859_1を使用していても、ファイルツリー内のすべてのファイルが壊れてしまいます。英字は正しいが、特別なものではない。Java内から新規ファイルを作成するときに、ラテン文字を正しく使用することはできません。ファイル名が正しいものの代わりに奇妙な文字を取得する

 /** 
     * Save array to file 
     */ 
     public void saveStatus(){ 
      try { 
       for(String currentKey : hmap.keySet()) { 
        byte[] currentKeyByteArray = currentKey.getBytes(); 
        String bytesString = new String(currentKeyByteArray, StandardCharsets.ISO_8859_1); 
        String fileLocation = "/var/tmp/" + bytesString + ".dat"; 
        FileOutputStream saveFile = new FileOutputStream(fileLocation); 
        ObjectOutputStream out = new ObjectOutputStream(saveFile); 
        out.writeObject(hmap.get(currentKey)); 
        out.close(); 
        saveFile.close(); 
        System.out.println("Saved file at " + fileLocation); 
       } 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     } 

LinuxがJavaコードをどのようにエンコードしているのか、またはJavaコードと関連がありそうですか?

EDIT

私はこの問題は、OSであると思います。たとえば、catでテキストファイルを見ると、問題は同じです。しかし、vimは文字を正しく解読できます。その場合、おそらくターミナルから言語設定を変更する必要がありますか?

+0

文字列内のバイトを異なる文字セットに変換しないでください。文字列の中では、エンコーディングはUTF-16である必要があります。 'getBytes()'は現在のJVMのデフォルトの文字セットのバイトを取得します。 'new String(...、CharSet)'指定された文字セット内にあると仮定してバイトから文字列を作成します。これはあなたが現在の文字セットとして抽出したため、明らかに間違っています。 – RealSkeptic

+0

これらのファイルを読むプログラムを変更する可能性はありますか?私。ファイル名の有効な文字がファイルシステムに大きく依存するという問題を避けるために、ファイル名(base64、...)にキーをエンコードできますか? – sruetti

+0

@RealSkepticどのようなエンコーディングパラメータを渡す必要がありますか? – ChristofferAB

答えて

1

getBytes関数の文字セットも変更する必要があります。

currentKey.getBytes(StandardCharsets.ISO_8859_1); 

また、なぜStandardCharsets.ISO_8859_1を使用していますか?より広い範囲の文字を受け入れるには、StandardCharsets.UTF_8を使用します。

+0

実際には、バイトを抽出または変更しないでください。 – RealSkeptic

+0

@Chinmay jain UTF_8にはISO_8859_1のすべてが含まれますか? – ChristofferAB

+0

はい、すべてがISO_8859_1に含まれます。 –

1

有効なファイル名またはパスの文字は、使用するファイルシステムによって異なります。 はファイル名としてJava文字列を使用することができます(ただし、指定されたファイルシステムでは無効な文字が含まれていない限り)。相互運用性の問題やバグがある可能性があります。

つまり、すべてのCharset-magicは@RealSkepticの推奨事項ではなく、となるはずです。しかし、環境を変更すると予期しない動作が発生する可能性があります。

要件に応じて、短縮された文字セットのみが使用されていることを確認するために、そのキーをエンコードすることができます。 Base64の1つの亜種が動作する可能性があります(ファイルシステムが大文字と小文字を区別していると仮定します)。文字列をファイル名に使用するために安全な文字に減らす関数を提供するライブラリ(Apache Commons?)があります。

+0

ありがとう!私はあなたの提案を試みます。私はそれがおそらくファイルシステムと関係していることを認識しました。 – ChristofferAB

関連する問題