WinJS:来自String的IInputStream

时间:2013-04-29 13:42:06

标签: windows-8 windows-store-apps winjs

如果我在内存中有一个字符串并希望使用BackgroundUploader将其发送到Web服务,我希望避免将其写入磁盘(从而处理临时文件的清理)。 / p>

现在有createUploadFromStreamAsync,但我想知道从字符串创建所需IInputStream的最高效方法是什么。

我想到的第一件事就是使用IBuffer将其转换为CryptographicBuffer::convertStringToBinary,将其写入InMemoryRandomAccessStream并从那里获取IInputStream。所以它是字符串 - > IBuffer - > InMemoryRandomAccessStream - > IInputStream。相当麻烦......

要实现的第二种方法是做new Blob(myString.split('')).msDetachStream().getInputStreamAt(0),这当然不会使用尽可能多的本机调用并具有相同数量的步骤。即字符串 - >数组 - > Blob - > IInputStream。

您处理此转换的方法是什么?

1 个答案:

答案 0 :(得分: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的测试和工作版本很简单:new Blob([new Uint8Array(Array.from(myString))])。msDetachStream()。getInputStreamAt(0)

根据您的使用方式,流字节顺序和编码可能会产生显着差异。实际上,第二种方法可能需要使用另一种方法来分割字符串,具体取决于编码格式。