如果文件路径中有西里尔字母,则FileOutputStream抛出FileNotFoundException

时间:2019-10-08 11:15:03

标签: java filenotfoundexception fileoutputstream cyrillic

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

如果我使用文件=“ C:\ Temp \ Dir \ Test.txt”,那么我没问题

如果我在路径=“ 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());

2 个答案:

答案 0 :(得分:0)

  1. 在“ ...”中,反斜杠必须转义为\\或由/代替。
  2. 对于String文字,java编译器必须使用与编辑器相同的编码。 您可以通过用转义的"Папка"替换"\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"));
    

答案 1 :(得分:-1)

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

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

最好编写一个跨平台的路径(对于* nix和Windows操作系统)

相关问题