'open'에 해당되는 글 2건

  1. 2008.12.23 바이너리 데이터
  2. 2008.12.22 파일 생성 및 내용추가 수정하는 FileStream클래스
AIR/파일시스템 연동2008. 12. 23. 11:01


AS3의 가장 큰 장점중에 하나는 지금껏 AS에서 지원이 불가능했던 low level작업이 가능한 점이다. 이는 AS3와 AIR를 통하여 바이너리 데이터를 직접 만들거나 수정 또는 zip알고리즘과 jpg와 png등 이미지 처리 알고리즘을 제공함과 동시에 기타 doc와 ppt... 등 파일 형태만 알고 있다면 모든 파일을 직접 만들 수 있기 때문이다.
이와 같은 작업을 가능케하는 것이 IDataInput, IDataOutput 인터페이스를 구현한 ByteArray라는 클래스이다. 또는 flash.netURLStream(IDataInput만 구현)과 URLLoader를 사용하여도 바이너리 데이터로 접근(만) 할  수 있다.

   - ByteArray는 읽고 쓰기가 모두 가능한 바이너리 관리 전용 클래스이다.
   - URLLoader인 경우에는 바이트배열에 특화되진 않았다. data를 모두 받은 후에 접근 하여 관리한다. 
   - URLStream는 delegator에서 직접 바이트 배열을 읽을 수 있지만 IDataInput만 구현하여 기록은 불가능 하다.
     data를 받는 중에도 접근 가능하다.


ByteArray는 기본적인 바이너리 데이터를 기록하거나 읽기 위한 기본적인 클래스이며 외부 파일데이터를 가져오는 통신 클래스에서는 URLStream를 사용한다. AIR에서는 앞서 살펴본 FileStream(IDataInput, IDataOutput 인터페이스를 구현)를 사용한다.

FileStream은 ByteArray처럼 읽고 쓰기가 모두 가능한 클래스 이다. 따라서 AIR에서는 FileStream만으로 파일을 읽어 들여와 기록까지 가능해 졌다. 복잡한 바이너리 작업이라면 ByteArray를 활용하면 중간에 벌어진 틈을 부드럽게 처리 할 수 있을 것이다.


IDataInput, IDataOutput를 구현한 ByteArray 속성과 메서드 *

[ Public 속성 ]

bytesAvailable : uint
[읽기 전용] 바이트 배열의 현재 위치에서 배열 끝까지 읽을 수 있는 데이터 바이트 수입니다.

defaultObjectEncoding : uint
[정적] 새 ByteArray 인스턴스에 사용할 ByteArray 클래스의 기본 객체 인코딩을 나타냅니다.

endian : String
데이터의 바이트 순서를 Endian.BIG_ENDIAN 또는 Endian.LITTLE_ENDIAN으로 변경하거나 읽습니다.

length : uint
ByteArray 객체의 바이트 단위 길이입니다.

objectEncoding : uint
ByteArray 인스턴스에서 쓰거나 읽을 때 ActionScript 3.0, ActionScript 2.0 또는 ActionScript 1.0 형식을 사용할지 여부를 확인하는 데 사용합니다.

position : uint
ByteArray 객체에 대한 파일 포인터의 현재 위치를 바이트 단위로 옮기거나 반환합니다.

[ Public 메서드 ]
ByteArray()
이 클래스의 메서드와 속성을 사용하여 데이터 저장소 및 스트림을 최적화할 수 있도록 압축된 바이트 배열을 나타내는 ByteArray 인스턴스를 만듭니다.

clear():void
바이트 배열의 내용을 지우고 길이 및 위치 속성을 0으로 재설정합니다.

compress(algorithm:String):void
바이트 배열을 압축합니다.

deflate():void
DEFLATE 압축 알고리즘을 사용하여 바이트 배열을 압축합니다.

inflate():void
바이트 배열의 압축을 해제합니다.

readBoolean():Boolean
바이트 스트림에서 부울 값을 읽습니다.
포맷타입 : Boolean
포맷 : Boolean
0인 경우 false , 기타인 경우 true

