Java FileOutputStream将文件名与系统中的其他字符集一起保存

Java FileOutputStream将文件名与系统中的其他字符集一起保存,java,file-io,unicode,Java,File Io,Unicode,当我使用FileOutputStream时,文件名字符集有问题 我的代码非常简单,而且使用方便 FileOutputStream 使用文件对象作为参数 但是在我的应用程序中,路径文件正确地打印在System.out.println()调用上 但在磁盘上,它是使用另一个字符集保存的(我不知道是什么) 例如:在System.out.println上,输出为: C:\Folder\MyLatinNameWithÃorÃorAnotheLatinChar 但在real disk filename中,写

当我使用FileOutputStream时,文件名字符集有问题

我的代码非常简单,而且使用方便

FileOutputStream
使用
文件
对象作为参数

但是在我的应用程序中,路径文件正确地打印在
System.out.println()调用上

但在磁盘上,它是使用另一个字符集保存的(我不知道是什么)

例如:在
System.out.println上,输出为:

C:\Folder\MyLatinNameWithÃorÃorAnotheLatinChar

但在real disk filename中,写入的名称是:

C:\Folder\MyLatinNameWithç或ÃorAnotheLatinChar

发生了什么事


很抱歉没有问题,但我真的有问题。

系统。out
不太可靠

最好直接检查字符串,看看是否正确:

  private static void debugPrint(String str) {
    for (char ch : str.toCharArray()) {
      if (ch < ' ' || ch > '~') {
        System.out.format("\\u%04x", (int) ch);
      } else {
        System.out.print(ch);
      }
    }
  }
private static void debugPrint(字符串str){
for(字符ch:str.toCharArray()){
如果(ch<'''| ch>'~'){
系统输出格式(“\\u%04x”,(int)ch);
}否则{
系统输出打印(ch);
}
}
}
它将打印可见ASCII范围之外的任何内容的转义形式-变成
\u007c
。然后可以对照检查值以查看字符串中的实际内容


这里的问题可能来自Windows中播放的字符编码数量:

  • (早于Windows)-cmd.exe中的默认值
  • (随Windows引入)-记事本中的默认值
  • “Unicode”(UTF-16LE-通过Windows NT行普遍采用)
除了Unicode之外,其他所有东西都被弃用了,因为向后兼容的原因,所有东西都挂起了,但由于粗心,它们经常会损坏数据。当Java被引入时,Unicode的采用并不普遍,并且在Windows上一直存在


这也是一个想法,以检查。某些devrloper在
文件中输入。编码
属性,但将其从默认值更改为,可能会对本机代码调用产生不利影响。

在写入文件时,您可能没有正确指定代码集。显示要写入文件的代码。我尝试添加以下代码:
file storeFile=new file(filePath);InputStream fileContent=item.getInputStream();OutputStream OutputStream=新文件OutputStream(storeFile);字节[]缓冲区=新字节[32768]//36kb while(fileContent.read(buffer)>0){outputStream.write(buffer);}
这是一个有趣的问题。JavaAPI在这一点上并不清楚。这与用于写入文件的字符编码无关-FileOutputStream甚至没有,只有OutputStreamWriter有一个。了解您在Windows上使用的文件系统很重要,但我猜这是一个NTFS文件系统,它将文件名存储在UTF16中。我正在使用Windows和NTFS文件系统。我的错是,我没有意识到这是文件名的问题,而不是内容的问题。抱歉,这可能会造成任何混乱。