FileStream 객체의 bytesAvailable 속성 및 읽기 버퍼

Adobe AIR 1.0 이상

읽기 기능을 사용하여 FileStream 객체를 여는 경우(open() 또는 openAsync() 메서드의 fileMode 매개 변수를 READ 또는 UPDATE로 설정) 런타임에서 데이터를 내부 버퍼에 저장합니다. FileStream 객체의 open() 또는 openAsync() 메서드를 호출하여 파일을 여는 즉시 FileStream 객체는 데이터를 버퍼로 읽어 오기 시작합니다.

open() 메서드를 사용하여 파일을 동기 작업용으로 연 경우 다음 코드에서와 같이 항상 position 포인터를 파일 경계 내의 유효한 위치로 설정하고 파일 경계 내의 원하는 양의 데이터를 읽기 시작할 수 있습니다. 이 예제에서는 파일에 100바이트 이상이 포함되어 있다고 가정합니다.

var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.open(myFile, FileMode.READ); 
myFileStream.position = 10; 
myFileStream.readBytes(myByteArray, 0, 20); 
myFileStream.position = 89; 
myFileStream.readBytes(myByteArray, 0, 10);   

파일을 동기 작업용으로 열었는지 비동기 작업용으로 열었는지와 관계없이 읽기 메서드는 항상 bytesAvalable 속성으로 표시되는 "사용 가능한" 바이트를 읽습니다. 동기적으로 읽는 경우 파일의 모든 바이트를 항상 사용할 수 있습니다. 비동기적으로 읽는 경우에는 position 속성에 지정된 위치부터 바이트를 사용할 수 있게 되고 일련의 비동기 버퍼 채우기가 progress 이벤트로 표시됩니다.

파일을 동기 작업용으로 연 경우 bytesAvailable 속성은 position 속성에서 파일 끝까지의 바이트 수를 나타내도록 설정됩니다(파일의 모든 바이트를 항상 읽을 수 있음).

파일을 비동기 작업용으로 연 경우에는 읽기 메서드를 호출하기 전에 읽기 버퍼에서 충분한 데이터를 사용했는지 확인해야 합니다. 파일을 비동기적으로 연 경우 읽기 작업이 진행되면 읽기 작업이 시작될 때 지정한 position부터 시작하여 파일의 데이터가 버퍼에 추가되고 bytesAvailable 속성이 읽은 각 바이트만큼 증가합니다. bytesAvailable 속성은 position 속성에서 지정한 위치의 바이트에서 시작하여 버퍼의 끝까지 사용할 수 있는 바이트 수를 나타냅니다. FileStream 객체는 정기적으로 progress 이벤트를 보냅니다.

파일을 비동기적으로 연 경우 데이터가 읽기 버퍼에서 사용할 수 있게 되면 FileStream 객체는 정기적으로 progress 이벤트를 전달합니다. 예를 들어 다음 코드에서는 데이터를 버퍼로 읽어 올 때와 마찬가지로 ByteArray 객체 bytes로 읽어 옵니다.

var bytes:ByteArray = new ByteArray(); 
var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
myFileStream.openAsync(myFile, FileMode.READ); 
 
function progressHandler(event:ProgressEvent):void  
{ 
    myFileStream.readBytes(bytes, myFileStream.position, myFileStream.bytesAvailable); 
} 

파일을 비동기적으로 연 경우 읽기 버퍼의 데이터만 읽을 수 있습니다. 또한 데이터를 읽으면 읽기 버퍼에서 제거됩니다. 읽기 작업의 경우 읽기 작업을 호출하기 전에 데이터가 읽기 버퍼에 있는지 확인해야 합니다. 예를 들어 다음 코드에서는 파일의 위치 4000에서 시작되는 8000바이트의 데이터를 읽습니다.

var myFile:File = File.documentsDirectory.resolvePath("AIR Test/test.txt"); 
var myFileStream:FileStream = new FileStream(); 
myFileStream.addEventListener(ProgressEvent.PROGRESS, progressHandler); 
myFileStream.addEventListener(Event.COMPLETE, completed); 
myFileStream.openAsync(myFile, FileMode.READ); 
myFileStream.position = 4000; 
 
var str:String = ""; 
 
function progressHandler(event:Event):void  
{ 
    if (myFileStream.bytesAvailable > 8000 ) 
    { 
        str += myFileStream.readMultiByte(8000, "iso-8859-1"); 
    } 
} 

쓰기 작업 동안 FileStream 객체는 읽기 버퍼로 데이터를 읽어 오지 않습니다. 쓰기 작업이 완료되면(쓰기 버퍼의 모든 데이터가 파일에 기록되면) FileStream 객체는 새 읽기 버퍼를 시작하고(읽기 기능을 사용하여 연결된 FileStream 객체를 연 것으로 가정할 경우) position 속성에 지정된 위치에서 시작하여 데이터를 읽기 버퍼로 읽어 오기 시작합니다. position 속성은 마지막으로 쓴 바이트의 위치이거나 사용자가 쓰기 작업 후 position 객체에 다른 값을 지정하는 경우 다른 위치일 수 있습니다.