Как использовать java.nio.channels.FileChannel для чтения в ByteBuffer, чтобы добиться такого же поведения, как BufferedReader # readLine () - PullRequest
4 голосов
/ 14 июня 2011

Я хочу использовать 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 Ответ

1 голос
/ 14 июня 2011

Причина в том, что вам нужно использовать 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.

...