FileStream之Seek、Read、Write的使用

来源:互联网 发布:电影推荐算法数据集 编辑:程序博客网 时间:2024/04/20 18:07

 FileStream fs = new FileStream(@"d:\temp.txt"FileMode.OpenFileAccess.Read);< xmlnamespace prefix ="o" ns ="urn:schemas-microsoft-com:office:office" />

            long offset;

 

            //fs读取后的内容为:123456789

            for (offset = fs.Length - 1; offset >= 0; offset--)

            {              

                Console.Write(fs.Position + " ");

                fs.Seek(offsetSeekOrigin.Begin);

                Console.Write(fs.Position + " ");

                Console.Write(Convert.ToChar(fs.ReadByte()) + " ");

                Console.Write(fs.Position + "\r\n");

            }

            /*说明:fs.Position可以获取或设置当前流的位置,

             *      也可以使用fs.Seek设置当前流的位置,使用fs.ReadByte()读取一个字节后,

             *      当前流位置会往后移一位。

             *    0    8    9    9

             *    9    7    8    8

             *    8    6    7    7

             *    7    5    6    6

             *    6    4    5    5

             *    5    3    4    4

             *    4    2    3    3

             *    3    1    2    2

             *    2    0    1    1

             */

           

            Console.Write("\r\n\r\n");

            fs.Seek(0, SeekOrigin.Begin);

            //fs读取后的内容为:123456789

            for (offset = 1; offset <= fs.Lengthoffset++)

            {

                Console.Write(fs.Position + " ");

                fs.Seek(-offsetSeekOrigin.End);

                Console.Write(fs.Position + " ");

                Console.Write(Convert.ToChar(fs.ReadByte()) + " ");

                Console.Write(fs.Position + "\r\n");

            }

            /*说明: 如果当前流的长度为9,则当运行fs.Seek(-0, SeekOrigin.End);后的流位置为9,也就是字符串的末尾。

             *       运行fs.Seek(-1, SeekOrigin.End);后的流位置为8,运行fs.Seek(-2, SeekOrigin.End);后的流位置为7

             *       负号表示当前流位置往左移动,此示例中的-offset表示从末尾开始往左前进Math.Abs(-offset)个位置后得到的当前流位置。

             *       在本示例中fs.Seek(-1, SeekOrigin.End); <=> fs.Seek(8, SeekOrigin.Begin);

             *    0    8    9    9

             *    9    7    8    8

             *    8    6    7    7

             *    7    5    6    6

             *    6    4    5    5

             *    5    3    4    4

             *    4    2    3    3

             *    3    1    2    2

             *    2    0    1    1

             */

 

 

            Console.Write("\r\n\r\n");         

            fs.Seek(0, SeekOrigin.End);         

            for (offset = 0; offset < fs.Lengthoffset++)

            {

                Console.Write(fs.Position + " ");

                fs.Seek(-1, SeekOrigin.Current);

                Console.Write(fs.Position + " ");

                Console.Write(Convert.ToChar(fs.ReadByte()) + " ");

                Console.Write(fs.Position + " ");

                fs.Seek(-1, SeekOrigin.Current);

                Console.Write(fs.Position + "\r\n");

            }

            Console.Write("\r\n\r\n");

            /*说明:fs.Seek(-1, SeekOrigin.Current);表示当前流位置往左移一位。

             *      fs.Seek(1, SeekOrigin.Current);表示当前流位置往右移一位。

             *    9    8    9    9    8

             *    8    7    8    8    7

             *    7    6    7    7    6

             *    6    5    6    6    5

             *    5    4    5    5    4

             *    4    3    4    4    3

             *    3    2    3    3    2

             *    2    1    2    2    1

             *    1    0    1    1    0

             */           

 

 

            //以下演示将流转化为字节的注意事项,特别适用网络传输,需要将 文件-->-->字节 转换为字节进行传输场景

            fs.Seek(0, SeekOrigin.Begin);               //将当前流位置设置为起始位置

            /*将流转化为字节,可以自定义字节的长度,以及要转化的流长度*/

            byte[] bytes = new byte[fs.Length + 5];     //比如streamLength9,那么byteLength14

            fs.Read(bytes, 5, (int)fs.Length);          //那么从byte的第6byte开始写入,写入的长度为流的长度9

            //byte[] bytes = new byte[fs.Length];

            //fs.Read(bytes, 0, bytes.Length);

            Stream stream = new MemoryStream(bytes);    //将字节转化为流         

            for (offset = 0; offset < stream.Lengthoffset++)

            {             

                stream.Seek(offsetSeekOrigin.Begin);

                Console.Write(stream.Position + " ");

                Console.Write(Convert.ToChar(stream.ReadByte()) + " ");

                Console.Write(stream.Position + "\r\n");

            }

            Console.Write("\r\n\r\n");

            /*

             *    0    0       1

             *    1    1       2

             *    2    2       3

             *    3    3       4

             *    4    4       5

             *    5    5    1    6

             *    6    6    2    7

             *    7    7    3    8

             *    8    8    4    9

             *    9    9    5    10

             *    10   10   6    11

             *    11   11   7    12

             *    12   12   8    13

             *    13   13   9    14

             */

 

 

            //以下示例演示使用fs.Writebyte写入文件进行持久化操作,演示限定从字节的某个位置开始,写入多少个字节的操作

            fs.Seek(0, SeekOrigin.Begin);// stream的内容为:"123456789". 开始有

            byte[] tempBytes = new byte[4];

            Stream outstream = new FileStream("d:\\a.txt"FileMode.OpenOrCreate);

            int numBytes;

            while ((numBytes = fs.Read(tempBytes, 0, tempBytes.Length)) > 0)

            {

                outstream.Write(tempBytes, 1, numBytes - 2); 

                //当前tempBytes共有4个字节,从第二个(索引为1)字节开始,写入2byte到持久化文件当中,如果1234,则把23写入。

                //注意:如果从第三个(索引为2)字节开始,写入3byte到持久化文件当中,将报错,因为只剩下2(总字节4-去掉开始的2个)个字节可以写人

                //outstream.Write(tempBytes, 0, numBytes);//byte写入流当中              

            }

            outstream.Flush();

            outstream.Close();

            fs.Close();

0 0
原创粉丝点击