Если мы используем 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) или это будет внутренне используя буфер.
Это прекрасно работает, но мы не утечка ресурсов, когда мы делаем fis.getChannel(), как мы получаем канал и никогда не использовать его, а также у нас есть 2 ручки на тот же файл. – saiki4116
@ saiki4116 FileChannel использует тот же базовый FileDescriptor, что и FileInputStream, поэтому есть только один файловый ресурс. –