Я пишу приложение (для образовательных целей), которому необходимо использовать систему управления базами данных (я написал свою очень примитивную СУБД, это часть задачи). И я хочу убедиться, что в любое время, когда выполняется мое приложение, содержимое всех таблиц верное. Для этого я написал метод, который просматривает каждый файл и делает необходимые проверки. Проблема в том, что я хочу вызывать этот метод только один раз, когда приложение запускает и запрещает доступ к файлам, чтобы гарантировать, что никто не изменил их содержимое во время работы моей программы.Запретить доступ к файлу для всех других процессов?
Я использую следующий подход. Когда приложение запускается, я инициализирую InputStreamReader и OutputStreamWriter, сохраните их и закройте их, только когда мое приложение будет завершено.
Часть метода инициализации:
FileInputStream fis = new FileInputStream(file);
FileOutputStream fos = new FileOutputStream(file, true);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
OutputStreamWriter osw = new OutputStreamWriter(fos, "UTF-8");
this.tables.get(table).put("fis", fis);
this.tables.get(table).put("fos", fos);
this.tables.get(table).put("isr", isr);
this.tables.get(table).put("osw", osw);
Закрыть метод:
try {
for(Map<String, Object> table_map: tables.values()) {
OutputStreamWriter osw = (OutputStreamWriter)table_map.get("osw");
InputStreamReader isr = (InputStreamReader)table_map.get("isr");
if (osw != null)
osw.close();
if (isr != null)
isr.close();
}
}
catch (IOException e) {
throw new DBException("Closing error");
}
Частично этот подход работает, потому что, когда я пытаюсь изменить любой из этих файлов с помощью MS Notepad, Я получаю следующую ошибку:
«Процесс не может получить доступ к файлу, так как он используется другим процессом »
Вот что я хочу видеть. Но если я использую Notepad ++, я могу вносить какие-либо изменения, когда мое приложение работает, это не то, что я ожидаю увидеть. Итак, что я могу сделать, чтобы ни один другой процесс не мог изменять мои файлы?
Я пытался использовать FileLock, но он запрещает доступ только для моего процесса, если я не ошибаюсь.
Извините за моего бедного английского, надеюсь, вы поймете мой вопрос в любом случае.
Вместо использования карты я бы использовал объект, который содержит 'osw' и' isr'. Я бы закрепил их для повышения производительности, и я бы не сохранил исходные потоки, поскольку они вам не нужны. Я бы использовал правильную IDE, которая поможет вам писать, запускать и отлаживать код. –
Самый простой способ запретить доступ к файлу - переименовать его. Таким образом, вы не сможете получить доступ к нему, если не знаете, что вызвал файл, вы можете изменить его расширение. –
Yup, переименовывая файл, обычно работает с удовольствием ... просто переименуйте его в нечто «очень уникальное», например filename.UUID.ext. См. Doco: http://docs.oracle.com/javase/6/docs/api/java/util/UUID.html – corlettk