如何使用 java.nio.channels.FileChannel 读取到 ByteBuffer 实现类似 BufferedReader#readLine() 的行为
Posted
技术标签:
【中文标题】如何使用 java.nio.channels.FileChannel 读取到 ByteBuffer 实现类似 BufferedReader#readLine() 的行为【英文标题】:How to use java.nio.channels.FileChannel to read to ByteBuffer achieve similiar behavior like BufferedReader#readLine() 【发布时间】:2011-06-14 15:44:04 【问题描述】:我想使用java.nio.channels.FileChannel
从文件中读取,但我想像BufferedReader#readLine()
那样每行读取一行。我需要使用java.nio.channels.FileChannel
而不是java.io
的原因是因为我需要在文件上加锁,并从该锁文件中逐行读取。所以我不得不使用java.nio.channels.FileChannel
。请帮忙
编辑这是我尝试使用 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
。我不知道为什么。
【问题讨论】:
【参考方案1】:原因是你需要使用 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
锁定文件时,它无法正常工作。不知道为什么,
我记得我以前用过这个没有任何问题..你能告诉我什么是 nto 工作
@Suraj:我已经更新了我的帖子,我的代码使用FileInputStream
,你能看一下吗?
原因是你需要使用OutputStream而不是INputStream,我会更新答案
但我尝试从文件中读取,而不是写入。我无法使用 OutputStream 阅读,还是我在这里遗漏了什么?以上是关于如何使用 java.nio.channels.FileChannel 读取到 ByteBuffer 实现类似 BufferedReader#readLine() 的行为的主要内容,如果未能解决你的问题,请参考以下文章
如何在自动布局中使用约束标识符以及如何使用标识符更改约束? [迅速]
如何使用 AngularJS 的 ng-model 创建一个数组以及如何使用 jquery 提交?