如何使用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();
,它马上去finally
和lock
仍然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。
我尝试了一下,出于某种原因,当我尝试用FileInputStream锁定文件时,它不能正常工作。不知道为什么, – 2011-06-14 15:54:00
我记得我以前用过这个,没有任何问题..你可以告诉我什么是工作 – 2011-06-14 15:55:22
@Suraj:我有更新我的文章,我的代码使用'FileInputStream',你可以看看吗? – 2011-06-14 16:01:40