c# 中StreamWriter写入中文出现乱码的解决办法

FielStream类操作的是字节和节节数组,而stream类操作的是字符数据。字符数据易于使用,但是有些操作,比如随机文件访问(访问文件中间某点的数据),就必须由FileStream对象执行。
             FielStream类维护内部文件指针,该指针指向文件中进行下一次读写操作的位置。
             FileStream只能处理原始字节(raw byte),处理原去吧字节的功能使用FileStream类可以用于处理任何数据文件。
            
通过读取字节数据,FileStream对像可以用于读取图像和声音。代价是FileStream类不能将数据直接读入字符串
            
此指针可以修改用Seek方法,它有两个参数:
            
第一个参数:规定文件指针以字节为参数的移动距离
            
第二个参数:规定开始计算的起始位置

ContractedBlock.gif ExpandedBlockStart.gif Code
 1byte[] byDataValue = new byte[200];
 2        char[] charDataValue = new char[200];
 3
 4ExpandedBlockStart.gifContractedBlock.gif        /**//// <summary>
 5        /// FilesStream读取用法
 6        /// </summary>

 7        private void FilesStreamReadFile()
 8ExpandedBlockStart.gifContractedBlock.gif        {
 9            try
10ExpandedSubBlockStart.gifContractedSubBlock.gif            {
11                FileStream fsFile = new FileStream(@"d:\log.cs", FileMode.Open);
12                //文件指针移到文件的135个字节
13                fsFile.Seek(135, SeekOrigin.Begin);
14                //将接下来的字节读到Array中
15                fsFile.Read(byDataValue, 0200);
16            }

17            catch (Exception e)
18ExpandedSubBlockStart.gifContractedSubBlock.gif            {
19                throw e;
20            }

21            //将字节转换成字符
22            Decoder dc = Encoding.UTF8.GetDecoder();
23            //字节数组转换成字符数组,便于显示
24            dc.GetChars(byDataValue, 0, byDataValue.Length, charDataValue, 0);
25
26        }

27
ContractedBlock.gif ExpandedBlockStart.gif Code
 1ExpandedBlockStart.gifContractedBlock.gif /**//// <summary>
 2        /// FilesStream写入用法
 3        /// </summary>

 4        private void FileStreamWriteFile()
 5ExpandedBlockStart.gifContractedBlock.gif        {
 6            FileStream fsFile = new FileStream(@"D:\log.txt", FileMode.Create);
 7            charDataValue="This is test string".ToCharArray();
 8            byDataValue=new byte[charDataValue.Length];
 9
10            //将字符数组转换成字节数组
11            Encoder ec=Encoding.UTF8.GetEncoder();
12            ec.GetBytes(charDataValue,0,charDataValue.Length,byDataValue,0,true);
13
14            //将指针设定起始位置
15            fsFile.Seek(0,SeekOrigin.Begin);
16            //写入文件
17            fsFile.Write(byDataValue,0,byDataValue.Length);
18        }

19

FileStream对象通常会在StreamWriterStreamReader内使用,并使用它们的方法处理文件。

ContractedBlock.gif ExpandedBlockStart.gif Code
 1ExpandedBlockStart.gifContractedBlock.gif /**//// <summary>
 2        /// StreamWriter写入方法
 3        /// </summary>

 4        private void StreamWriterMetod()
 5ExpandedBlockStart.gifContractedBlock.gif        {
 6            try
 7ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 8                FileStream fsFile = new FileStream(@"d:\log.txt",FileMode.OpenOrCreate);
 9                StreamWriter swWriter = new StreamWriter(fsFile,Encoding.Default);  //使用与系统一致的编码方式
10                //写入数据
11                swWriter.WriteLine("你好!");
13                swWriter.Close();
14            }

15            catch (Exception e)
16ExpandedSubBlockStart.gifContractedSubBlock.gif            {
17
18                throw e;
19            }

20        }

21

ContractedBlock.gif ExpandedBlockStart.gif Code
 1ExpandedBlockStart.gifContractedBlock.gif  /**//// <summary>
 2        /// StreamWriter读取方法
 3        /// </summary>

 4        private void StreamReaderMetod()
 5ExpandedBlockStart.gifContractedBlock.gif        {
 6            string sLine = "";
 7            try
 8ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 9                FileStream fsFile = new FileStream(@"d:\log.txt", FileMode.Open);
10                StreamReader srReader = new StreamReader(fsFile,,Encoding.Default);
11                //读取文件(读取大文件时,最好不要用此方法)
12                sLine = srReader.ReadToEnd();
13                txbValue.Text = sLine;
14                srReader.Close();
15            }

16            catch (Exception e)
17ExpandedSubBlockStart.gifContractedSubBlock.gif            {
18                throw e;
19            }
 
20        }

21

ContractedBlock.gif ExpandedBlockStart.gif Code
 1ExpandedBlockStart.gifContractedBlock.gif  /**//// <summary>
 2        /// StreamWriter读取方法2
 3        /// </summary>

 4        private void StreamReaderMetodTwo()
 5ExpandedBlockStart.gifContractedBlock.gif        {
 6            try
 7ExpandedSubBlockStart.gifContractedSubBlock.gif            {
 8                FileStream fsFile = new FileStream(@"d:\log.txt", FileMode.Open);
 9
10ExpandedSubBlockStart.gifContractedSubBlock.gif                /**//*
11                 * 读取数据最简单的方法是Read()。此方法将流的下一个字符作为正整数值返回,
12                 * 如果达到了流的结尾处,则返回-1。
13                 */

14                StreamReader srReader = new StreamReader(fsFile,Encoding.Default);
15                int iChar;
16                iChar = srReader.Read();
17                while (iChar != -1)
18ExpandedSubBlockStart.gifContractedSubBlock.gif                {
19                    txbValue.Text += (Convert.ToChar(iChar));
20                    iChar = srReader.Read();
21                }

22                srReader.Close();
23            }

24            catch (Exception e)
25ExpandedSubBlockStart.gifContractedSubBlock.gif            {
26                throw e;
27            }

28        }

29

转载于:https://www.cnblogs.com/nginx/archive/2009/08/01/1536449.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值