Can';在Java中创建新文件时,请不要正确使用拉丁字符。文件名会得到奇怪的字符,而不是正确的字符

Can';在Java中创建新文件时,请不要正确使用拉丁字符。文件名会得到奇怪的字符,而不是正确的字符,java,file-io,character-encoding,save,filesystems,Java,File Io,Character Encoding,Save,Filesystems,当前正在将hashmap中的int[]保存到文件中,文件名为int[]的键。必须可以从另一个程序访问此确切的密钥。因此,我不能将文件名切换为纯英语字符。但是,即使我使用ISO_8859_1作为文件名的字符集,文件树中的文件也会变得一团糟。英文字母是正确的,但不是特别的 /** * Save array to file */ public void saveStatus(){ try {

当前正在将hashmap中的int[]保存到文件中,文件名为int[]的键。必须可以从另一个程序访问此确切的密钥。因此,我不能将文件名切换为纯英语字符。但是,即使我使用ISO_8859_1作为文件名的字符集,文件树中的文件也会变得一团糟。英文字母是正确的,但不是特别的

        /**
        * 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代码有关

编辑


我认为问题在于操作系统。因为当使用cat查看文本文件时,问题是相同的。然而,vim能够正确解码字母。在这种情况下,我可能必须从终端更改语言设置。

您还必须更改
getBytes
函数中的字符集

currentKey.getBytes(StandardCharsets.ISO_8859_1);

另外,为什么要使用
标准字符集.ISO_8859_1
?要接受范围更广的字符,请使用
标准字符集.UTF_8

您还必须在
getBytes
函数中更改字符集

currentKey.getBytes(StandardCharsets.ISO_8859_1);

另外,为什么要使用
标准字符集.ISO_8859_1
?要接受范围更广的字符,请使用
标准字符集.UTF_8

文件名或路径的有效字符因使用的文件系统而异。虽然可以只使用java字符串作为文件名(只要它不包含给定文件系统中无效的字符),但可能存在互操作性问题和bug

换言之,省略@realponsum建议的所有字符集魔法,它应该会起作用。但是改变环境可能会导致意外的行为


因此,根据您的需求,您可能需要对密钥进行编码,以确保它只使用精简的字符集。的一个变体可能会起作用(假设您的文件系统区分大小写!)。您甚至可能会发现一个库(Apache Commons?)提供了一个函数,可以将字符串减少为文件名中可以安全使用的字符。

文件名或路径的有效字符因使用的文件系统而异。虽然可以只使用java字符串作为文件名(只要它不包含给定文件系统中无效的字符),但可能存在互操作性问题和bug

换言之,省略@realponsum建议的所有字符集魔法,它应该会起作用。但是改变环境可能会导致意外的行为



因此,根据您的需求,您可能需要对密钥进行编码,以确保它只使用精简的字符集。的一个变体可能会起作用(假设您的文件系统区分大小写!)。您甚至可能会发现一个库(Apache Commons?)提供了一个函数,可以将字符串简化为可在文件名中安全使用的字符。

您不应该尝试将字符串中的字节转换为不同的字符集。在字符串中,编码是UTF-16,并且应该是UTF-16
getBytes()
获取当前JVM默认字符集中的字节
newstring(…,CharSet)
假设字节位于给定的字符集中,则从字节创建字符串。这显然是错误的,因为您将它们提取为当前字符集。您有可能修改读取这些文件的程序吗?也就是说,您可以在文件名(base64,…)中对密钥进行编码,以避免文件名的有效字符高度依赖于文件系统的问题。@realpoint我应该传递任何编码参数吗?您不应该尝试使用字节更改字符串的内容。问题是当Java创建文件名时,这可能与文件系统有关,或者控制台中存在问题,或者JVM编码标志中的一个设置错误。Java没有提供选项来设置写入文件名的编码。@sruetti我将文件保存为文件系统中的文本文件。然后在java的FileReader的帮助下阅读它们。我不确定是否可以按照您建议的方式读取文件名。您不应该尝试将字符串中的字节转换为不同的字符集。在字符串中,编码是UTF-16,并且应该是UTF-16
getBytes()
获取当前JVM默认字符集中的字节
newstring(…,CharSet)
假设字节位于给定的字符集中,则从字节创建字符串。这显然是错误的,因为您将它们提取为当前字符集。您有可能修改读取这些文件的程序吗?也就是说,您可以在文件名(base64,…)中对密钥进行编码,以避免文件名的有效字符高度依赖于文件系统的问题。@realpoint我应该传递任何编码参数吗?您不应该尝试使用字节更改字符串的内容。问题是当Java创建文件名时,这可能与文件系统有关,或者控制台中存在问题,或者JVM编码标志中的一个设置错误。Java没有提供选项来设置写入文件名的编码。@sruetti我将文件保存为文件系统中的文本文件。然后在java的FileReader的帮助下阅读它们。我不确定是否可以按照您建议的方式读取文件名。事实上,字节根本不应该被提取或更改。@Chinmay jain UTF_8会包括ISO_8859_1中的所有内容吗?是的,它会包括ISO_8859_1中的所有内容。事实上,不应提取或更改字节。@Chinmay jain UTF_8是否包括ISO_8859_1中的所有内容?是的,它将包括ISO_8859_1中的所有内容。谢谢!我会试试你的建议。我意识到这可能与文件系统有关。谢谢!我会试试你的建议。我意识到这可能与文件系统有关。