現在、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は文字を正しく解読できます。その場合、おそらくターミナルから言語設定を変更する必要がありますか?
文字列内のバイトを異なる文字セットに変換しないでください。文字列の中では、エンコーディングはUTF-16である必要があります。 'getBytes()'は現在のJVMのデフォルトの文字セットのバイトを取得します。 'new String(...、CharSet)'指定された文字セット内にあると仮定してバイトから文字列を作成します。これはあなたが現在の文字セットとして抽出したため、明らかに間違っています。 – RealSkeptic
これらのファイルを読むプログラムを変更する可能性はありますか?私。ファイル名の有効な文字がファイルシステムに大きく依存するという問題を避けるために、ファイル名(base64、...)にキーをエンコードできますか? – sruetti
@RealSkepticどのようなエンコーディングパラメータを渡す必要がありますか? – ChristofferAB