Как использовать java.nio.channels.FileChannel для чтения в ByteBuffer, чтобы добиться такого же поведения, как BufferedReader#readLine()
Я хочу использовать 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.