채널 인터페이스 자바 NIO

 

채널 채널은 부분이 될 수 또는 지정된 파일의 모든 버퍼에 직접 매핑됩니다.

 

직접 읽고 채널에서 데이터를 쓸 수 없습니다, 채널 만의 ByteBuffer와 상호 작용할 수 있습니다.

데이터를 읽을 때, ByteBuffer를 채널 데이터 사용에지도 데이터를 제거합니다.

데이터를 기록 할 때, 버퍼에 데이터, 데이터는 다음에 채널의 ByteBuffer에 기록됩니다.

 

채널 인터페이스는 일반적으로 사용되는 구현 클래스은 다음과 같습니다

  • 되는 FileChannel 파일을 읽고 쓰기위한
  • DatagramChannel 데이터에 대한 채널 UDP 통신
  • ServerSocketChannel을, 통신을위한 SocketChannel에 채널 TCP

 여기에 전용되는 FileChannel은 UDP를 들어, 채널 TCP 통신은 서면으로 네트워크 프로그래밍의 시간에 다시 도입된다.

 

 

일반적인 방법을 채널 :

  • 바이트 스트림 .getChannel ()가 해당 유형의 채널 오브젝트를 취득 // 객체. 전용 바이트 스트림 오브젝트는 준 getChannel () 메소드를 갖는다.
  • 채널 오브젝트 .read (ByteBuffer를 버퍼) 버퍼만을 버퍼 ByteBuffer 형, 버퍼에 데이터가없는 다른 유형의 채널에 대응하는 상기 입력 스트림으로부터 판독 //
  • 채널 객체에 .write (ByteBuffer를 버퍼) // 스트림에 대응하는 채널 데이터 버퍼
  • 채널 객체 .position는 () // 채널 포인터의 위치를 ​​기록 반환, 반환 값은 long 타입이다
  • 채널 객체 .position (긴 인덱스) // 채널 레코드 포인터가 지정된 위치로 조정
  • 채널 객체 .MAP (매핑 모드, 시작 인덱스, 길이) // / MappedByteBuffer 모두 하나의 객체에 매핑 된 파일의 일부는 개체는 MappedByteBuffer를 돌려줍니다.

 

 

 예 : 문서를 읽기는 한 번 읽기

1          // 채널 만들기 
2          파일 파일 = 새로운 새로운 ( "./ 1.TXT"파일 )
 3          =에 FileInputStream에 새로운 새로운 FileInputStream에 (파일),
 4          되는 FileChannel 채널 = in.getChannel을 ();   // 채널로 입력 스트림 오브젝트 파일을 얻을
 . 5  
. 6          //는 버퍼를 생성 
7.          의 ByteBuffer의 ByteBuffer = ByteBuffer.allocate (1024 )
 . (8)  
. 9          //는 버퍼 채널로 데이터를 읽는다. 채널은 다른 완충액으로 상호 작용할 수없는 상기의 ByteBuffer와 상호 작용할 수 
10          ] channel.read (의 ByteBuffer)
 11  
12          // 포인터를 조정 ByteBuffer를 플립 () 메소드를 호출하여 상기 데이터의 준비 사용하게 
13         ByteBuffer.flip는 ();
 14  
(15)          //는 디코딩의 ByteBuffer는 CharBuffer를 변환. ByteBuffer를 직접 문자열, ()로 변환 할 수 없기 때문에 문자열이 toString를 통해 파일 내용을 변환하지 않습니다. 의 ByteBuffer는 CharBuffer를 변환해야합니다. 
16          문자셋 캐릭터 = Charset.forName ( "GBK");     //는 문자셋 객체를 생성한다. Windows는 기본 코드화 된 문자 세트가 GBK입니다 기본 GBK 코딩, 텍스트 파일을 만듭니다.
17          // 파일에 대응하는 문자 세트를 인코딩하는 데 사용 여기 코드화 된 문자 세트. . 파일 문자 집합을 만들 때 우리가 지정된 경우 UTF-8을 사용하여 여기에 다음, 탐색기에서 파일을 인코딩 UTF-8, UTF-8 또는 수정 
(18)          , CharsetDecoder 디코더 = charset.newDecoder ()    // 디코더 작성 
19          CharBuffer를 CharBuffer를 decoder.decode = (의 ByteBuffer를)    //이 의 ByteBuffer를 디코딩하는 디코더를 사용 CharBuffer를 얻을
 20을  
21          //를 여기 CharBuffer를 호출하지 플립 ()되지만 데이터 호를
22은  
23이다          // () GET 숯불에 의해 얻을 수 있고, GET하여 숯 []로 판독 될 수있다 (CHAR는 [] 도착) 또는 toString ()를 사용하여 문자열로 변환된다 
(24)          에서 System.out.println (charBuffer.get ( ));   // 얻을 첫 문자 
(25)          에서 System.out.println (charBuffer.toString ());   // 나머지 부분 문자열 CharBuffer를 출력으로 변환된다. 데이터의 나머지 부분 참고.
(26)          
(27)          // 객체의 SOUT 출력이 자동으로 toString () 메서드를 호출 할 객체가 문자열 출력에 개체를 변환 할 때.
28          // , 그것은에서 System.out.println (CharBuffer를)로 기록 될 수 있도록 
29          
30          byteBuffer.clear ();
 31이다          ; charBuffer.clear ()
 32          channel.close ();
 33          in.close ();

 

 

 

