728x90
반응형
* 용어 정리

(1) 채널 (channel)
파일과 하나 이상의 버퍼들 사이에서 데이터를 전달하는 역할

(2) File 클래스 
File 클래스는 파일 또는 디렉토리의 경로를 캡슐화 하며, 인스턴스는
파일스트림 객체를 생성하는데 사용된다.

(3) FileInputStream 클래스
채널에 의해 읽혀질 수 있는 파일을 캡슐화 한다.

(4) FileOutputStream 클래스
채널에 의해 쓰여질 수 있는 파일을 캡슐화 한다.

(5) 버퍼
단순히 데이터를 메모리에 담고 있는다.
  • put() : 파일에 쓰여질 데이터를 버퍼에 로드한다.
  • get() : 파일로 부터 읽어온 데이터를 추출한다.

※ ByteBuffer 자세히 보기 ( 클릭 ! )

(6) FileChannel 
read(),Write() 메서드를 사용해서 파일에 읽기 ,쓰기를 한다.
  • 채널 획득 방법
FileOutputSteam out = new FileOutputSteam(File 객체);
FileChannel outChannel = out.getChannel();

 

* 버퍼로 데이터 전송하기

버퍼클래스의 put() 메서드를 사용하여 버퍼에 데이터를 전송한다.

put()메서드는 상대적 position, 또는 절대적 position 에 전송할 수 있도록 오버로딩 되어 있다.

 

  • 상대적 position 전송방법

put( byte b)

  • 절대적 position 전송방법

put( int index , byte b)

  • 배열의 전달

put( byte[] array )

 

※ 파라미터로 전달된 array 배열의 모든 원소를 전달하며, position이 증가한다.

 

 

문자열은 버퍼로 전송할 때 유니코드 문자를 사용하는 것이 아니라 지역문자 기호화 방법을 사용한다.

원래의 유니코드 문자로 전송하기 위해서는 아래처럼 처리해 준다.

 

※ 원래는 char[] 에 담아서 한개씩 전송할려고 했으나, ViewBuffer 로는 ByteBuffer 의 장점을 잘 살릴 수 없거니와

    번거로워서 byte[] 을 put 했음.

ex

ByteBuffer buf = ByteBuffer.allocate(1024);
String text = "한글송수신이 잘 될까나~";

byte[] array = text.getBytes();             

buf.put(array);
  
//아래는 결과확인을 위한 코드

for(int i=0;i<text.length();i++){

logger.info(new String(buf.array()));

 }

 

result

한글송수신이 잘 될까나~

한글송수신이 잘 될까나~

한글송수신이 잘 될까나~

한글송수신이 잘 될까나~

한글송수신이 잘 될까나~

한글송수신이 잘 될까나~

...

 

 

파일에 쓰기 위하여 position ,limit 을 아래 처럼 설정한다.

limit = 현재의 포지션 , position = 0

버퍼의 처음위치인 0 부터 현재 저장된 position 위치까지 파일에 쓸 수 있다.

ex

buf.limit(buf.position()).position(0);

buf.flip() 라고 해도 된다.


 

※ clear()

버퍼를 처음 생성했을 상태로 되돌린다.

즉, limit = 버퍼용량, position = 0

 

    rewind()

limit 은 그대로 두고, position 만 0 으로 설정한다.

   

* 파일에 쓰기 소스

ex)

String phrase = new String("abcdef");
String dirStr = "c:/sssss/aaaa";
String fileStr = "data.txt";
  
File dir = new File(dirStr);
  
if(!dir.exists()){
   
      if(!dir.mkdir()){
   
           logger.info("디렉토리 생성 에러 발생 ");
      }
   
}else if(!dir.isDirectory()){
  
       logger.info("디렉토리가 아님!");
      
}
  
File file = new File(dir,fileStr);
  
 
FileOutputStream out = null;
  
try {
     out = new FileOutputStream(file,true);                                           // 이어쓰기
     FileChannel outChannel = out.getChannel();
    ByteBuffer buf = ByteBuffer.allocate(1024);
       // 일반 버퍼 생성
   
     for(int i=0;i<phrase.length();i++){
   
          buf.putChar(phrase.charAt(i));                           //UTF-8로 전송
   
     }
   
 buf.flip();
   
 outChannel.write(buf);
   
} catch (FileNotFoundException e) {
       e.printStackTrace();
} catch (IOException e) {
       e.printStackTrace();

}  finally{
      ...
}

 

 

 

※ 뷰버퍼를 썼기 때문에 이동시켜준다.

      ex)

            buf.putInt(saying[i].length()).asCharBuffer().put(saying[i]) ;  //buf 의 포지션 변경

728x90
반응형
블로그 이미지

nineDeveloper

안녕하세요 현직 개발자 입니다 ~ 빠르게 변화하는 세상에 뒤쳐지지 않도록 우리모두 열심히 공부합시다 ~! 개발공부는 넘나 재미있는 것~!

,