Я не думаю, что вы сможете получить строгий ответ без тестирования своего программного обеспечения.NIO может значительно ускорить работу приложения в правильных условиях, но также может замедлить работу.Вот несколько моментов:
- Вам действительно нужны строки?Если вы храните и получаете байты из своей базы данных, вы можете избежать затрат на выделение строк и кодирование.
- Вам действительно нужны
rewind
и flip
?Похоже, вы создаете новый буфер для каждой строки и просто записываете его в канал.(Если вы пойдете по пути NIO, тестируете стратегии, которые используют буферы вместо упаковки / отбрасывания, я думаю, что они будут лучше). - Имейте в виду, что
wrap
и allocateDirect могутпроизводить совершенно разные буферы.Оцените оба, чтобы понять компромиссы.При прямом выделении обязательно используйте один и тот же буфер для достижения максимальной производительности. - И самое главное: обязательно сравните NIO с BufferedOutputStream и / или * 1017Подходит * BufferedWritter (также используйте промежуточный буфер
byte[]
или char[]
с приемлемым размером).Я видел много , много , много людей, обнаруживших, что NIO - это не серебряная пуля.
Если вам интересен какой-то кровоточащий край ... Назад к IO Trails для некоторого NIO2: D.
А вот интересный эталон окопирование файлов с использованием различных стратегий .Я знаю, что это другая проблема, но я думаю, что большинство фактов и авторских заключений также применимы к вашей проблеме.
Приветствия,
ОБНОВЛЕНИЕ 1:
Поскольку @EJP предупредил меня, что прямые буферы не будут эффективны для этой проблемы, я сам проверил ее и получил хороший результат.NIO-решение с использованием неморированных файлов.В моем Macbook под управлением OS X Lion это значительно превышает BufferedOutputStream
.но имейте в виду, что это может зависеть от ОС / оборудования / ВМ:
public void writeToFileNIOWay2(File file) throws IOException {
final int numberOfIterations = 1000000;
final String messageToWrite = "This is a test üüüüüüööööö";
final byte[] messageBytes = messageToWrite.
getBytes(Charset.forName("ISO-8859-1"));
final long appendSize = numberOfIterations * messageBytes.length;
final RandomAccessFile raf = new RandomAccessFile(file, "rw");
raf.seek(raf.length());
final FileChannel fc = raf.getChannel();
final MappedByteBuffer mbf = fc.map(FileChannel.MapMode.READ_WRITE, fc.
position(), appendSize);
fc.close();
for (int i = 1; i < numberOfIterations; i++) {
mbf.put(messageBytes);
}
}
Я признаю, что немного обманул, предварительно рассчитав общий размер для добавления (около 26 МБ).Это может быть невозможно для нескольких реальных сценариев.Тем не менее, вы всегда можете использовать «достаточно большой добавляемый размер для операций и затем обрезать файл.
ОБНОВЛЕНИЕ 2 (2019):
Для тех, кто ищет современный (как в Java)11+) решение проблемы, я бы следовал совету @ DodgyCodeException и использовал java.nio.file.Files.writeString
:
String fileName = "/xyz/test.txt";
String messageToWrite = "My long string";
Files.writeString(Paths.get(fileName), messageToWrite, StandardCharsets.ISO_8859_1);