예 : 파일을 읽기, 읽기주기

1          // 채널 만들기 
2에게          =에서 FileInputStream에이 새로운 새 FileInputStream에 ( "./ 1.TXT" )
 . 3          되는 FileChannel 채널 = in.getChannel ()
 . (4)  
(5).          // 버퍼를 생성 
6.          의 ByteBuffer의 ByteBuffer = ByteBuffer.allocate (102 )
 . 7          CharBuffer를 CharBuffer를]
 . 8  
. 9          // 디코더 만들기 
10          CharsetDecoder Charset.forName = 디코더 ( "GBK"의 ) .newDecoder을 ()
 . 11  
(12)이다          // 루프는 데이터 판독 
(13)이          그동안 - {(!. 1 channel.read (의 ByteBuffer) =)   / /읽기 () 후, 채널 포인터가 자동으로 이동합니다. -1 데이터 판독 없다. 
14              ByteBuffer.flip ();    // 제조하는데 사용되는 데이터 할 
15              CharBuffer를 decoder.decode = (의 ByteBuffer를)    // 디코더 
(16)              에서 System.out.println (CharBuffer를)
 . 17              byteBuffer.clear을 ();    //이 비어 다음위한 준비 만 사용합니다. 당신의 ByteBuffer를 비워해야합니다. 
18              / * 
19              기구 channel.read는 (의 ByteBuffer)의 ByteBuffer 데이터 채널을 판독하기 때문에, 대신에 채널의 길이로부터 판독 데이터를 반환하는 콘텐츠의 ByteBuffer의 길이를 반환한다.
20이다              의 ByteBuffer가 가득 차면의 ByteBuffer 비어 있지, 첫 번째 사이클 이후, 기록의 ByteBuffer, 실행 channel.read (의 ByteBuffer)의 종료 포인터 포인트 또, 남아있는 공간이 존재하지 않는 경우,
 (21)             채널은 새로운 데이터를 읽고, 내용 길이가 다시 실행됩니다 (데이터의 ByteBuffer 처음 사용) -1의 ByteBuffer주기 같지 않은 반환하지 않습니다.
(22)는              무한 루프에 데이터를 읽고 처음 사용했을 것이다.
23은              * / 
24              charBuffer.clear ();    // 다음번의 값을 자동적으로 적용되기 때문이, 기본 일 수있다. 
25          }
 26은  
27          channel.close ();
 28          in.close ();

 

 

 

예 : 파일을 작성

1          // 채널 만들기 
2          FileOutputStream 또는 OUT = 새로운 새 FileOutputStream 또는 ( "./ 2.txt을" )
 . 3          되는 FileChannel 채널 = out.getChannel ()
 . (4)  
(5).          // 버퍼를 생성 
6.          의 ByteBuffer 버퍼 = ByteBuffer.allocate (1024 )]
 . 7  
. 8          // 데이터는 버퍼에 기록합니다 
. 9          buffer.put (에 "Hello World!" .getBytes을 ());
 10  
. 11          @ 가능한 데이터를 나타내는 포인터를 조정합니다. 그렇지 않으면, 사용 가능한 데이터가 비어있는 버퍼이다 
(12)입니다          buffer.flip은 ();
 (13)가  
14          // 데이터는 버퍼 채널에 기록됩니다. 파일에 기록 동기화. 
(15)         channel.write (버퍼);
16  
17          buffer.clear ();
18          channel.close ();
19          out.close ();

 

위의 세 가지 예, 사용 버퍼 및 IO 스트림 기존의 버퍼의 본질은 동일, 속도가 매우 빠르고 쓸 수 있지만 채널 매핑을 사용하지 않았다.

 

 

 

예 : 매핑 채널 읽기 - 쓰기 파일

. (1 개) 파일 INFILE = 새로운 신규 ( "./ 1.TXT"파일 )
 2          되는 FileChannel inChannel = 새로운 새 FileInputStream에 (INFILE) .getChannel ()
 . 3          되는 FileChannel outChannel = 새로운 새 FileOutputStream 또는 ( "./ 2.txt" ) .getChannel ();
 . 4  
. 5          / * 
. 6          문서 채널 입력 스트림 버퍼, 채널 매핑 입력 스트림에 매핑되는 읽기 전용 될 수있다.
7          전체 파일을 매핑. 별도의 객체로 INFILE 파일 길이를 획득한다
 (8).          * / 
9.          MappedByteBuffer inChannel.map 버퍼 = (FileChannel.MapMode.READ_ONLY 0 , inFile.length ());
 10  
