Java: abrindo e lendo de um arquivo sem bloqueá-lo

Eu preciso ser capaz de imitar ‘tail -f’ com Java. Eu estou tentando ler um arquivo de log como ele está sendo escrito por outro processo, mas quando eu abro o arquivo para lê-lo, ele bloqueia o arquivo e o outro processo não pode mais escrever para ele. Qualquer ajuda seria muito apreciada!

Aqui está o código que estou usando atualmente:

public void read(){ Scanner fp = null; try{ fp = new Scanner(new FileReader(this.filename)); fp.useDelimiter("\n"); }catch(java.io.FileNotFoundException e){ System.out.println("java.io.FileNotFoundException e"); } while(true){ if(fp.hasNext()){ this.parse(fp.next()); } } } 

Reconstruir a cauda é complicado devido a alguns casos especiais, como truncamento de arquivos e exclusão (intermediária). Para abrir o arquivo sem travar, use StandardOpenOption.READ com a nova API de arquivo Java da seguinte forma:

 try (InputStream is = Files.newInputStream(path, StandardOpenOption.READ)) { InputStreamReader reader = new InputStreamReader(is, fileEncoding); BufferedReader lineReader = new BufferedReader(reader); // Process all lines. String line; while ((line = lineReader.readLine()) != null) { // Line content content is in variable line. } } 

Para minha tentativa de criar uma cauda em Java, consulte:

Sinta-se à vontade para inspirar-se nesse código ou simplesmente copiar as partes necessárias. Deixe-me saber se você encontrar algum problema que eu não conheço.

Veja a API do FileChannel aqui . Para bloquear o arquivo, você pode verificar aqui

O Windows usa bloqueio obrigatório para arquivos, a menos que você especifique os flags de compartilhamento certos enquanto abre. Se você deseja abrir um arquivo ocupado, você precisará Win32-API CreateFile um identificador com os sinalizadores de compartilhamento FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE FILE_SHARE_DELETE | FILE_SHARE_READ | FILE_SHARE_WRITE .

Isso é usado dentro do JDK em alguns locais para abrir arquivos para leitura de atributos e coisas, mas até onde eu posso ver, ele não é exportado / disponível para o nível da Biblioteca de Classes Java. Então você precisaria encontrar uma biblioteca nativa para fazer isso.

Eu acho que como um trabalho rápido em torno de você pode ler process.getInputStream() partir do comando "cmd /D/C type file.lck"

    Intereting Posts