Переименовать файл в To не работает

Я пытаюсь добавить расширение к имени файла, выбранного JFileChooser, хотя я не могу заставить его работать.

Это код:

final JFileChooser fc = new JFileChooser();
        fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        int returnVal = fc.showSaveDialog(null);
        if (returnVal == JFileChooser.APPROVE_OPTION) {
            File f = fc.getSelectedFile();
            String name =f.getAbsoluteFile()+".txt";
            f.renameTo(new File(name));
            FileWriter fstream;
            try {
                fstream = new FileWriter(f);
                BufferedWriter out = new BufferedWriter(fstream);
                out.write("test one");
                out.close();
            } catch (IOException ex) {
                Logger.getLogger(AppCore.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

Я не могу понять, почему это не работает. Я также пытался использовать getPath() и getCanonicalPath(), но результат тот же. Файл создается в выбранном каталоге, но без расширения «.txt».


person Giannis    schedule 01.04.2012    source источник
comment
вы проверили результат от renameTo? Это из документации Java. Может ли этот метод перемещать файл из одной файловой системы в другую, зависит от платформы. Возвращаемое значение всегда следует проверять, чтобы убедиться, что операция переименования прошла успешно.   -  person twain249    schedule 01.04.2012
comment
Да, он всегда возвращает false. Единственный раз, когда это сработало, это когда я установил новое имя файла вручную, но без указания пути: test.txt. Это создало txt, содержащий тестовый, но не в выбранном каталоге   -  person Giannis    schedule 01.04.2012
comment
Вы уверены, что целевой файл еще не существует?   -  person Jon Skeet    schedule 01.04.2012
comment
Да. Создается новый файл, но без расширения. Я просто делаю тест на рабочем столе, чтобы видеть, что происходит.   -  person Giannis    schedule 01.04.2012
comment
Можете ли вы создать файл, просто используя File f2 = new File(name);?   -  person twain249    schedule 01.04.2012
comment
LoL да, это на самом деле сработало ... Хотя стоило попробовать ... Думаю, я могу пойти с этим, но есть предположения, почему renameTo не работает?   -  person Giannis    schedule 01.04.2012


Ответы (4)


Мне кажется, что все, что вам нужно сделать, это изменить имя выбранного файла, а не переименовывать файл в файловой системе. В этом случае вы не используете File.renameTo. Вы просто меняете File. Что-то вроде следующего должно работать:

        File f = fc.getSelectedFile();
        String name = f.getAbsoluteFile()+".txt";
        f = new File(name);

File.renameTo пытается переименовать файл в файловой системе. Например:

File oldFile = new File("test1.txt");
File newFile = new File("test2.txt");
boolean success = oldFile.renameTo(newFile); // renames test1.txt to test2.txt

После этих трех строк success будет true, если файл test1.txt можно было переименовать в test2.txt, и false, если переименование было неудачным (например, test1.txt не существует, открыт в другом процессе, разрешение было отклонено и т. д.)

Рискну предположить, что переименование, которое вы пытаетесь переименовать, не удается, потому что вы пытаетесь переименовать каталог (вы используете JFileChooser с опцией DIRECTORIES_ONLY). Если у вас есть программы, использующие файлы в этом каталоге, или внутри него открыта командная строка, они будут возражать против переименования этого каталога.

person Luke Woodward    schedule 01.04.2012
comment
Да, вы правы, в итоге я просто создал новый файл, используя имя (каталог) из Chooser. Я просто подумал, что операция renameTo может быть использована в этом случае. - person Giannis; 02.04.2012
comment
В моем случае BufferedReader был открыт. По этой причине файл нельзя переименовать. - person Elidio Marquina; 21.05.2015

Вы также можете использовать Files.move из библиотек Google Guava для переименования файла. Это проще, чем писать собственный метод.

Из документов:

Перемещает файл с одного пути на другой. Этот метод может переименовать файл или переместить его в другой каталог, как команда Unix mv.

person Andrejs    schedule 01.04.2012

Вы пишете не в тот файл. Когда вы вызываете renameTo, текущий файл не меняет свой путь. Попробуй это:

final JFileChooser fc = new JFileChooser();
    fc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    int returnVal = fc.showSaveDialog(null);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        File f = fc.getSelectedFile();
        String name =f.getAbsoluteFile()+".txt";
        File f2 = new File(name);
        f.renameTo(f2);
        FileWriter fstream;
        try {
            fstream = new FileWriter(f2);
            BufferedWriter out = new BufferedWriter(fstream);
            out.write("test one");
            out.close();
        } catch (IOException ex) {
            Logger.getLogger(AppCore.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
person Andrés Oviedo    schedule 01.04.2012
comment
Ну, на самом деле это не использует метод renameTo. Хотя это работает. - person Giannis; 01.04.2012

Если вы хотите переименовать файл, необходимо закрыть все объекты (например, FileReader, FileWriter, FIS, FOS означает закрыть объект чтения файла, а затем переименовать его

person Gaikwad    schedule 08.06.2016
comment
Хотя это может быть ценным советом для решения проблемы, ответ действительно требует немного больше деталей, чем этот. Пожалуйста, отредактируйте, чтобы предоставить пример кода, чтобы показать, что вы имеете в виду. В качестве альтернативы, рассмотрите возможность написания этого в качестве комментария. - person Toby Speight; 09.06.2016