简体   繁体   English

Java NIO中BufferedWriter的替代方案是什么

[英]What's the alternative for BufferedWriter in Java NIO

If we are using Java Standard IO api's to read a file line by line and manipulate line and write it to a new file. 如果我们使用Java Standard IO api逐行读取文件并进行操作,然后将其写入新文件。 We would be using a snippet something like this. 我们将使用类似这样的代码段。

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();
}

I require a readlock on the file that is getting written, So I proceeded to use FileChannel in Java NIO package. 我需要对要写入的文件进行读锁,因此我继续在Java NIO包中使用FileChannel。 In order to achieve the same. 为了实现相同。 The code snippet I have written is below. 我编写的代码段如下。

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(); 

Now my question is how much this is affecting performance, is Filechannel would be writing to file everytime we call filechannel.write (I mean is it exactly behaves like filereader.write)or will it be internally using a buffer. 现在我的问题是这会在多大程度上影响性能,是我们每次调用filechannel.write (我的意思是它的行为就像filereader.write一样)还是在内部使用缓冲区时,Filechannel是否会写入文件。

I would use BufferedWriter and FileChannel.lock(). 我将使用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();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM