2017-11-16 5 views
0

ファイルが2つのプロセスで使用されている状況があります。だから、ファイルが既にロックされていて、ロックが解除されるのを待っているかどうか確認します。自己ロックファイルに書き込めません

もう一度別のプロセスでロックが解除されると、私は自分のロックを入れて読み書きを開始します。しかし、以下のようにエラーが発生しています。私はそれが私によってロックされているので、私はそのエラーを知っているが、私は最初にファイルにロックを入れて、他のプロセスが時間が使用されるまでそれを使用できないように読み書きを開始したい。ここで

Exception in thread "main" java.io.IOException: The process cannot access the file because another process has locked a portion of the file 

は私のコードスニペットは

package RestClient; 
import java.io.*; 
import java.nio.Buffer; 
import java.nio.channels.FileChannel; 
import java.nio.channels.FileLock; 
import java.nio.channels.OverlappingFileLockException; 

public class Filelocking { 

     public static void main(String[] args) throws IOException { 

       String Name = "E:\\RestAPI\\Token.txt"; 
       File File = new File(Name); 
       File FileRename = new File(Name); 

       boolean FileEdit = false; 

       if (!File.renameTo(FileRename)) { 

        while (!File.renameTo(FileRename)) { 
          System.out.println("rename failed"); 

          if (File.renameTo(FileRename)) { 
            FileEdit = true; 
            break; 
          } 

        } 

       } 

       else { 

        FileEdit = true; 

       } 

       System.out.println("rename success"); 

       if (FileEdit) { 

        RandomAccessFile AccessFile = new RandomAccessFile(File, "rw"); 
        FileChannel channel = AccessFile.getChannel(); 

        FileLock lock = null; 
        try { 

          lock = channel.lock(); 
          System.out.println("Lock Status: " + lock.isValid()); 
          BufferedReader read = new BufferedReader (new FileReader(File)); 

          System.out.println(read.readLine()); 




        } 

        catch (OverlappingFileLockException e) { 

          System.out.println("File Lock Error: " + e.getMessage()); 
        } 

        lock.close(); 

       } 

     } 

} 

で誰がどのように私はこの問題を解決することができ、何が間違ってここにやっている私にしてください教えてください。

+0

としてあなたはBufferedReaderもファイルも閉じないでください。あなたの問題の原因となるかもしれません。 –

+0

@XavierBouclet、あなたは本当にバッファを閉じることがここで心配だと思いますか?それはファイルを読んだ後に来る。しかし、今試してみた – Shannin

+0

いいえ、私は間違っていた私の答えを参照してください。あなたはあなたのファイルをBufferedReaderで読むのではなく、あなたのロックを通して読むべきです。 –

答えて

0

これは、問題を引き起こしている自分のFileLockです。 FileLockからファイルを読む必要があります。

あなたはこのようにそれを読んでください:

ByteBuffer buffer = ByteBuffer.allocate(20); 
int noOfBytesRead = channel.read(buffer); 

あなたは何ができるのreadlineたい場合は、より多くの情報here

を見つけることができます。

FileInputStream fin = new FileInputStream(file); 
if (FileEdit) { 

    RandomAccessFile accessFile = new RandomAccessFile(file, "rw"); 
    FileChannel channel = accessFile.getChannel(); 

     FileLock lock = null; 
     try { 

      lock = channel.lock(); 
      System.out.println("Lock Status: " + lock.isValid()); 
      InputStream is = Channels.newInputStream(channel); 
      BufferedReader read = new BufferedReader(new InputStreamReader(is, "UTF-8")); 

      System.out.println(read.readLine()); 

     } catch (OverlappingFileLockException e) { 
       System.out.println("File Lock Error: " + e.getMessage()); 
     } 

     lock.close(); 

    } 

mentionned here

+0

ここで真とは、その共有ロックで、他のプロセスではなくロックを置くプロセスによって読み取られることを意味します。それが正しいか ?第二に、ここでMax_Valueが意味するものは?それはファイルのコンテンツ領域ですか? – Shannin

+0

いいえ、他のプロセスでは読み込みできません。私はtryLockの使用を避けるために私の答えを編集し、あなたのロックに直接bufferedRedaerを持たせる方法を見つけました。 Thx to Channels。 –

+0

これは、同じファイルに読み込みしかできず、書き込むことはできません。 – Shannin

関連する問題