通过Java创建时Linux上的文件名编码问题

通过Java创建时Linux上的文件名编码问题,java,linux,encoding,Java,Linux,Encoding,我有一个问题,我已经被它困扰了很长一段时间了。问题是,我不能让文件名支持特殊字符(只有文件名,文件内容可以)。文件名不是用问号创建的,而是用问号创建的 现在,据我所知(我很可能遗漏了一些非常明显的东西),Linux本身设置正确。Locale命令将打印出以下内容,我认为这很好: LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" LC_NUMERIC="en_US.UTF-8" LC_TIME="en_US.UTF-8" LC_C

我有一个问题,我已经被它困扰了很长一段时间了。问题是,我不能让文件名支持特殊字符(只有文件名,文件内容可以)。文件名不是用问号创建的,而是用问号创建的

现在,据我所知(我很可能遗漏了一些非常明显的东西),Linux本身设置正确。Locale命令将打印出以下内容,我认为这很好:

    LANG=en_US.UTF-8
    LC_CTYPE="en_US.UTF-8"
    LC_NUMERIC="en_US.UTF-8"
    LC_TIME="en_US.UTF-8"
    LC_COLLATE="en_US.UTF-8"
    LC_MONETARY="en_US.UTF-8"
    LC_MESSAGES="en_US.UTF-8"
    LC_PAPER="en_US.UTF-8"
    LC_NAME="en_US.UTF-8"
    LC_ADDRESS="en_US.UTF-8"
    LC_TELEPHONE="en_US.UTF-8"
    LC_MEASUREMENT="en_US.UTF-8"
    LC_IDENTIFICATION="en_US.UTF-8"
    LC_ALL=
这是我为测试目的编写的Java代码。并不是所有的东西都能让事情变得清晰(比如最后一块),但所有重要的东西都是。我还尝试了使用BufferedOutputStream对主题进行修改,但结果是一样的

    String exampleString="I'm in the file: \u0160 \u0161 \u010C \u010D";
    String filename="I'm the filename \u0160\u0161\u010C\u010D.txt";

    FileOutputStream fos = null;
    InputStream is = null;
    try {

        fos = new FileOutputStream(transferDir.getPath()
                + File.separator + "_"
                + filename);

        is = new ByteArrayInputStream(exampleString.getBytes(StandardCharsets.UTF_8));

        byte[] buffer = new byte[4096];
        int counter;
        while ((counter = is.read(buffer)) != -1) {
            fos.write(buffer, 0, counter);
        }
    } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
我也尝试过用file.encodingsun.jnu.encoding属性启动程序,但没有任何改变


我开始怀疑真相是否真的存在,所以任何帮助都将不胜感激

您从哪里可以看到文件名中的问号?这可能是因为您试图在其中执行ls-l(或其他任何操作)的控制台没有适当渲染外来字符的glyph


创建这样的文件后,请尝试使用预期的名称和带问号的名称打开该文件。您很快就会知道名称本身是否真的在文件创建过程中出错。

好吧,这似乎是旧文件API中的一个长期错误。通过切换到较新的java.nio包,我已经解决了所有问题-没有任何类型的额外配置-

您确定创建的文件名中包含问号吗?还是只有您的终端无法显示字符?请包括您想要的名称。(
fos.close()
called?)尝试将
File.listFiles(…)
转储到文件中进行分析。我尽可能确定。例如,如果我使用浏览器应用程序列出这些文件,因此没有使用Putty或WinSCP(设置为显示UTF-8),问号仍然存在。例如,“我在文件名中:šŠŠŠŠŠŠŠŠŠŠŠŠŠŠ35。列出文件还将显示问号,例如:
07:46:05367调试目录lib64 07:46:05367调试文件alfresco.log.2015-03-13 07:46:05367调试文件alfresco.log.2015-04-20 07:46:05367调试文件\u test???.txt 07:46:05367调试目录srv 07:46:05367调试目录cgroup
我正在使用Putty和WinSCP,这两个都是通过支持UTF-8进行设置的。这是一个好主意,但我确保不会犯这个错误。不过谢谢你的主意。