2017-03-15 37 views
0

我需要讀取兩個文件的一部分,並且一旦這兩個文件的兩部分都被加載來觸發一個可以執行某些工作的函數。Actionscript 3,讀取兩個文件然後觸發一個函數,最佳實踐

解決此問題的最佳方法是什麼?

我目前正在觸發第一次加載的第二個文件加載,但它看起來編碼風格很差,我認爲這是因爲我的OO代碼開始查找過程。

編輯:所以它的基於空氣的應用程序,所以使用文件流。

最後我發現我實際上需要以不同的方式讀取每個文件。因爲我需要這兩個文件的相同部分,並且我不知道文件大小,所以我需要首先讀取一個文件,一旦我有了fileStream.bytesAvailable和position,我就可以從第二個文件中查找相同的數據。我發現我必須處理比我的讀取大小更小的文件,並且文件的結尾超出了我讀取大小的倍數。

+1

實際上沒有更好的方法。你可以做的是把加載代碼放到一個單獨的類中,以便你的主代碼調用類似Loaderer.load(filename:String,callback:Function)的東西,這樣它就可以加載文件並返回它的內容。 – Organis

+0

更好地描述問題。如果這是一個有兩頁的人,當然閱讀第一頁然後閱讀第二頁(順序/程序)是有意義的,然後做出最終決定(功能)。你還有什麼預期的結果_?我的意思是,你想問一個想法/可能性/期望嗎? –

+1

[LoaderMax](https://greensock.com/LoaderMax-AS3)解決了很多文件加載問題。只需排隊你想要加載的所有文件,並執行你的代碼,這取決於完整處理程序中的文件... – bummzack

回答

1

你沒有指定什麼文件,你從哪裏加載文件,但實際上可以並行加載多個文件。

如果你想讀從本地計算機可以使用AIR的FileStream類文件中的一部分 - 很容易,你不必加載整個幾百MB的文件:

import flash.filesystem.*; 

var file:File = File.documentsDirectory; 
file = file.resolvePath("Apollo Test/test.txt"); 
var fileStream:FileStream = new FileStream(); 
fileStream.open(file, FileMode.READ); 
var str:String = fileStream.readMultiByte(file.size, File.systemCharset); 
trace(str); 
fileStream.close(); 

另一種選擇是使用URLStream並偵聽ProgressEvent.PROGRESS事件以讀取部分加載文件的數據。

您可能還想看到用於流式處理視頻的NetStream類。

+0

問題並沒有指出有關AIR的任何內容,因此您無法提供僅在空氣中可用的FileStream –

+0

,這就是爲什麼我還指出'URLStream' –

1

有許多選項,使用File,FileStream僅適用於空中應用程序。

File類擴展了FileReference類。 Flash®Player中提供的FileReference 類以及Adobe®AIR® 表示指向文件的指針,但File類添加了不在Flash Player中公開的屬性和方法(在運行的SWF中由於安全考慮因素,所以瀏覽器的瀏覽器爲 )。

如上所述,如果您正在創建非AIR應用程序,則應使用FileReference而不是FileStream和File類,因爲您在問題中沒有標記AIR。

FileReference不會爲您提供任何open("path")(由於安全考慮),但瀏覽方法將可用並詢問您的客戶選擇文件。這裏有一個例子,這也解釋瞭如何觸發功能時,開口做到:要聽了頓時錯誤的

var filereference:FileReference = new FileReference(); 
filereference.addEventListener(Event.SELECT, onFileSelected); 
var text_files:FileFilter = new FileFilter("Text Files","*.txt; *.html;*.htm;*.php"); 
var all_files:FileFilter = new FileFilter("All Files (*.*)","*.*"); 
filereference.browse([text_files, all_files]); 

// triggered when a file is selected by user 
function onFileSelected(e:Event):void { 
    filereference.removeEventListener(Event.SELECT, onFileSelected); 
    filereference.addEventListener(Event.COMPLETE, onFileLoaded); 
    filereference.load(); 
} 
// triggered when file loading is complete 
function onFileSelected(e:Event):void { 
    var data:ByteArray = fileReference["data"]; 
    filereference.removeEventListener(Event.COMPLETE, onFileSelected); 
} 

兩個事件的發生和加載進度(其同步)顯示進度條: IOErrorEvent.IO_ERRORProgressEvent.PROGRESS