#java #locking #inputstream
#java #блокировка #входной поток
Вопрос:
У меня есть код, как показано, и он успешно работает. Однако при включении закомментированной строки lock =f.tryLock()
возникает исключение IOException. Это происходит из-за блокировки файла. Я не хочу, чтобы файлы блокировки считывались / копировались (мне нужно отфильтровать файлы блокировки из InputStream), и, следовательно, код не должен вызывать исключение IOException в этом случае. Кто-нибудь может мне помочь в этом?
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.channels.FileLock;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
public class Lock {
public static void main(String args[]) throws IOException, InterruptedException {
RandomAccessFile file = null; // The file we'll lock
FileChannel f = null; // The channel to the file
FileLock lock = null; // The lock object we hold
OutputStream out = null;
InputStream in = null;
try {
String tmpdir = System.getProperty("java.io.tmpdir");
String filename = Lock.class.getName() ".lock";
File lockfile = new File(tmpdir, filename);
file = new RandomAccessFile(lockfile, "rw");
f = file.getChannel();
// lock = f.tryLock();
in = new FileInputStream(lockfile);
byte[] buffer = new byte[1024];
if(in.read(buffer)!=0){
int len = in.read(buffer);
while (len != -1) {
out.write(buffer, 0, len);
len = in.read(buffer); }
}
in.close();
if (lock != null) {
lockfile.deleteOnExit(); // Just a temporary file
}
} catch (IOException e) {
System.out.println(e);
throw e;
}
finally{
if (lock != null amp;amp; lock.isValid())
lock.release();
if (file != null)
file.close();
}
}
}
Исключение:
java.io.FileNotFoundException: The system cannot find the file specified
Exception in thread "Main Thread" java.io.FileNotFoundException: The system cannot find the file specified
at java.io.FileInputStream.readBytes(FileInputStream.java)
at java.io.FileInputStream.read(FileInputStream.java:198)
at Lock.main(Lock.java:32)
Комментарии:
1. Что вы подразумеваете под «запретить файлам блокировки с нулевым байтом выполнять вышеуказанное действие»? И какое исключение IOException выдается? И почему вы копируете файлы блокировки?
2. Невозможно воспроизвести: gist.github.com/jnizet/7f16c83e906a1f634de0 не выдает никаких исключений.
3. И вы говорите о файлах блокировки или заблокированных файлах?
4. @EJP Я пытаюсь остановить копирование заблокированных файлов. Возникшее исключение — файл отсутствует
5. @JBNizet Проблема может быть воспроизведена. Попробуйте создать файл, как показано здесь, и прочитать из него ссылку
Ответ №1:
Если вы надежно получаете какое-либо исключение IOException при чтении заблокированных файлов, простое его обнаружение и прерывание / очистка копии, по-видимому, полностью решает вашу проблему. Вы должны делать это в любом случае при любом IOException, не только при этом, так что в этой ситуации нет ничего особенного.
InputStream.available() не имеет никакого отношения ни к блокировкам файлов, ни к размерам файлов. Смотрите Javadoc.
Комментарии:
1. Я отредактировал вопрос с помощью лучшего фрагмента. Спасибо за этот комментарий