2014-11-27 3 views
3

나는 최근에 의 큰 팬이다 FileChannel를 만났다. 그러나 파일에서 읽고 해당 내용을 다른 사람에게 쓰기 위해 FileChannelRandomAccessFile 이상으로 골라야하는 이유가 궁금합니다.누가 읽기 및 쓰기 성능 filechannel 또는 RandomAccessFile에서 더 낫습니까?

구체적인 성능상의 이유가 있습니까? 파일 채널을 사용할 수있는 이유 중 하나가 될 수 있다고 생각하여 어떤 목적 으로든 FileChannel의 잠금을 사용하고 싶지 않습니다. 내가 또는 other StackOverflow 응답에 제안 된대로 사용하고 싶지 않아요.

+0

이유는 무엇입니까? 글쎄, * 현재'FileTOn' 메서드를 사용하여'FileChannel'을 읽고 복사하는 것이 좋은 이유 중 하나입니다. –

+0

나는 그것을 사용하지는 않지만 궁극적으로 RAF보다 더 나은지 식별하는 방법을 알고 싶습니다. – fscore

답변

0

FileChannel API : 파일 영역을 메모리에 직접 매핑 할 수 있습니다. 대용량 파일의 경우 보통 읽기 또는 쓰기 메소드를 호출하는 것보다 훨씬 효율적입니다.

+0

하지만 다른 읽기 또는 쓰기 방법 대신 파일 채널의 읽기 및 쓰기에 대해 언급합니다. – fscore

-1

RandomAccessFile은 성능이 뛰어나며 대부분의 주요 유형을 직접 읽고 쓸 수 있습니다.

-1

FileChannel은 여러 동시 스레드에서 안전하게 사용할 수 있습니다.

0

직접 버퍼가있는 FileChannel을 사용하고 결코 데이터에 직접 액세스하지 않는 한 두 가지 방법 중에서 선택할 수 없습니다 (예 : SocketChannel.에 복사합니다. 데이터가 JNI/JVM 경계를 넘을 필요가 없기 때문에 더 빠릅니다.

하지만 내가 왜 BufferedReader을 선택하지 않는지 궁금합니다. 확실히은 파일을 한 줄씩 읽는 중 어느 것보다 훨씬 빠릅니다.

-2

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

+1

올바르지 않습니다. FileChannel은 RandomAccessFile에서 내부적으로 사용되지 않으며 getChannel이 호출 될 때만 초기화됩니다. 네이티브 메소드는 기본 파일을 열고 읽거나 쓰는 데 사용됩니다. – Mark

관련 문제