Muitas vezes acontece que vários programas processam o mesmo arquivo, como atualizar ou ler o arquivo ao mesmo tempo. Tais questões devem ser tratadas, caso contrário poderá ocorrer o caos. Após o JDK 1.4, o Java fornece uma função de bloqueio de arquivo que pode ajudar a resolver esses problemas.
As classes FileLock e FileChannel estão nos pacotes java.nio e java.nio.channels respectivamente. Os bloqueios de arquivo podem ser usados quando os fluxos de entrada e saída lêem e gravam arquivos.
O fluxo criado por RandomAccessFile pode usar bloqueios de arquivo ao ler e gravar arquivos. Enquanto o bloqueio não for liberado, outros programas não poderão operar o arquivo bloqueado.
As etapas para usar o bloqueio de arquivo são as seguintes:
1) Primeiro use o fluxo RandomAccessFile para criar um objeto de fluxo apontando para o arquivo. O atributo de leitura e gravação do objeto deve ser rw, por exemplo:
RandomAccessFileinput=newRandomAccessFile(Main.java,rw);
2) O fluxo de entrada chama o método getChannel() para obter um objeto FileChannel (canal) conectado ao arquivo subjacente, por exemplo:
FileChannelchannel=input.getChannel();
3) O canal chama o método tryLock() ou lock() para obter um objeto FileLock (bloqueio de arquivo). Este processo também é chamado de bloqueio do arquivo, por exemplo:
FileLocklock=canal.tryLock();
Após a geração do objeto de bloqueio de arquivo, qualquer programa será proibido de operar ou bloquear o arquivo. Depois de bloquear um arquivo, se você quiser ler ou gravar o arquivo, você deve deixar o objeto FileLock chamar release() para liberar o bloqueio do arquivo, por exemplo:
lock.release();
Por exemplo, um programa Java libera um bloqueio de arquivo a cada clique de um botão, lê uma linha de texto do arquivo e o bloqueia imediatamente. Quando um programa Java está em execução, os usuários não podem usar outros programas para operar arquivos bloqueados pelo programa Java atual. Por exemplo, os usuários não podem salvar arquivos bloqueados pelo programa Java atual usando o programa "Notepad" (Notepad.exe) fornecido pelo Windows. sistema operacional. .
Principal.java
importjava.io.*;publicclassMain{publicstaticvoidmain(Stringargs[]){Filefile=newFile(Main.java);WindowFileLockwin=newWindowFileLock(file);win.setTitle(usar bloqueio de arquivo);}}
WindowFileLock.java
importjava.io.*;importjava.nio.*;importjava.nio.channels.*;importjavax.swing.*;importjava.awt.*;importjava.awt.event.*;publicclassWindowFileLockextendsJframeimplementsActionListener{JTextAreatext;JButtonbutton;Filefile;RandomAccessFileinput; FileChannelchannel;FileLocklock;WindowFileLock(Filef){file=f;try{input=newRandomAccessFile(file,rw);channel=input.getChannel();lock=channel.tryLock();}catch(Exceptionexp){}text=newJTextArea ();button=newJButton(lê uma linha);button.addActionListener(this);add(newJScrollPane(text),BorderLayout.CENTER);add(button,BorderLayout.SOUTH);setSize(300,400);setVisible(true); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}publicvoidactionPerformed(ActionEvente){try{lock.release();StringlineString=input.readLine();text.append(n+lineString);lock=channel.tryLock();if(lineString ==null)input.close();}catch(Exceptionee){}}}