readByte():int
바이트 스트림에서 부호 있는 바이트를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
바이트 스트림에서 length 매개 변수로 지정된 데이터 바이트 수를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readDouble():Number
바이트 스트림에서 IEEE 754 배정밀도 64비트 부동 소수점 숫자를 읽습니다.
포맷타입 :  숫자
포맷 : Double
Double-precision 64비트 부동 소수점 수

readFloat():Number
바이트 스트림에서 IEEE 754 단정밀도 32비트 부동 소수점 숫자를 읽습니다.
포맷타입 :  숫자
포맷 : Float
Single-precision 32비트 부동 소수점 수


readInt():int
바이트 스트림에서 부호 있는 32비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Integer

readMultiByte(length:uint, charSet:String):String
지정된 문자 세트를 사용하여 바이트 스트림에서 지정된 길이의 멀티바이트 문자열을 읽습니다.
포맷타입 :  문자열
포맷 : Multibyte
디폴트 시스템 코드페이지 사용하지 않고 특정 문자 세트 사용

readObject():*
바이트 배열에서 AMF 직렬 형식으로 인코딩된 객체를 읽습니다.
포맷타입 :  객체
포맷 : Object
AMF를 사용한 직렬화/역직렬화된 객체

readShort():int
바이트 스트림에서 부호 있는 16비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

readUnsignedByte():uint
바이트 스트림에서 부호 없는 바이트를 읽습니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

readUnsignedInt():uint
바이트 스트림에서 부호 없는 32비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Integer
32비트정수

readUnsignedShort():uint
바이트 스트림에서 부호 없는 16비트 정수를 읽습니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

readUTF():String
바이트 스트림에서 UTF-8 문자열을 읽습니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

readUTFBytes(length:uint):String
바이트 스트림에서 length 매개 변수에 지정된 길이의 UTF-8 바이트 시퀀스를 읽고 문자열을 반환합니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

toString():String
바이트 배열을 문자열로 변환합니다.

uncompress(algorithm:String):void
바이트 배열의 압축을 해제합니다.

writeBoolean(value:Boolean):void
부울 값을 씁니다.
포맷타입 : Boolean
포맷 : Boolean
0인 경우 false , 기타인 경우 true

writeByte(value:int):void
바이트 스트림에 바이트를 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeBytes(bytes:ByteArray, offset:uint = 0, length:uint = 0):void
지정된 바이트 배열 bytes에서 offset(0부터 시작하는 인덱스)부터 시작하여 length만큼의 바이트 시퀀스를 데이터 스트림에 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeDouble(value:Number):void
바이트 스트림에 IEEE 754 배정밀도 64비트 부동 소수점 숫자를 씁니다.
포맷타입 :  숫자
포맷 : Double
Double-precision 64비트 부동 소수점 수

writeFloat(value:Number):void
바이트 스트림에 IEEE 754 단정밀도 32비트 부동 소수점 숫자를 씁니다.
포맷타입 :  숫자
포맷 : Float
Single-precision 32비트 부동 소수점 수

writeInt(value:int):void
바이트 스트림에 부호 있는 32비트 정수를 씁니다.
포맷타입 :  숫자
포맷 : Integer

writeMultiByte(value:String, charSet:String):void
지정된 문자 세트를 사용하여 멀티바이트 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : Multibyte
디폴트 시스템 코드페이지 사용하지 않고 특정 문자 세트 사용

writeObject(object:*):void
객체를 바이트 배열에 AMF 직렬 형식으로 씁니다.
포맷타입 :  객체
포맷 : Object
AMF를 사용한 직렬화/역직렬화된 객체

writeShort(value:int):void
바이트 스트림에 16비트 정수를 씁니다.
포맷타입 :  숫자
포맷 : Short
16비트정수

writeUnsignedInt(value:uint):void
바이트 스트림에 부호 없는 32비트 정수를 씁니다.
포맷타입 : raw바이트
포맷 : Byte 
하나 또는 여러개의 raw바이트

