2016-04-01 65 views
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),还是会在内部使用缓冲区。

回答

2

我会使用BufferedWriter和FileChannel.lock()。

BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, "UTF-8")); 
FileLock lock = fis.getChannel().lock(); 

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(); 
} 
lock.release(); 
+0

这工作正常,但不是我们泄露资源,当我们做fis.getChannel(),我们得到一个通道,从来没有使用它,我们也有相同的文件句柄2。 – saiki4116

+0

@ saiki4116 FileChannel使用与FileInputStream相同的底层FileDescriptor,因此只有一个文件资源。 –