Как обеспечить блокировку файла для файла свойств в Java?
Я использую файл свойств для хранения количества двух переменных:
- ТрансИд
- RegisNumber
Логика работает так:
1) Первоначально две переменные инициализируются в 1 и сохраняются в файле Sequence.properties.
2) RegisNumber будет равен 1, тогда как при каждом вызове предыдущее значение TransId выбирается из файла Sequence.properties и увеличивается до 1.
Требование заключается в следующем: "n" количество вызовов может быть сделано одновременно с функцией executeRegNo (), поэтому существует возможность "n" числа процессов, обращающихся к файлу Sequence.properties одновременно.
Модификация сделана мной: я попытался поставить fileLock. Код следующий:
public static String executeRegNo() {
File file=new File("C:/Users/abc/Desktop/Files/GetCount.properties");
Properties properties=new Properties();
FileLock lock=null;
if (!file.exists()) {
try
{
file.createNewFile();
properties.setProperty("TransNum", "0");
properties.setProperty("RegId", "1");
properties.store(new FileOutputStream(file), null);
}
catch (IOException e)
{
e.printStackTrace();
}
}
else
if (file.canRead()) {
try
{
FileChannel fileChannel=new RandomAccessFile(file, "rw").getChannel(); // 1. modified
lock=fileChannel.lock();//2. modified
properties.load(new FileInputStream(file));
}
catch (IOException e)
{
e.printStackTrace();
}
String transId = properties.getProperty("TransNum");
String RegisId = properties.getProperty("RegId");
properties.setProperty("TransNum", String.valueOf(Integer.parseInt(transId) + 1));
properties.setProperty("RegId", String.valueOf(Integer.parseInt(RegisId)));
try
{
properties.store(new FileOutputStream(file), null);
}
catch (FileNotFoundException e)
{
e.printStackTrace();
}
catch (IOException e)
{
e.printStackTrace();
}
}
String RId = properties.getProperty("RegId");
String TId = properties.getProperty("TransNum");
try {
lock.release(); //3. modified
} catch (IOException e) {
e.printStackTrace();
}
DecimalFormat df = new DecimalFormat("00");
String R = String.valueOf(df.format(Integer.parseInt(RId)));
DecimalFormat df1 = new DecimalFormat("0000");
String T = String.valueOf(df1.format(Integer.parseInt(TId)));
return R + T;
}
Я получаю ошибку: процесс не может получить доступ к файлу, потому что другой процесс заблокировал часть файла.
Где именно поставить FileLock в коде?
Пожалуйста, помогите в решении вопросов.
Заранее спасибо.
2 ответа
Где именно поставить FileLock в коде?
Нигде. Блокировки файлов не являются решением проблемы безопасности потоков. Смотрите Javadoc.
Вы должны использовать синхронизацию для этого.
Или ReadWriteLock.
Или база данных.
Взгляните на ReadWriteLock s, который является оптимальным решением для файлов, когда у вас есть несколько потоков, читающих одновременно.