ByteArray okuma ve yazma

Flash Player 9 ve üstü, Adobe AIR 1.0 ve üstü

ByteArray sınıfı, flash.utils paketinin bir parçasıdır. ActionScript 3.0'da ByteArray nesnesi oluşturmak için, aşağıdaki örnekte gösterildiği gibi ByteArray sınıfını içe aktarın ve yapıcıyı çağırın:

import flash.utils.ByteArray; 
var stream:ByteArray = new ByteArray();

ByteArray yöntemleri

Anlamlı bir veri akışı, istediğiniz bilgiyi bulmak için analiz edebileceğiniz bir biçim olarak organize edilir. Örneğin basit bir çalışan dizisindeki kayıt büyük olasılıkla kimlik numarası, ad, adres, telefon numarası vb. içerir. MP3 ses dosyası, indirilmekte olan dosyanın başlığını, yazarını, albümü, yayınlanma tarihini ve türünü belirten bir Kimlik3 etiketi içerir. Biçim sayesinde, veri akışındaki verileri hangi sırada bekleyeceğinizi bilirsiniz. Bayt akışını mantıklı bir şekilde okuyabilirsiniz.

ByteArray sınıfı bir veri akışından okumayı ve veri akışına yazmayı kolaylaştıran birçok yöntem içerir. Bunlardan bazıları readBytes() ve writeBytes() , readInt() ve writeInt() , readFloat() ve writeFloat() , readObject() ve writeObject() ve readUTFBytes() ve writeUTFBytes() yöntemleridir. Bu yöntemler sayesinde veri akışından verileri belirli veri türleri değişkenlerinde okuyabilir ve belirli veri türlerini doğrudan ikili veri akışına yazabilirsiniz.

Örneğin aşağıdaki kod basit bir dize dizisini ve kayar nokta sayısını okur ve her öğeyi ByteArray öğesine yazar. Dizinin organizasyonu sayesinde kod, verileri yazmak için uygun ByteArray yöntemlerini ( writeUTFBytes() ve writeFloat() ) çağırabilir. Yinelenen veri modeli sayesinde diziyi bir döngüyle okuyabilirsiniz.

// The following example reads a simple Array (groceries), made up of strings 
// and floating-point numbers, and writes it to a ByteArray. 
 
import flash.utils.ByteArray; 
 
// define the grocery list Array 
var groceries:Array = ["milk", 4.50, "soup", 1.79, "eggs", 3.19, "bread" , 2.35] 
// define the ByteArray 
var bytes:ByteArray = new ByteArray(); 
// for each item in the array 
for (var i:int = 0; i < groceries.length; i++) { 
        bytes.writeUTFBytes(groceries[i++]); //write the string and position to the next item 
        bytes.writeFloat(groceries[i]);    // write the float 
        trace("bytes.position is: " + bytes.position);    //display the position in ByteArray 
} 
trace("bytes length is: " +  bytes.length);    // display the length 

position özelliği

position özelliği, okuma veya yazma sırasında ByteArray öğesini dizine alan işaretçinin geçerli konumunu saklar. position özelliğinin başlangıç değeri, aşağıdaki kodda da gösterildiği gibi 0'dır (sıfır):

var bytes:ByteArray = new ByteArray(); 
trace("bytes.position is initially: " + bytes.position);     // 0 

Bir ByteArray öğesinden okuma veya ByteArray öğesine yazma işlemi gerçekleştirdiğinizde, kullandığınız yöntem, position özelliğini okunan veya yazılan son baytın hemen ardından konuma işaret edecek şekilde güncelleştirir. Örneğin aşağıdaki kod ByteArray öğesine bir dize yazar ve sonrasında position özelliği, ByteArray öğesindeki dizenin hemen ardından bayta işaret eder.

var bytes:ByteArray = new ByteArray(); 
trace("bytes.position is initially: " + bytes.position);     // 0 
bytes.writeUTFBytes("Hello World!"); 
trace("bytes.position is now: " + bytes.position);    // 12 

Benzer şekilde, bir okuma işlemi de okunan bayt sayısını position özelliğine göre artırır.

var bytes:ByteArray = new ByteArray(); 
 
trace("bytes.position is initially: " + bytes.position);     // 0 
bytes.writeUTFBytes("Hello World!"); 
trace("bytes.position is now: " + bytes.position);    // 12 
bytes.position = 0; 
trace("The first 6 bytes are: " + (bytes.readUTFBytes(6)));    //Hello  
trace("And the next 6 bytes are: " + (bytes.readUTFBytes(6)));    // World! 

Söz konusu uzaklıkta okumak veya yazmak için position özelliğini ByteArray öğesinde belirli bir konuma ayarlayabilirsiniz.

bytesAvailable ve length özellikleri

length ve bytesAvailable özellikleri, ByteArray öğesinin ne kadar süreceğini ve geçerli konumdan sonuna kadar kaç baytı kaldığını gösterir. Aşağıdaki örnek bu özellikleri nasıl kullanabileceğinizi gösterir. Örnek, metnin bir Dizesini ByteArray öğesine yazar ve ardından, “a” ile veya son ile karşılaşana kadar ( bytesAvailable <= 0 ) bir kerede bir bayt olacak şekilde ByteArray öğesini okur.

