2013-09-26 14 views
0

我有一個ByteArray值爲avroBinaryValue,架構名稱值爲字符串schemaName,上次修改日期值爲lastModifiedDate將三個ByteArray合併在一起,然後分割生成的ByteArrays

byte[] avroBinaryValue = os.toByteArray(); 
String schemaName = "DEMOGRAPHIC"; 
long lastModifiedDate = "1379811105109"; 

現在我打算schemaName轉換成byteArray爲好。我們將其命名爲byteSchmeName

之後,我也會將lastModifiedDate轉換爲byteArray。讓我們將其命名爲byteLMD

  1. 現在什麼來連接這三個byteArrays在一起的最佳方式。

    avroBinaryValue + byteSchemaName + byteLMD

  2. 其次,串聯這三個共同的ByteArray後,我想以這樣的方式,這樣我就能夠正確地得到所有三個相應的ByteArray導致byteArrays分裂..

有沒有可能這樣做?任何幫助將不勝感激。

注: -

這三個的ByteArray值將在不同情況下的不同..我希望存儲以這樣的方式,使得它並不需要所產生的ByteArray最有效的方法磁盤上有很多空間。我不想再次序列化它,因爲我得到的avroBinaryValue來自Avro Data Serialization ..所以我想在ByteArray中轉換其他兩個東西,以便我可以將所有三個元素合併成一個ByteArray。

+0

如果您要將數據寫入磁盤並再次讀取,您可以使用DataOutputStream和DataInputStream(當然還有FileOutputStream和FileInputStream)。 – jtahlborn

+0

我將寫入Cassandra數據庫,這就是爲什麼我說磁盤.. – AKIWEB

回答

1

您需要定義一種格式。您有以下

byte[] avroBinaryValue = os.toByteArray(); 
String schemaName = "DEMOGRAPHIC"; 
long lastModifiedDate = 1379811105109L; 

我想avroBinaryValue可以可變長度等都可以schemaName。對於所有的意圖和目的,lastModifiedDate適合一個很長的,即。 8個字節。

如果你想序列化這個(除了使用Serializable),你將不得不使用一種特定的格式來告訴你你正在閱讀什麼以及什麼時候停止閱讀它。例如,

Offset Length (in bytes)  Purpose 
    0   4    - length of avroBinaryValue array 
    4   X    - avroBinaryValue array 
    4+X   4    - length of of schemaName byte array 
4+X+4   Y    - schemaName byte array 
4+X+4+Y  8    - value of lastModifiedDate 

還決定是否要big-endian或小端字節順序。

因此,你按照格式描述寫下你的三個字段,並以相同的方式閱讀它。


下面是在內存中完成一個例子,其中osString(爲簡單起見)一

public static void main(String[] args) throws Exception { 
    String os = "whatever os is"; 
    byte[] avroBinaryValue = os.getBytes(); 
    String schemaName = "DEMOGRAPHIC"; 
    long lastModifiedDate = 1379811105109L; 

    byte[] schemaNameBytes = schemaName.getBytes(); 

    ByteArrayOutputStream byteOs = new ByteArrayOutputStream(); 
    DataOutputStream out = new DataOutputStream(byteOs); 
    out.writeInt(avroBinaryValue.length); 
    out.write(avroBinaryValue); 
    out.writeInt(schemaNameBytes.length); 
    out.write(schemaNameBytes); 
    out.writeLong(lastModifiedDate); 

    // write done 

    byte[] allWrittenBytes = byteOs.toByteArray(); 

    DataInputStream in = new DataInputStream(new ByteArrayInputStream(allWrittenBytes)); 

    int sizeAvro = in.readInt(); 
    avroBinaryValue = new byte[sizeAvro]; 
    in.read(avroBinaryValue, 0, sizeAvro); 

    int sizeSchema = in.readInt(); 
    schemaNameBytes = new byte[sizeSchema]; 
    in.read(schemaNameBytes, 0, sizeSchema); 

    lastModifiedDate = in.readLong(); 

    // read done 

    System.out.println(new String(avroBinaryValue)); 
    System.out.println(new String(schemaNameBytes)); 
    System.out.println(lastModifiedDate); 
} 

它打印

whatever os is 
DEMOGRAPHIC 
1379811105109 

我明白你想節省空間,但將每個字段寫入其自己的列或使用標準形式可能會更好不喜歡XML或JSON來序列化你的領域。

+0

感謝您的建議。是的,你是正確的,avroBinaryValue將是可變長度的,schemaName也可以是可變長度的。但是大多數時候,它也會被固定,假設所有的schemaName的長度都是8。很長,它應該是8字節......如果可能,你能否提供一個示例基礎來說明我的上述情況,以瞭解它如何在Java中完成。它會幫助我理解過程。 – AKIWEB

+0

@ TrekkieTechieT-T我已經發布了一個內存中的示例。 –

+0

感謝您的幫助..是的,我完全理解,它會更好地使用JSON或將其作爲一個單獨的列寫入。但我不能寫作一個單獨的列bcoz我要使用Cassandra,並且每個列名將重複每當我們存儲數據,所以這將是在那裏浪費空間...一般來說,我知道它的一個愚蠢的問題,但如果我使用JSON和序列化到JSON那麼哪種方法更好?我們現在正在使用的方法還是使用JSON?在性能方面哪個更好? – AKIWEB

相關問題