FileOutputStream генерирует FileNotFoundException, если в файле есть кириллица в пути - PullRequest
0 голосов
/ 08 октября 2019

Я пытаюсь записать текст в файл.

Если я использую файл = "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());

Ответы [ 2 ]

0 голосов
/ 09 октября 2019
  1. В "..." обратные слэши должны быть экранированы как \\ или заменены на /.
  2. Компилятор java должен использовать ту же кодировку, что и редактор, для строковых литералов,Вы можете проверить это, заменив "Папка" на u-escape-"\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"));
    
0 голосов
/ 08 октября 2019

Неверный путь к файлу. Используйте "C: \ Temp \ Папка на русском \ Test.txt".

Прочитайте пожалуйста: https://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

Лучше всего написать кросс-платформенный путь (для * nix и ОС Windows)

...