var bytes:ByteArray = new ByteArray(); 
var text:String = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Vivamus etc."; 
 
bytes.writeUTFBytes(text); // write the text to the ByteArray 
trace("The length of the ByteArray is: " + bytes.length);    // 70 
bytes.position = 0; // reset position 
while (bytes.bytesAvailable > 0 && (bytes.readUTFBytes(1) != 'a')) { 
    //read to letter a or end of bytes 
} 
if (bytes.position < bytes.bytesAvailable) { 
    trace("Found the letter a; position is: " + bytes.position);     // 23 
    trace("and the number of bytes available is: " + bytes.bytesAvailable);    // 47 
} 

endian özelliği

Bilgisayarlar çok baytlı, yani saklanması için 1 bayttan fazla bellek gereken sayıları saklama yöntemlerine göre farklılık gösterebilir. Örneğin bir tam sayı belleğin 4 baytını veya 32 bitini kaplayabilir. Bazı bilgisayarlar öncelikle sayının en yüksek değerli baytını en düşük bellek adresinde saklar, diğer bilgisayarlar ise öncelikle en düşük değerli baytı saklar. Bilgisayarın veya bayt sıralamasının bu niteliği, big endian (önce en yüksek değerli bayt) veya little endian (önce en düşük değerli bayt) olarak adlandırılır. Örneğin 0x31323334 sayısı big endian ve little endian bayt sıralaması için aşağıdaki gibi saklanır, a0, 4 bayt arasında en düşük bellek adresini ve a3 en yüksek olanı temsil eder:

Big Endian

Big Endian

Big Endian

Big Endian

a0

a1

a2

a3

31

32

33

34

Little Endian

Little Endian

Little Endian

Little Endian

a0

a1

a2

a3

34

33

32

31

ByteArray sınıfının endian özelliği, işlediğiniz çok baytı sayılar için bu bayt sırasını belirtmenizi sağlar. Bu özellik için kabul edilebilir değerler "bigEndian" veya "littleEndian" değerleridir ve Endian sınıfı, endian özelliğini bu dizelerle ayarlamak için BIG_ENDIAN ve LITTLE_ENDIAN sabitlerini tanımlar.

compress() ve uncompress() yöntemleri

compress() yöntemi sayesinde bir ByteArray öğesini, parametre olarak belirttiğiniz bir sıkıştırma algoritmasına göre sıkıştırabilirsiniz. uncompress() yöntemi sayesinde, sıkıştırılmış bir ByteArray öğesini sıkıştırma algoritmasına göre genişletebilirsiniz. compress() ve uncompress() yöntemlerini çağırdıktan sonra, bayt dizisinin uzunluğu yeni uzunluğa ve position özelliği sona ayarlanır.

CompressionAlgorithm sınıfı, sıkıştırma algoritmasını belirtmek için kullanabileceğiniz sabitleri tanımlar. ByteArray sınıfı deflate (yalnızca AIR), zlib ve lzma algoritmalarını destekler. Zlib sıkıştırılmış veri biçimi açıklaması için bkz. http://www.ietf.org/rfc/rfc1950.txt lzma algoritması Flash Player 11.4 ve AIR 3.4 için eklendi. Açıklaması için bkz. http://www.7-zip.org/7z.html .

Deflate sıkıştırma algoritması zlib, gzip ve bazı zip uygulamaları gibi çeşitli sıkıştırma biçimlerinde kullanılır. Deflate sıkıştırma algoritması açıklaması için bkz. http://www.ietf.org/rfc/rfc1951.txt .

Aşağıdaki örnek, bytes adındaki ByteArray öğesini lzma algoritması kullanarak sıkıştırır:

bytes.compress(CompressionAlgorithm.LZMA);

Aşağıdaki örnek sıkıştırılmış bir ByteArray öğesini deflate algoritması kullanarak genişletir:

bytes.uncompress(CompressionAlgorithm.LZMA);

Nesneleri okuma ve nesnelere yazma

readObject() ve writeObject() yöntemleri, serileştirilmiş Action Message Format (AMF) olarak kodlanmış şekilde ByteArray öğesinden bir nesne okur ve ByteArray öğesine bir nesne yazar. AMF, Adobe tarafından oluşturulan ve Netstream, NetConnection, NetStream, LocalConnection ve Paylaşılan Nesneleri de içeren çeşitli ActionScript 3.0 sınıfları tarafından kullanılan özel bir mesaj protokolüdür.

Tek baytlı tür işaretleyicisi, ardından gelen kodlanmış verilerin türünü açıklar. AMF aşağıdaki 13 veri türünü kullanır:

value-type = undefined-marker | null-marker | false-marker | true-marker | integer-type |  
    double-type | string-type | xml-doc-type | date-type | array-type | object-type | 
    xml-type | byte-array-type

Kodlanmış veriler, işaretleyici null veya true ya da false gibi, hiçbir verinin kodlanmadığı tek bir olası değer temsil edene kadar tür işaretleyicisini izler.

