2016-04-01 4 views
0

Если мы используем Java Standard IO api для чтения файла по строкам и манипулирования строкой и записи в новый файл. Мы будем использовать фрагмент примерно так.Что является альтернативой для BufferedWriter в 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(); 
} 

Я требую на блокировку чтения файла, который становится написан, поэтому я продолжил использовать FileChannel в пакете Java NIO. Чтобы добиться того же. Ниже приведен фрагмент кода, который я написал.

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 использует тот же базовый FileDescriptor, что и FileInputStream, поэтому есть только один файловый ресурс. –