writeUTF(value:String):void
UTF-8 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

writeUTFBytes(value:String):void
UTF-8 문자열을 바이트 스트림에 씁니다.
포맷타입 :  문자열
포맷 : UTF-8
디폴트 시스템 코드페이지 사용

통상적으로 IDataInput와 IDataOutput 인터페이스는 바이트 데이터를 관리하는 속성과 메서드를 선언하였으므로 이를 구현한 ByteArray와 FileStream을 이용하면 간단하게 데이터 읽기와 기록이 가능하다.
읽고 쓰기 작업시에 유효 바이트의 길이를 넘지 않기 위해 bytesAvailable속성을 이용하여 현재 위치에서 데이터 끝까지의 데이터 수를 읽어와 길이를 자르거나 필요한 만큼 읽어오며 작업을 하며, 현재 위치를 이동하거나 읽어오는 position속성과 함께 사용한다. 바로 이 둘( bytesAvailable , position )이 리드버퍼를 이용하는 속성이다.

리드버퍼란 바이트 묶음으로 구성된 컨테이너 정도라고 정의하면 된다. 데이터가 읽을 수 있는 상태가 되면 데이터는 이러한 리드 버퍼 안으로 들어오게 된다. 실제로 위의 readXXX() 메서드들은 리드버퍼의 데이터를 읽어 오는 것이며 open(동기)을 사용하면 리드버퍼에 데이터를 모두 담은 상태에서 데이터에 접근이 가능해지며 동기적 작업에서는 데이터의 모든 바이트를 바로 읽을 수 있기 때문에 사용가능한 유효 바이트를 초과하는 경우가 거의 없지만 openAsync(비동기)를 사용하면 리드버퍼에 데이터는 읽혀짐과 동시에 삭제가 되므로 다른 ByteArray의 delegator에 저장한 다음 작업하여야 한다.


참고) 1 바이트는 256가지 값의 표현이 가능하다. 1bit는 0,1로 2개의 값을 표현하고 이것이 모여 8bit(2^8)가 1바이트가 된다. 8비트는 2의 8승이며 0부터 255까지의 값을 표현 할 수 있다.

참고)
**** 오브젝트 인코딩 데이터 : AMF ****
ObjectEncoding 클래스는 객체를 직렬화하는 클래스(예: NetStream, NetConnection, SharedObject 및 ByteArray)가 이전 버전의 ActionScript와 작동할 수 있도록 합니다. 
객체 인코딩은 객체가 AMF(Action Message Format)에서 표현되는 방식을 제어합니다.
Flash Player는 AMF를 사용하여 Flash 응용 프로그램과 원격 서버 간의 효율적인 통신을 가능하게 합니다.
AMF는 원격 프로시저 호출을 압축된 이진 표현으로 인코딩하여 Flash Media Server에서 사용되는 HTTP/HTTPS 또는 RTMP/RTMPS 프로토콜을 통해 전송될 수 있도록 합니다.
ActionScript 객체 및 데이터 값은 이진 형식으로 직렬화됩니다.
이것은 일반적으로 XML 등과 같은 표현보다 더 압축된 형식입니다.
    
Flash Player 9는 AMF3 및 AMF0의 두 가지 다른 형식으로 직렬화할 수 있습니다.
AMF3은 ActionScript 3.0에서 사용되는 기본 직렬화로 ActionScript 1.0 및 2.0에서 사용되는 AMF0보다 다양한 장점을 제공합니다. AMF3은 AMF0보다 네트워크를 통해 더 효율적으로 데이트를 전송합니다.
또한, int 및 uint 객체를 정수로 전송하는 것을 지원하며, ByteArray, XML 및 IExternalizable 등 ActionScript 3.0에서만 사용 가능한 데이터 유형을 지원합니다. 이것은 ActionScript 3.0 및 Flex 2와 같은 AMF3 인코딩을 사용하는 서버에서만 사용할 수 있습니다.

