0
如果我们使用Java Standard IO api来逐行读取文件并操作行并将其写入新文件。我们将使用这样的片段。Java中的BufferedWriter的替代选择NIO
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8"));
BufferedReader br = new BufferedReader(new InputStreamReader(fis, "UTF-8"));
String str;
while ((str = br.readLine()) != null) {
//... code for manipulation of str
bw.write(str);
bw.newLine();
}
我需要一个正在写入的文件上的readlock,所以我开始在Java NIO包中使用FileChannel。为了实现相同。我写的代码片段如下。
int blocksize = 32 * 1024;
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputFilePath), inputCharset));
FileOutputStream fos = new FileOutputStream(outputFilePath);
FileChannel outputFileChannel = fos.getChannel();
outputFileChannel.lock();
ByteBuffer buffer = ByteBuffer.allocate(blocksize);
while((line=br.readLine())!=null){
buffer.put(line.getBytes(StandardCharsets.UTF_8));
buffer.put("\n".getBytes(StandardCharsets.UTF_8));
buffer.flip();
outputFileChannel.write(buffer);
buffer.clear();
}
br.close();
outputFileChannel.close();
fos.close();
现在的问题是多少,这是影响性能,Filechannel将被写入文件,每次我们称之为filechannel.write(我的意思是它的确切行为像filereader.write),还是会在内部使用缓冲区。
这工作正常,但不是我们泄露资源,当我们做fis.getChannel(),我们得到一个通道,从来没有使用它,我们也有相同的文件句柄2。 – saiki4116
@ saiki4116 FileChannel使用与FileInputStream相同的底层FileDescriptor,因此只有一个文件资源。 –