Java renameTo - не работает переименование

351
30 марта 2017, 19:40

Добрый день. Никак не могу понять как переименовывать файл в Java, т.к. не могу отследить действия этого метода (прошелся по renameTo отладчиком - даже не знаю за что зацепиться, т.к. отладчик просто не смог работать дальше и выкрикнул "can not find native method").

Интересно, что renameTo не выкидывает исключения при неудачном переименовании, так что я совсем обезоружен и не знаю как быть. Подозреваю, что Java не может переименовать файл, т.к. не закрыт FileWriter, нет прав на запись в каталог или файл занят другим процессом. Как проверить мои подозрения - я не знаю, но в коде я совершенно точно (как мне кажется) закрываю FileWriter. А догадка насчет недостатка прав отпадает, т.к. createNewFile() без проблем создает файлы.

Как быть? Надеюсь на вашу помощь и спасибо заранее :)

Код:

package demon;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.File;
import java.io.*;
import java.util.Timer;
import java.util.TimerTask;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
 * Демон, который периодически записывает в файл
 * timer.txt системную дату и время и произвольную
 * метаинформацию о системе. Если размер файла
 * превышается 100КБ, то timer.txt переименовывается
 * в timer_<datatime>.txt и создается новый файл timer.txt
 * 
 * @author Valentina
 */
public class Demon {
    private static String fileName = "C:\\Users\\rares\\Downloads\\Demon\\time.txt"; // Путь к текущему файлу
    static DateFormat formatter = new SimpleDateFormat("dd.MM.yyyy HH:mm:ss"); // Формат времени
    static Date now = new Date(); 
    /**
     * Точка входа приложения
     * 
     * @param args Массив аргументов
     */
    public static void main(String[] args)  {
        Timer timer = new Timer();
        // Внутренний класс, реализующий запуск и работу демона по таймеру
        TimerTask task = new TimerTask() {
            @Override
            public void run() {
                String newfile = "C:\\Users\\rares\\Downloads\\Demon\\timer_"+formatter.format(now.getTime())+".txt";
                File file = new File(fileName);
                File file1 = new File(newfile);
                create(file);     
                long S = length(file);  
                System.out.println(S);
                if (S>20000)  {
                    if (file.renameTo(file1))
                        System.out.print("1");
                    else
                        System.out.print("0");
                    create( new File(fileName));
                }else {
                    update();
                }  
            }   
        };
        timer.schedule(task,10,10);
    } 
    /**
     * Создает новый файл с проверкой на существование
     * @param file Входной объект класса {@link File}, который будет создан
     */
    public static void create(File file){
        if(file.exists())
            System.out.println("Файл существует");
        else
            try {
                file.createNewFile(); 
            } catch (IOException ex) {}
    }
    /**
     * Записывает в файл одну строку, состоящую из времени и имени пользователя
     */
    public static void update() { // TODO: Имхо, это не должно быть статиком.
        File file = new File(fileName);
        FileWriter fr;
        String s = formatter.format(now.getTime());
        System.out.println(s);
        try {
            fr = new FileWriter (file,true);
            s+=System.getProperty("user.name");
            fr.write(s);
            fr.close();
        } catch (IOException e) {
            e.printStackTrace();
            try {
                fr.close();
            } catch (IOException ex) {
                Logger.getLogger(Demon.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }
    /**
     * Метод-обертка, возаращающий размер файла
     * @param file Объект {@link File}, для которого нужно получить размер
     * @return Размер файла в битах
     */
    public static Long length(File file) {     
        return file.length();
    }
}
Answer 1

renameTo это то что вам надо. Но необходимо проверить существование исходного файла и права него. И самое главное - вы уверены, что новое имя файла которое вы хотите дать корректно с точки зрения ОС??? Т.е. в нем нет недопустимо ых символов (подсказка - например двоеточие)?

Answer 2

Если используете java 7 и выше - посмотрите в сторону библиотеки Files. Работа непосредственно с файлами станет проще) https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html

READ ALSO
Можно ли обойти ограничение на запись на ExSDcard?

Можно ли обойти ограничение на запись на ExSDcard?

Пишу простую программу для шифрования данных в AndroidСтолкнулся с такой проблемой, что нет доступа на запись к exSDcard устройств

263
Открытие Jar через winrar

Открытие Jar через winrar

Заинтерисовал меня такой вопрос, возможно ли сделать так, что бы jar нельзя было бы открыть с помощью winrarПытался завернуть в exe с помощью launch4j,...

268
Оплата через liqPay androi

Оплата через liqPay androi

Никогда не делал приложение, в котором осуществляется оплатаИнтересует такой вопрос, вот на сайте, к примеру, есть кнопка "Оплатить", нажимаем...

205