(11 개).          // 출력 버퍼에 기록 된 내용을 채널 스트림은 출력 파일에 기록 동기화 된. 이 복사 할 파일을 할 수 있습니다. 
(12)         outChannel.write (버퍼);
13  
14          inChannel.close ();
15          outChannel.close ();

 

 

 

예 : 채널 매핑 파일 읽기

1  // 채널 만들기 
2          파일 INFILE = 새로운 신규 ( "./ 1.TXT"파일 )
 . 3          되는 FileChannel inChannel = 새로운 새 FileInputStream에 (INFILE) .getChannel ()
 . 4  
. 5          // 버퍼로 매핑 
. 6          MappedByteBuffer 버퍼 = inChannel.map을 (FileChannel.MapMode.READ_ONLY 0 , inFile.length ())
 . 7  
. 8          //는 디코더를 생성한다. MappedByteBuffer는 CharBuffer를 사용으로 변환 할 수의 ByteBuffer의 서브 클래스입니다. 
. 9          CharsetDecoder Charset.forName = 디코더 ( "GBK"의 ) .newDecoder ();
 10          
.도 11          // MappedByteBuffer 데이터가 MappedByteBuffer의 포인터 조정 전에 반드시 () 플립되지 얻어진 채널 매핑, 포인터가 조정되었다.
(12)         // 코스 buffer.flip ()과 같은 라인에 기록
 (13)은          
14          //는 CharBuffer를 변환 
15          CharBuffer를 CharBuffer를 = ; decoder.decode (버퍼)
 (16)  
. (17)          // CharBuffer를 데이터에 사용되는 
18 인          에서 System.out.println (CharBuffer를)를;
 . (19)  
(20)는          , buffer.clear ()
 (21)는          charBuffer.clear ();
 22은          inChannel.close ();

 

채널 맵이 가장 빠른 사용합니다. 큰 파일 매핑, 예컨대 1,2- G는 일회용지도 전체 파일이 메모리를 많이 차지 않을 경우에는, 그 성능이 저하 될 것이며, 지금 순차 읽기 루프를 사용하여 매핑 될 수있다.

전용 순환에 의해 판독 채널 매핑을 순차적으로 사용하지 않고, 사용될 수있는 버퍼이지만 속도가 느린 것이다.

 

당신이 문자열로 데이터 (컨텐츠)이없는 경우에는 디코더를 사용할 필요가 없습니다.

 

 

 

RandomAccessFile의 채널 매핑 클래스는 사용할 수 있습니다 :

1       // 채널 만들기 
2          파일 파일 = 새로운 새로운 파일 ( "./ 1.TXT" )
 3          RandomAccessFile의 RandomAccessFile에 = 새로운 새로운 RandomAccessFile의 (파일, "RW를");   // 열린 파일을 지정할 수 있습니다 RandomAccessFile의를 사용하여 
4          되는 FileChannel 채널 = RandomAccessFile에 있습니다. 주는 getChannel ()
 . (5)  
(6).          / * 
7.          채널 버퍼에 매핑된다.
도 8은          단지 R에 개방 판독 만지도는 읽기 전용, RW의 개방에 관계없이 지정된 맵핑 모드 읽기 전용 또는 매핑되고, 읽기 쓰기 읽기 및 쓰기.
(9)          그 후 파일이 RW 채널 맵핑을 수행 개방에 채널을 읽을 수 있고, (파일 동기화에) 기록 할 수
 10           * / 
11         버퍼 = A MappedByteBuffer channel.map (FileChannel.MapMode.READ_WRITE, 0 , file.length ());
 (12)는  
13이다          channel.position (file.length ()); //는 채널의 끝에 기록 포인터 
(14)          channel.write을 (버퍼 )    // 기록 버퍼의 최종 채널, 즉 끝에 추가 컨텐츠 복사 
15  
16          channel.close을 ()
 . 17          randomAccessFile.close ();

 

장점 RandomAccessFile의 채널 매핑 클래스를 사용 :

당신은 채널 중 하나를 읽을 수, 쓰기지도를 열 수있는 길을 열 수있는 파일을 지정뿐만 아니라 파일을 동시에 읽을 수에 대해 쓸 수 있습니다.

 

 

 

참고 :

의 ByteBuffer의 데이터를 사용하기 전에, 제 1 플립 () 포인터의 위치를 ​​조정한다.

하더라도 이후의 사용 ByteBuffer를, 최초의 호출 클리어 () (자주 사용하는 데이터 독서의시) 사용하기 전에의 ByteBuffer을 취소합니다.

 

닫히지 않은 파일,하지만 파일은 해당 흐름을 닫습니다.

RandomAccessFile에, 채널 및 흐름은 매우 유사하며, 모두 폐쇄 될 필요가있다.

버퍼 종료하지 않고, 단지 용기가 아닌 스트림입니다.

 

추천

출처www.cnblogs.com/chy18883701161/p/10928979.html