如何使用java.nio.channels.FileChannel读取ByteBuffer实现像BufferedReader一样的行为#readLine()

问题描述:

我想用java.nio.channels.FileChannel从文件中读取,但我想像BufferedReader#readLine()那样每行读取一行。我需要使用java.nio.channels.FileChannel而不是java.io的原因是我需要对文件进行锁定,并从该锁定文件逐行读取。所以我强迫使用java.nio.channels.FileChannel。请帮助如何使用java.nio.channels.FileChannel读取ByteBuffer实现像BufferedReader一样的行为#readLine()

编辑这里是我的代码试图用的FileInputStream得到FileChannel

public static void main(String[] args){ 
    File file = new File("C:\\dev\\harry\\data.txt"); 
    FileInputStream inputStream = null; 
    BufferedReader bufferedReader = null; 
    FileChannel channel = null; 
    FileLock lock = null; 
    try{ 
     inputStream = new FileInputStream(file); 
     channel = inputStream.getChannel(); 
     lock = channel.lock(); 
     bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); 
     String data; 
     while((data = bufferedReader.readLine()) != null){ 
      System.out.println(data); 
     } 
    }catch(IOException e){ 
     e.printStackTrace(); 
    }finally{ 
     try { 
      lock.release(); 
      channel.close(); 
      if(bufferedReader != null) bufferedReader.close(); 
      if(inputStream != null) inputStream.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

当代码是在这里lock = channel.lock();,它马上去finallylock仍然null,所以lock.release()生成NullPointerException。我不知道为什么。

原因是您需要使用FileOutpuStream而不是FileInputStream。 请尝试下面的代码:

 FileOutputStream outStream = null; 
     BufferedWriter bufWriter = null; 
     FileChannel channel = null; 
     FileLock lock = null; 
     try{ 
      outStream = new FileOutputStream(file); 
      channel = outStream.getChannel(); 
      lock = channel.lock(); 
      bufWriter = new BufferedWriter(new OutputStreamWriter(outStream)); 
     }catch(IOException e){ 
      e.printStackTrace(); 
     } 

此代码适合我。

NUllPointerException实际上隐藏了真正的异常,即NotWritableChannelException。对于锁定我认为我们需要使用OutputStream而不是InputStream。

+0

我尝试了一下,出于某种原因,当我尝试用FileInputStream锁定文件时,它不能正常工作。不知道为什么, – 2011-06-14 15:54:00

+0

我记得我以前用过这个,没有任何问题..你可以告诉我什么是工作 – 2011-06-14 15:55:22

+0

@Suraj:我有更新我的文章,我的代码使用'FileInputStream',你可以看看吗? – 2011-06-14 16:01:40