5

ファイルからの読み取りに使用java.nio.channels.FileChannelしたいのですが、同じように1行ごとに読み取りたいですBufferedReader#readLine()java.nio.channels.FileChannel代わりに使用する必要があるのjava.ioは、ファイルにロックをかけ、そのロックファイルから1行ずつ読み取る必要があるためです。だから私は強制的に使用します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ます。理由はわかりません。

4

1 に答える 1

1

その理由は、FileInputStreamの代わりにFileOutpuStreamを使用する必要があるためです。このコードを試してください:

        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を隠しています。ロックには、InputStreamの代わりにOutputStreamを使用する必要があると思います。

于 2011-06-14T15:51:04.410 に答える