Добрый день. Никак не могу понять как переименовывать файл в 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();
}
}
renameTo это то что вам надо. Но необходимо проверить существование исходного файла и права него. И самое главное - вы уверены, что новое имя файла которое вы хотите дать корректно с точки зрения ОС??? Т.е. в нем нет недопустимо ых символов (подсказка - например двоеточие)?
Если используете java 7 и выше - посмотрите в сторону библиотеки Files. Работа непосредственно с файлами станет проще) https://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Пишу простую программу для шифрования данных в AndroidСтолкнулся с такой проблемой, что нет доступа на запись к exSDcard устройств
Заинтерисовал меня такой вопрос, возможно ли сделать так, что бы jar нельзя было бы открыть с помощью winrarПытался завернуть в exe с помощью launch4j,...
Никогда не делал приложение, в котором осуществляется оплатаИнтересует такой вопрос, вот на сайте, к примеру, есть кнопка "Оплатить", нажимаем...