2010-02-23 2 views
3

AS3에서 매우 큰 파일을 읽으려고하고 있으며 런타임에 문제가 발생했습니다. 현재 FileStream을 사용하여 비동기 적으로 파일을 엽니 다. 이것은 약 300MB보다 큰 파일에 대해서는 작동하지 않습니다 (예외없이 작동하지 않음). FileStream 클래스는 여전히 (큰 파일에 대한 나쁜) 메모리에 전체 파일을 읽으려고처럼 documentation보고에서AS3 임의로 큰 파일 작업

_fileStream = new FileStream(); 
_fileStream.addEventListener(IOErrorEvent.IO_ERROR, loadError); 
_fileStream.addEventListener(Event.COMPLETE, loadComplete); 
_fileStream.openAsync(myFile, FileMode.READ); 

, 그것은 소리.

큰 파일을 읽는 데 더 적합한 클래스가 있습니까? 정말 다음에 읽을 파일의 바이트 만로드하는 버퍼링 된 FileStream 클래스와 같은 것이 좋을 것입니다.

나를 위해이 작업을 수행하는 클래스를 작성해야하지만, 한 번에 하나의 파일 만 읽어야 할 것으로 예상됩니다. 나는 FileStream의 위치 및 readAhead 속성을 설정하여 한 번에 파일에서 청크를 읽음으로써이 작업을 수행 할 수 있다고 가정합니다. 이미 존재하는 이와 같은 클래스가 있다면 시간을 절약하고 싶습니다.

전체 내용을 메모리에로드하지 않고 AS3에서 대용량 파일을 처리하는 좋은 방법이 있습니까?

답변

2

당신은 스트림을 생성하고, 한 번에 지정된 오프셋 (offset), 덩어리에서 바이트의 덩어리를 읽을 ... 그렇게 할 수 없습니다

function readPortionOfFile(starting:int, size:int):ByteArray 
{ 
    var bytes:ByteArray ... 
    var fileStream:FileStream ...  

    fileStream.open(myFile); 
    fileStream.readBytes(bytes, starting, size); 
    fileStream.close(); 

    return bytes; 
} 

을 필요에 따라 다음 반복합니다. 나는 이것이 어떻게 작동 하는지를 테스트하지 않았지만 이것이 작동한다는 인상 아래에있었습니다.

+0

이것은 내가 내 자신의 구현에 일을 생각하고 있었는지와 유사하다. 아마도 추상화의 추가 레이어를 구현할 것입니다. – Kekoa

3

fileStream.readAhead 및 fileStream.position 속성을 사용하여 읽고 자하는 파일 데이터의 양과 파일에서 읽을 위치를 설정할 수 있습니다.

메가 바이트 152 기가 바이트 파일 만 읽으 려한다고 가정 해 보겠습니다. 이 작업을 수행; (A 기가 바이트 파일 1,073,741,824 바이트로 구성) (158,334,976 바이트에서 메가 바이트 152 시작)

var _fileStream = new FileStream(); 
_fileStream.addEventListener(Event.COMPLETE, loadComplete); 
_fileStream.addEventListener(ProgressEvent.PROGRESS, onBytesRead); 
_fileStream.readAead = (1024 * 1024); // Read only 1 megabyte 
_fileStream.openAsync(myFile, FileMode.READ); 
_fileStream.position = 158334976; // Read at this position in file 

var megabyte152:ByteArray = new ByteArray(); 

function onBytesRead(e:ProgressEvent) 
{ 
    e.currentTarget.readBytes(megabyte152); 
    if (megabyte152.length == (1024 * 1024)) 
    { 
     chunkReady(); 
    } 
} 

function chunkReady() 
{ 
    // 1 megabyte has been read successfully \\ 
    // No more data from the hard drive file will be read unless _fileStream.position changes \\ 
}