(1) 채널 (channel)(2) File 클래스파일과 하나 이상의 버퍼들 사이에서 데이터를 전달하는 역할
File 클래스는 파일 또는 디렉토리의 경로를 캡슐화 하며, 인스턴스는파일스트림 객체를 생성하는데 사용된다.(3) FileInputStream 클래스
채널에 의해 읽혀질 수 있는 파일을 캡슐화 한다.(4) FileOutputStream 클래스
채널에 의해 쓰여질 수 있는 파일을 캡슐화 한다.(5) 버퍼
단순히 데이터를 메모리에 담고 있는다.(6) FileChannel
- put() : 파일에 쓰여질 데이터를 버퍼에 로드한다.
- get() : 파일로 부터 읽어온 데이터를 추출한다.
※ ByteBuffer 자세히 보기 ( 클릭 ! )
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 의 포지션 변경
[출처] [ java ] NIO 방식으로 파일에 쓰기|작성자 GENERAL
'JAVA > JAVA IO' 카테고리의 다른 글
파일을 로딩하여 ByteArrayOutputStream 으로 리턴하기 (0) | 2016.03.09 |
---|---|
ByteArrayOutputStream 사용 예제 (0) | 2016.03.09 |
[ java ] ByteBuffer (0) | 2016.03.09 |
[ java ] FileDescriptor 클래스를 이용한 스트림 생성 (0) | 2016.03.09 |
[ java ] File 저장시 덮어쓰기 방지 (0) | 2016.03.09 |
[ java ] File 객체의 출력스트림 생성 (0) | 2016.03.09 |
[ java ] File 객체 (0) | 2016.03.09 |
자바에서 스트림 (stream) 이란. (0) | 2016.03.09 |