Java создать файл, если он не существует

В моей функции я хочу прочитать текстовый файл. Если файл не существует, он будет создан. Я хочу использовать относительный путь, поэтому, если у меня есть .jar, файл будет создан в том же каталоге. Я пробовал это. Это моя функция, а для переменной fName установлено значение test.txt.

    private static String readFile(String fName) {
    String noDiacText;
    StringBuilder sb = new StringBuilder();
    try {
        File f = new File(fName, "UTF8");
        if(!f.exists()){
            f.getParentFile().mkdirs();
            f.createNewFile();
        }

        FileReader reader = new FileReader(fName);
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(fName), "UTF8"));

        String line;

        while ((line = bufferedReader.readLine()) != null) {
            sb.append(line);

        }
        reader.close();

    } catch (IOException e) {
        e.printStackTrace();
    }


    return sb.toString();
}

Я получаю сообщение об ошибке в f.createNewFile();, оно говорит

java.io.IOException:  System cannot find the path specified
at java.io.WinNTFileSystem.createFileExclusively(Native Method)
at java.io.File.createNewFile(File.java:1012)
at main.zadanie3.readFile(zadanie3.java:92)

person tprieboj    schedule 07.11.2015    source источник
comment
Добавьте println или что-то еще и отладьте, как выглядит путь. Не могли бы вы также сказать, какая строка функции вызывает исключение.   -  person Reinard    schedule 07.11.2015
comment
Если вы используете Java 7+, вам следует вместо этого использовать java.nio.file.   -  person fge    schedule 07.11.2015
comment
Почему? Что вам хорошего в пустом файле? И пустая строка? Просто поймайте FileNotFoundException,, а еще лучше пусть будет брошено.   -  person user207421    schedule 07.11.2015


Ответы (2)


Проблема в том, что

File f = new File(fName, "UTF8");

Не устанавливает кодировку файла в UTF8. Вместо этого вторым аргументом является дочерний путь, который не имеет ничего общего с кодировкой; первый - родительский путь.

Итак, что вы хотели на самом деле:

File f = new File("C:\\Parent", "testfile.txt");

или просто:

File f = new File(fullFilePathName);

Без второго аргумента

person Bon    schedule 07.11.2015

Используйте mkdirs() --plural-- для создания всех недостающих частей пути.

File f = new File("/many/parts/path");
f.mkdirs();

Обратите внимание, что 'mkdir()' --singular-- создает только списочную часть пути, если это возможно.

person Shoham    schedule 20.03.2016