2016-04-01 19 views
0

ファイルを1行ずつ読み込んで行を操作して新しいファイルに書き込むには、Java標準IO APIを使用している場合。私たちはこのようなスニペットを使用しています。Java NIOのBufferedWriterの代替手段

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

書き込みが行われているファイルに対して読み取りロックが必要なので、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のは(私が意味する、それが正確にfilereader.writeのように動作している)、または、それは内部的になり、我々はfilechannel.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を使用するため、ファイルリソースは1つのみです。 –