Как заблокировать файл блокировки с нулевым байтом (объект класса InputStream)?

#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. Я отредактировал вопрос с помощью лучшего фрагмента. Спасибо за этот комментарий