4

i know there are two classes for IRandomAccessStream interface in WinRT, FileRandomAccessStream and InMemoryRandomAccessStream.

now i'm porting one of my apps to wp8 and some of my methods need IRandomAccessStream as return type,but i cannot find InMemoryRandomAccessStream.

how can i create a memorystream and get a IRandomAccessStream from it without InMemoryRandomAccessStream in Windows Phone 8?

4

1 に答える 1

1

同じことに遭遇しました。ランダムアクセスで一時ファイルストリームを使用することになりました。

これはから一緒にこっそりです

windows.storage.applicationdata.temporaryfolderは実際には実装されていないため、代わりに localfolder にファイルを作成しました (一時的なものが必要なので、後で必ず削除してください)。

windows.storage.streams.inmemoryrandomaccessstream

ここでは、わずかに採用されたサンプル コードを示します。

        private async void TransferData()//object sender, RoutedEventArgs e)
    {
        Windows.Storage.StorageFolder temporaryFolder = ApplicationData.Current.LocalFolder;

        // Write data to a file
        StorageFile sampleFile = await temporaryFolder.CreateFileAsync("tempStream.txt", Windows.Storage.CreationCollisionOption.ReplaceExisting);
        IRandomAccessStream acccessStream = await sampleFile.OpenAsync(FileAccessMode.ReadWrite);

        // Initialize the in-memory stream where data will be stored.
        using (var stream = acccessStream)
        {
            // Create the data writer object backed by the in-memory stream.
            using (var dataWriter = new Windows.Storage.Streams.DataWriter(stream))
            {
                dataWriter.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                dataWriter.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian;

                // Parse the input stream and write each element separately.
                string[] inputElements = "this;really;works".Split(';');
                foreach (string inputElement in inputElements)
                {
                    uint inputElementSize = dataWriter.MeasureString(inputElement);
                    dataWriter.WriteUInt32(inputElementSize);
                    dataWriter.WriteString(inputElement);
                    System.Diagnostics.Debug.WriteLine("Wrote: " + inputElement);
                }

                // Send the contents of the writer to the backing stream.
                await dataWriter.StoreAsync();

                // For the in-memory stream implementation we are using, the flushAsync call 
                // is superfluous,but other types of streams may require it.
                await dataWriter.FlushAsync();

                // In order to prolong the lifetime of the stream, detach it from the 
                // DataWriter so that it will not be closed when Dispose() is called on 
                // dataWriter. Were we to fail to detach the stream, the call to 
                // dataWriter.Dispose() would close the underlying stream, preventing 
                // its subsequent use by the DataReader below.
                dataWriter.DetachStream();
            }

            // Create the input stream at position 0 so that the stream can be read 
            // from the beginning.
            using (var inputStream = stream.GetInputStreamAt(0))
            {
                using (var dataReader = new Windows.Storage.Streams.DataReader(inputStream))
                {
                    // The encoding and byte order need to match the settings of the writer 
                    // we previously used.
                    dataReader.UnicodeEncoding = Windows.Storage.Streams.UnicodeEncoding.Utf8;
                    dataReader.ByteOrder = Windows.Storage.Streams.ByteOrder.LittleEndian;

                    // Once we have written the contents successfully we load the stream.
                    await dataReader.LoadAsync((uint)stream.Size);

                    var receivedStrings = "";

                    // Keep reading until we consume the complete stream.
                    while (dataReader.UnconsumedBufferLength > 0)
                    {
                        // Note that the call to readString requires a length of "code units" 
                        // to read. This is the reason each string is preceded by its length 
                        // when "on the wire".
                        uint bytesToRead = dataReader.ReadUInt32();
                        receivedStrings += dataReader.ReadString(bytesToRead) + "\n";
                    }

                    // Populate the ElementsRead text block with the items we read 
                    // from the stream.
                    System.Diagnostics.Debug.WriteLine("Read: " + receivedStrings);

                }
            }
        }
    }

windows.storage 名前空間を必ず使用してください。

キーはこの行です:

IRandomAccessStream accessStream = await sampleFile.OpenAsync(FileAccessMode.ReadWrite);

速度の影響が何であるかはわかりません。

于 2013-04-18T04:33:57.423 に答える