如何使用 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 提交?

如何使用laravel保存所有行数据每个行名或相等

如何使用 Math.Net 连接矩阵。如何使用 Math.Net 调用特定的行或列?

WSARecv 如何使用 lpOverlapped?如何手动发出事件信号?