2016-04-01 31 views
0

biz çizgi ile bir dosya satır okumak ve çizgi işlemek ve yeni bir dosyaya yazmak için Java Standard IO API 's kullanıyorsanız. Bunun gibi bir snippet kullanıyor olacağız.Java NIO içinde BufferedWriter için alternatif nedir

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

yazdım oluyor dosya üzerinde bir readlock gerektirir Bu yüzden Java NIO paketinde FileChannel kullanmaya devam ettik. Bunu başarmak için. Yazdığım kod pasajı aşağıda.

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

Şimdi benim sorum, FileChannel dediğimiz her şey dosyasına yazılırken olacağını ne kadar bu etki performanstır filechannel.write (yani tam olarak filereader.write gibi davranmasıdır) ya da dahili olarak olacak bir arabellek kullanarak.

cevap

2

Ben BufferedWriter ve FileChannel.lock() kullanmak. gayet iyi çalışıyor, ama biz kaynak sızıntı değildir

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

, bir kanal alma ve asla biz bunu kullanarak() fis.getChannel yapmak ve aynı zamanda aynı dosya üzerinde 2 kolları varken. – saiki4116

+0

@ saiki4116 FileChannel FileInputStream ile aynı temel FileDescriptor kullanır, bu nedenle sadece bir dosya kaynağı vardır. –