分类: Delphi
2015-03-01 22:15:09
FileStream fs = new FileStream(@"d:\temp.txt", FileMode.Open, FileAccess.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(offset, SeekOrigin.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.Length; offset++)
{
Console.Write(fs.Position + " ");
fs.Seek(-offset, SeekOrigin.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.Length; offset++)
{
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]; //比如stream的Length为9,那么byte的Length为14
fs.Read(bytes, 5, (int)fs.Length); //那么从byte的第6个byte开始写入,写入的长度为流的长度9
//byte[] bytes = new byte[fs.Length];
//fs.Read(bytes, 0, bytes.Length);
Stream stream = new MemoryStream(bytes); //将字节转化为流
for (offset = 0; offset < stream.Length; offset++)
{
stream.Seek(offset, SeekOrigin.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.Write将byte写入文件进行持久化操作,演示限定从字节的某个位置开始,写入多少个字节的操作
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)字节开始,写入2个byte到持久化文件当中,如果1234,则把23写入。
//注意:如果从第三个(索引为2)字节开始,写入3个byte到持久化文件当中,将报错,因为只剩下2(总字节4-去掉开始的2个)个字节可以写人
//outstream.Write(tempBytes, 0, numBytes);//从byte写入流当中
}
outstream.Flush();
outstream.Close();
fs.Close();
原文来自:http://blog.csdn.net/shaojc85 【】