【问题标题】:java.io.IOException: No such file or directoryjava.io.IOException:没有这样的文件或目录
【发布时间】:2017-10-24 15:43:29
【问题描述】:

我在使用 java 保存/创建文件时遇到问题。

java.io.IOException: No such file or directory
at java.io.UnixFileSystem.createFileExclusively(Native Method) ~[na:1.7.0_79]

我的环境使用的是 Linux,但安装在 Windows 上(我尝试存储文件的地方)。 每当我尝试创建文件名包含中文字符时,它都会命中。

会不会因为 Linux 和 Windows 之间的编码不同而发生这种情况?

当我尝试在类似的操作系统中运行和存储时(在 Linux 中运行应用程序,在 Linux 中存储,对于 Windows 也是如此),它运行顺利。

非常感谢任何帮助。

我用来创建文件的代码

        File imgPath = new File(fullpath.toString());

        if (!imgPath.exists()){                 
            FileUtils.forceMkdir(imgPath);
            imgPath.setWritable(true, false);
        }

        fullpath.append(File.separator).append(fileName);

        outputStream = new FileOutputStream(new File(fullpath.toString()));

非常感谢。

【问题讨论】:

  • 不是拼写错误,而是操作系统跨平台问题。我上面已经提到了。我在 linux 上运行我的应用程序,同时尝试将其保存在 windows mount 上。已检查路径,权限。当文件名没有中文字符时,它可以正常工作。

标签: java linux


【解决方案1】:

注意:我是一个相当新的用户,还不能直接发表评论(仅限于我目前的问题和答案),所以我将其发布为答案。

Windows 使用 UTF-16,而 Linux 使用 UTF-8; (考虑到您还没有安装任何额外的东西来改变任何东西)UTF-8 和 UTF-16 支持相同的字符范围。但是,我没记错,它与内存有关(UTF-8 从 8 位开始,UTF-16 从 16 位开始?)。无论如何,它们的存储/读取方式略有不同。然后,InputStreamReader 将字符从以指定编码的外部表示形式转换为内部表示形式。在这个 stackoverflow 帖子 (Difference between UTF-8 and UTF-16?) 中提到了它以字节为单位的确切方式。它们基本相同,但其他不同,例如汉字。建议沿着这条线寻找解决方案(我必须去上课!)。我可能完全错了,但这可能是一个很好的起点。祝你好运。

【讨论】:

  • 抱歉回复慢。就像你说的那样,但即使在 UTF-16 上也有简体中文和繁体中文。我已成功保存文件,但文件名完全不同,因为实际文件名使用的是简化版本。
猜你喜欢
  • 2019-12-25
  • 2014-11-19
  • 1970-01-01
  • 2011-11-20
  • 2021-06-24
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多