我想使用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
}。我不知道为什么。
答案 0 :(得分: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。