2016-04-01 15 views
0

Wenn wir Java Standard IO API verwenden, um eine Datei Zeile für Zeile zu lesen und Zeile zu manipulieren und in eine neue Datei zu schreiben. Wir würden ein Schnipsel so verwenden.Was ist die Alternative für BufferedWriter in Java 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(); 
} 

Ich benötige eine readlock auf die Datei, die geschrieben wird, immer, also ich ging in Java Filechannel NIO-Paket zu verwenden. Um das Gleiche zu erreichen. Das Code-Snippet, das ich geschrieben habe, ist unten.

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

Nun meine Frage ist, wie viel das ist die Leistung beeinträchtigt wird Filechannel würde jedes Mal in Datei schreiben wir nennen filechannel.write (ich meine, ist es genau wie filereader.write verhält) oder wird es intern sein Verwenden eines Puffers.

Antwort

2

Ich würde BufferedWriter und FileChannel.lock() verwenden.

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

Das funktioniert gut, aber nicht wir Ressource undicht ist, wenn wir das tun fis.getChannel(), wie wir einen Kanal bekommen und nie verwendet, und wir haben auch 2 Griffe auf der gleichen Datei. – saiki4116

+0

@ saiki4116 Der FileChannel verwendet denselben zugrunde liegenden FileDescriptor wie der FileInputStream, so dass nur eine Dateiressource vorhanden ist. –