2013-03-05 76 views
4

我知道在WinRT中有兩個類IRandomAccessStream接口, FileRandomAccessStream和InMemoryRandomAccessStream。我可以使用什麼來取代Windows Phone 8中的InMemoryRandomAccessStream?

現在我正在將我的一個應用程序移植到wp8,並且我的一些方法需要IRandomAccessStream作爲返回類型,但是我找不到InMemoryRandomAccessStream。

如何在Windows Phone 8中創建內存流並從中獲取IRandomAccessStream而不使用InMemoryRandomAccessStream?

+0

你知道了嗎? – 2013-04-03 10:41:24

回答

1

遇到了同樣的事情。我最終使用隨機訪問臨時文件流。

這是從

windows.storage.applicationdata.temporaryfolder這是不實際執行kludged在一起,所以我創造了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 acccessStream =等待sampleFile.OpenAsync(FileAccessMode.ReadWrite);

我不確定速度的影響是什麼。

相關問題