ByteArray, NetConnection, NetStream, SharedObject, Socket 및 URLStream 클래스에는 ObjectEncoding 클래스로부터 상수가 할당되는 objectEncoding 속성이 포함되어 있습니다. objectEncoding 속성의 비헤이비어는 객체에 따라 달라집니다.

참고) endian자료 보기
Posted by 버터백통
AIR/파일시스템 연동2008. 12. 22. 18:43

AIR의 가장 큰 장점은 AS기반의 언어에서 구사하지 못하였던 로컬 디렉토리나 파일을 읽고 기록할 수 있다는 것이다. 물론 player10에서는 FileReference가 확장되어 이와 같은 작업이 가능하여 웹어플리케이션에서도 확장 가능하지만 AIR처럼 데스크탑 관리에 유연하지는 않다.

파일을 관리하기 위해서는  File클래스 외에 FileStream()클래스가 필요하다.
FileStream()은 파일을 읽기 및 쓰기에 사용되며 open() 메서드를 호출하여 동기적으로 열거나 openAsync() 메서드를 호출하여 비동기적으로 열 수 있다.
File에 의하여 경로를 설정한 delegator를 open( File객체 , FileMode )에서 1번 파라미터로 사용하고 FileMode를 사용하여 읽기,쓰기,추가,갱신 등의 옵션을 사용하여 작업한다.

FileMode 상수 읽기 작성 만들기 열 때 잘라내기 작성된 데이터 추가
READ
WRITE
APPEND
UPDATE

  • 읽기 - FileStream 객체가 파일에서 데이터를 읽어올 수 있습니다.
  • 작성 - FileStream 객체가 파일에 데이터를 작성할 수 있습니다.
  • 만들기 - FileStream 객체가 파일을 열 때 존재하지 않는 파일을 만듭니다.
  • 열 때 잘라내기 - 파일을 열 때 파일에 있는 데이터가 데이터를 쓰기 전에 삭제됩니다.
  • 작성된 데이터 추가 - write 메서드가 호출될 때 데이터가 항상 파일 끝에 기록됩니다.

    표를 쉽게 설명하면 READ는 파일의 바이너리 데이터를 읽어오는 목적으로 사용되며 WRITE는 기록을 위해 불러온다 단 기존의 모든 데이터는 제거되며 기존에 없는 파일일 경우에는 새로 생성된다. APPEND는  기존 바이트 배열의 제일 끝 부분부터 바이트 데이터를 추가 할 수 있으며 UPDATE 는 이전 데이터를 버리지 않으면서 바이트 배열의 어느 position으로든 접근하여 바이트 데이터를 기록 할 수 있다.

    이처럼 FileMode를 선택하여 필요한 작업을 마친 다음에는 언제나 close()를 호출하여 스트림을 닫아주어야 한다. 이는 열려있는 중에 같은 파일을 수정하거나 삭제 등을 하려할 때 시도되지 않는다.

    이처럼 File클래스를 사용하여 경로를 지정하면 FileStream을 사용하여 데이터를 기록하거나 읽어올 수 있다.
    private var file:File;
    private var count:int = 1;
    private function make():void
    {
       //저장할 경로와 이름설정
       file = File.desktopDirectory.resolvePath("test"  + count + ".txt");
       
       //파일저장과 저장형식 설정
       var stream:FileStream = new FileStream();
       stream.open(file , FileMode.WRITE );
       stream.writeMultiByte("저장되는 파일" + count , "UTF-8");
       stream.close();
       count++;
    }

    위의 코드를 실행하면 바탕화면에 test번호.txt를 만들며 텍스트문서의 내용은 "저장되는 파일+count번호"라고 저장된다.

    이처럼 파일포맷을 알면 text문서든 이미지 파일이건 심지어 영상물이나 ppt등을 만들 수 있다. 바이터 배열은 단순히 0과1의 조합으로(실제로는 16진수로 길이를 줄여서 표현) 관련 어플리케이션이 해석만 가능하다면 어떠한 포맷으로든 만들 수 있다.

  • Posted by 버터백통