2013-04-29 49 views
0

在內存中有字符串並希望使用BackgroundUploader將其發送到Web服務的情況下,我想避免將其寫入磁盤(從而處理臨時文件清理)。WinJS:來自字符串的IInputStream

現在有createUploadFromStreamAsync,但我不知道什麼是從字符串創建所需的IInputStream最高性能的方式。

我想到的第一件事就是使用CryptographicBuffer::convertStringToBinary將它轉換爲IBuffer,將它寫入InMemoryRandomAccessStream並從那裏獲取IInputStream。所以它是String - > IBuffer - > InMemoryRandomAccessStream - > IInputStream。相當麻煩...

第二種方法可以做的事情就是做new Blob(myString.split('')).msDetachStream().getInputStreamAt(0)這當然不會使用很多原生電話並且具有相同的步數。即字符串 - >數組 - > Blob - > IInputStream。

您將如何處理此轉換?

+0

此問題可能會給解決方案一些[lead](http://stackoverflow.com/questions/15862421/winjs-display-image-from-a-byte-array/15863667#15863667)。 – Sushil 2013-04-29 15:38:38

+0

是的,這就是我在第一種方法中提出的建議 – 2013-04-29 16:24:05

+0

第二種方法是否需要拆分呼叫?我閱讀[blob文檔](https://developer.mozilla.org/en-US/docs/Web/API/Blob?redirectlocale=en-US&redirectslug=DOM%2FBlob) - 這會不會好嗎? 'var blob = new Blob([myString])。msDetachStream()。getInputStreamAt(0);' – Sushil 2013-04-30 03:37:42

回答

0

甲測試和工作的版本替換方法1,其不應該在這種情況下被使用CryptographicBuffers是:

    var randomAccessStream = new Windows.Storage.Streams.InMemoryRandomAccessStream(); 
        var dataWriter = new Windows.Storage.Streams.DataWriter(randomAccessStream); 
        dataWriter.unicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.utf8; 
        dataWriter.byteOrder = Windows.Storage.Streams.ByteOrder.littleEndian; 
        dataWriter.writeString(myString); 
        dataWriter.storeAsync().then(function() { 
         return dataWriter.flushAsync(); 
        }).then(function() { 
         var stream = dataWriter.detachStream(); 
         stream.seek(0); 
         dataWriter.close(); 
         stream; 
        }); 

甲測試方法2的工作版本是簡單地,新的斑點([新Uint8Array(陣列.from(myString))])。msDetachStream()。getInputStreamAt(0)

根據您的使用方式,流字節順序和編碼可能會產生顯着差異。實際上,第二種方法可能需要使用另一種方式來根據編碼格式拆分字符串。