AMF'nin iki sürümü vardır: AMF0 ve AMF3. AMF 0, karmaşık nesneleri başvuruya göre göndermeyi destekler ve uç noktaların nesne ilişkilerini geri yüklemesini sağlar. AMF 3, nesne özelliklerini ve dizeleri nesne başvurularına ek olarak başvuruya göre göndererek ve ActionScript 3.0 uygulamasında tanıtılan yeni veri türlerini destekleyerek AMF 0'ı iyileştirir. ByteArray.objectEcoding özelliği, nesne verilerinin kodlanmasında kullanılan AMF sürümünü belirtir. flash.net.ObjectEncoding sınıfı, AMF sürümünü belirtmeye yönelik sabitleri tanımlar: ObjectEncoding.AMF0 ve ObjectEncoding.AMF3 .

Aşağıdaki örnek, bir XML nesnesini ByteArray öğesine yazmak için writeObject() öğesini çağırır, ardından Deflate algoritmasını kullanarak öğeyi genişletir ve masaüstündeki order dosyasına yazar. Örnek, işlem bittiğinde AIR penceresinde “Sıra dosyası masaüstüne yazıldı!” mesajını görüntülemek için mesajını görüntüler.

import flash.filesystem.*; 
import flash.display.Sprite; 
import flash.display.TextField; 
import flash.utils.ByteArray; 

public class WriteObjectExample extends Sprite 
{ 
    public function WriteObjectExample() 
    { 
        var bytes:ByteArray = new ByteArray(); 
        var myLabel:TextField = new TextField(); 
        myLabel.x = 150; 
        myLabel.y = 150; 
        myLabel.width = 200; 
        addChild(myLabel); 
          
        var myXML:XML =  
            <order> 
                <item id='1'> 
                    <menuName>burger</menuName> 
                    <price>3.95</price> 
                </item> 
                <item id='2'> 
                    <menuName>fries</menuName> 
                    <price>1.45</price> 
                </item> 
            </order>; 
          
        // Write XML object to ByteArray 
        bytes.writeObject(myXML); 
        bytes.position = 0;        //reset position to beginning 
        bytes.compress(CompressionAlgorithm.DEFLATE);    // compress ByteArray 
        writeBytesToFile("order.xml", bytes); 
        myLabel.text = "Wrote order file to desktop!"; 
    } 
     
    private function writeBytesToFile(fileName:String, data:ByteArray):void 
    { 
        var outFile:File = File.desktopDirectory; // dest folder is desktop 
        outFile = outFile.resolvePath(fileName);  // name of file to write 
        var outStream:FileStream = new FileStream(); 
        // open output file stream in WRITE mode 
        outStream.open(outFile, FileMode.WRITE); 
        // write out the file 
        outStream.writeBytes(data, 0, data.length); 
        // close it 
        outStream.close(); 
    } 
}

readObject() yöntemi, serileştirilmiş AMF'deki bir nesneyi ByteArray öğesinden okur ve belirtilen türde bir nesnede saklar. Aşağıdaki örnek order dosyasını masaüstünden ByteArray öğesine ( inBytes ) okur, genişletir ve orderXML XML nesnesinde saklamak için readObject() öğesini çağırır. Örnek, her düğümü görüntüleme için bir metin alanına eklemek üzere for each() döngü yapısı kullanır. Örnek ayrıca objectEncoding özelliğinin değerini de, order dosyasının içeriğine yönelik bir üstbilgiyle birlikte görüntüler.

import flash.filesystem.*; 
import flash.display.Sprite; 
import flash.display.TextField; 
import flash.utils.ByteArray; 
 
public class ReadObjectExample extends Sprite 
{ 
    public function ReadObjectExample() 
    { 
        var inBytes:ByteArray = new ByteArray(); 
        // define text area for displaying XML content 
        var myTxt:TextField = new TextField(); 
        myTxt.width = 550; 
        myTxt.height = 400; 
        addChild(myTxt); 
        //display objectEncoding and file heading 
        myTxt.text = "Object encoding is: " + inBytes.objectEncoding + "\n\n" + "order file: \n\n"; 
        readFileIntoByteArray("order", inBytes); 
         
        inBytes.position = 0; // reset position to beginning 
        inBytes.uncompress(CompressionAlgorithm.DEFLATE); 
        inBytes.position = 0;    //reset position to beginning 
        // read XML Object 
        var orderXML:XML = inBytes.readObject(); 
         
        // for each node in orderXML 
        for each (var child:XML in orderXML) 
        { 
            // append child node to text area 
            myTxt.text += child + "\n"; 
        }  
    } 
     
    // read specified file into byte array 
    private function readFileIntoByteArray(fileName:String, data:ByteArray):void 
    { 
        var inFile:File = File.desktopDirectory; // source folder is desktop 
        inFile = inFile.resolvePath(fileName);  // name of file to read 
        var inStream:FileStream = new FileStream(); 
        inStream.open(inFile, FileMode.READ); 
        inStream.readBytes(data); 
        inStream.close(); 
    } 
}