Кто лучше по производительности filechannel или RandomAccessFile для чтения и записи?

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

Есть ли какая-то конкретная причина производительности? Я не хочу использовать блокировку FileChannel для каких-либо целей, поскольку я считаю, что это может быть одной из причин, по которой можно использовать файловый канал. Я не хочу использовать BufferReader или что-то подобное, как это предлагается в other Ответ StackOverflow.


person fscore    schedule 27.11.2014    source источник
comment
Почему? Что ж, В настоящее время я использую transferTO метод FileChannel для чтения и копирования, и это одна из веских причин.   -  person Elliott Frisch    schedule 27.11.2014
comment
Я имею в виду, что я не использую его, но в конечном итоге хотел бы, но не уверен, как определить, лучше ли это, чем RAF.   -  person fscore    schedule 27.11.2014


Ответы (5)


FileChannel API говорит: область файла может быть отображена непосредственно в памяти; для больших файлов это часто намного эффективнее, чем вызов обычных методов чтения или записи.

person Evgeniy Dorofeev    schedule 27.11.2014
comment
Но они упоминают о чтении и записи файлового канала вместо любых других методов чтения или записи. - person fscore; 27.11.2014

Между ними нечего выбирать, если только вы не используете FileChannel с прямыми буферами и никогда не обращаетесь к данным самостоятельно, например. вы только копируете его в SocketChannel.. Это быстрее, потому что данные никогда не пересекают границу JNI/JVM.

Но мне интересно, почему вы не выбираете BufferedReader. Это определенно будет на несколько порядков быстрее, чем любой из этих способов чтения файла построчно.

person user207421    schedule 05.12.2014

RandomAccessFile обладает хорошей производительностью, а также позволяет напрямую читать и записывать большинство основных типов.

person Dulith De Costa    schedule 27.11.2014

FileChannel безопасны для использования несколькими параллельными потоками.

person Shiva Krish    schedule 27.11.2014

Источник RandomAccessFile:

Увидите, что RandomAccessFile на самом деле использует FileChannel под капотом...

public final FileChannel getChannel() {
         synchronized (this) {
             if (channel == null) {
                 channel = FileChannelImpl.open(fd, true, rw, this);

                 /*
                  * FileDescriptor could be shared by FileInputStream or
                  * FileOutputStream.
                  * Ensure that FD is GC'ed only when all the streams/channels
                  * are done using it.
                  * Increment fd's use count. Invoking the channel's close()
                  * method will result in decrementing the use count set for
                  * the channel.
                  */
                 fd.incrementAndGetUseCount();
             }
             return channel;
         }
     }

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/io/RandomAccessFile.java

person Robert Christian    schedule 06.02.2015
comment
Это неправильно. FileChannel не используется внутри RandomAccessFile и инициализируется только при вызове getChannel. Нативные методы используются для открытия/чтения/записи базового файла. - person Mark; 23.02.2016
comment
Он предоставляется как общедоступный метод для любого, кто может получить ссылку на FileChannel для базового файла. - person Ronn Macc; 31.05.2018