채널 채널은 부분이 될 수 또는 지정된 파일의 모든 버퍼에 직접 매핑됩니다.
직접 읽고 채널에서 데이터를 쓸 수 없습니다, 채널 만의 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에, 채널 및 흐름은 매우 유사하며, 모두 폐쇄 될 필요가있다.
버퍼 종료하지 않고, 단지 용기가 아닌 스트림입니다.