日期:2014-05-16  浏览次数:20891 次

WinRT 中RandomAccessStreamReference的使用

????? RandomAccessStreamReference是WinRT中的一个类,从API文档中,可以得知,它的作用是为一个文件提供随机访问的输入或者输出流。对比发现,只要Windows.Storage.Streams空间中带个Reference的,都是称为提供某某流,相当于一个流生成类,目前除了接口定义出的IInputStreamReference、IRandomAccessStreamReference以及上诉的RandomAccessStreamReference(对IRandomAccessStreamReference的实现),就没有看见其他的了,奇怪的是没有对应的IOutputStreamRefrence。

???? 具体来看RandomAccessStreamReference类,它提供了静态函数三个:CreateFromFile、CreateFromStream、CreateFromUri,以及一个实现了IRandomAccessStreamReference接口的OpenReadAsync。三个静态函数的意思就是使用不同的方式,将file变成输入输出流,当然,使用之前,你需要打开它,使用范例如下:

 //Uri uri = new Uri("http://www.charlespetzold.com/pw6/PetzoldJersey.jpg");
            Uri uri = new Uri("http://www.google.com.hk");
            RandomAccessStreamReference streamRef = RandomAccessStreamReference.CreateFromUri(uri);

            // Create a buffer for reading the stream
            Windows.Storage.Streams.Buffer buffer = null;

            // Read the entire file
            using (IRandomAccessStreamWithContentType fileStream = await streamRef.OpenReadAsync())
            {
                buffer = new Windows.Storage.Streams.Buffer((uint)fileStream.Size);
                await fileStream.ReadAsync(buffer, (uint)fileStream.Size, InputStreamOptions.None);
            }

?注意以上代码,Open返回的是一个IRandomAccessStreamWithContentType 接口,该接口继承了流输入输出接口和随机访问接口(你就可以把它看成一个.NET中的Stream),以及IContentTypeProvider接口,最后的这个Content有关的接口,其实里面只有一个string类型的属性,叫作ContentType,顾名思义,也就是表示你加载的这个文件流的类型是什么。看我上面的那段代码,你可以断点查看fileStream中的ContentType的字串是什么,当我们使用jpg的Uri时,它的字符串是 "image/pjpeg",若是一个google的首页网址,那么字符串是"text/html",所以,竟然它说是为文件提供流,那么也就是标志这个文件是什么类型的,仅此而已,在开发过程中,我们往往是已经知道返回的文件应该是什么类型的了。