【问题标题】:FileOutputStream throws FileNotFoundException if file has cyrillic in path如果文件在路径中有西里尔字母,则 FileOutputStream 抛出 FileNotFoundException
【发布时间】:2020-02-05 16:15:15
【问题描述】:

我正在尝试将文本写入文件。

如果我使用 file = "C:\Temp\Dir\Test.txt",那么我没有问题

如果我在 path = "C:\Temp\Папка на русском\Test.txt" 中使用带有西里尔字母的文件,那么我有异常

注意。在代码运行之前不会创建目录

public Boolean writeStringToFile(String content, File file) {
    status = false;
    try (FileOutputStream fos = new FileOutputStream(file, false);
                    OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
                    BufferedWriter fileWriter = new BufferedWriter(osw)) {
        fileWriter.write(content);
        status = true;
    } catch (FileNotFoundException e) {
        logger.error("File {}/{} can not be created.", file.getPath(), file.getName(), e);
    }
    return status;
}

用于测试:

writeStringToFile("writeStringToFile is ok. Кодировка UTF-8", 
    new File(Files.temporaryFolderPath() + "Папка на русском" + File.separator + "Test.txt"))
assertTrue(file.exists());

【问题讨论】:

  • 这是预期行为,只是不要在文件名或路径中使用西里尔字母
  • 请发帖minimal reproducible example(例如“C:\Temp...”不是有效的java字符串)
  • @Vault23 真的吗?基于什么?对我来说工作正常(使用“C:\\tmp\\Папка на русском\\A1.txt”并且已经创建了目录)
  • @Vault23 也适用于我。 Windows 10 上的 JDK 13,我还通过 Java 代码创建了目录。

标签: java filenotfoundexception fileoutputstream cyrillic


【解决方案1】:
  1. 在“...”中,反斜杠必须转义为 \\ 或替换为 /
  2. 对于字符串文字,java 编译器必须使用与编辑器相同的编码。 您可以通过将 "Папка" 替换为 u-escaped "\u041F\u0430\u043F\u043A\u0430" 来进行测试。
  3. 必须创建目录。

        Path path = Paths.get("C:\\Temp\\Папка на русском\\Test.txt");
        Files.createDirectories(path.getParent());
        Files.write(path,
            "C:\\Temp\\Папка на русском\\Test.txt".getBytes(StandardCharsets.UTF_8));
    
        writeStringToFile( "C:\\Temp\\Папка на русском\\Test.txt",
            new File( "C:\\Temp\\Папка на русском\\Test2.txt"));
    

【讨论】:

    【解决方案2】:

    文件路径无效。使用“C:\Temp\Папка на русском\Test.txt”。

    请阅读:https://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

    最好写一个跨平台的路径(对于*nix和Windows OS)

    【讨论】:

    • 我最初也得到了 Invalid file path,因为在我运行代码时该目录不存在。然后我更改了我的代码,以便如果它不存在并且程序运行无异常,它也创建了目录,即它创建了目录和文件。我会说你的回答更多的是一个建议,并没有回答 OP 关于他为什么未能在他的 java 代码中创建文件的问题。
    • 还要注意,给定的链接是关于 Path 类 (java.nio),OP 使用的是 File (java.io) - 这不会使这个 answer i>(“写跨平台路径”可以解释...)
    猜你喜欢
    • 2016-08-29
    • 1970-01-01
    • 2017-09-10
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    • 2019-09-17
    • 1970-01-01
    • 2013-06-02
    相关资源
    最近更新 更多