StreamWriter的Ne​​wLine和StringBuilder的换行符之间的区别?

时间:2016-09-06 12:28:38

标签: c# stringbuilder streamwriter

我正在将图片文件转换为base64字符串,以便将它们存储在.txt文件中,然后检索它们并将它们重新转换为图像。在这样做的过程中,我代表我的StringBuilder发现了一个有趣的错误行为:

// **Example A, uses StringBuilder**
String[] filePaths = Directory.GetFiles(folderPath, "*.*");
StringBuilder sb = new StringBuilder();

ImageConverter converter = new ImageConverter();
StreamWriter sw = File.CreateText(filepathBase64);

foreach (String item in filePaths)
{
    try
    {
        Bitmap picture = new Bitmap(item);
        Byte[] byteArr = (Byte[])converter.ConvertTo(picture, typeof(Byte[]));
        String base64 = Convert.ToBase64String(byteArr);
        sb.AppendLine(base64);
    }
    catch { }
}

StreamWriter sw = File.CreateText(filepathBase64);
sw.Write(sb);
sw.Flush();
sw.Close();

这会创建一个.txt文件,其中包含base64中的大量行和一个与我的Stringbuilder一起使用的.AppendLine的最后一行空行。当我稍后读取这些base64字符串并将它们转换回图像对象时,我必须小心这最后一行以避免异常,所以我检查它是这样的:

//**Example A.1, checking for empty string
listBoxbilder.Items.Clear();
String[] myArr = File.ReadAllLines(filepathBase64);//last item will be empty string

foreach (String item in myArr)
{
    if (item != String.Empty) //This is my validation
    {
        byte[] decodedFromBase64 = Convert.FromBase64String(item);
        BitmapImage myImage = new BitmapImage();

        myImage.BeginInit();
        myImage.StreamSource = new MemoryStream(decodedFromBase64);
        myImage.EndInit();

        ListBoxItem bild = new ListBoxItem();
        bild.Content = new System.Windows.Controls.Image() { Source = myImage };
        listBoxbilder.Items.Add(bild);
    }
}

现在,如果我使用稍微不同的版本执行相同的任务,使用我的StreamWriter直接写入我的文件,而不是打扰使用StringBuilder,则生成的.txt看起来与肉眼,但代码行为不同。这是创建文件的位:

//**Example B, just uses StreamWriter**
String[] filePaths = Directory.GetFiles(folderPath, "*.*");
ImageConverter converter = new ImageConverter();
StreamWriter sw = File.CreateText(filepathBase64);

foreach (String item in filePaths)
{
    try
    {
        Bitmap picture = new Bitmap(item);
        Byte[] byteArr = (Byte[])converter.ConvertTo(picture, typeof(Byte[]));
        String base64 = Convert.ToBase64String(byteArr);
        sw.WriteLine(base64);
    }
    catch{ }
}    

sw.Flush();
sw.Close();

我的文件末尾仍然有一个空行,但是当我使用File.ReadAllLines将该文件读入数组时,我没有得到一个数组,其中最后一个位置是一个空字符串。怎么会?我现在可以使用代码而不检查空白,如下所示:

//**Example B.1, no checks
listBoxbilder.Items.Clear();
String[] myArr = File.ReadAllLines(filepathBase64);
foreach (String item in myArr)
{
    byte[] decodedFromBase64 = Convert.FromBase64String(item);
    BitmapImage myImage = new BitmapImage();
    myImage.BeginInit();
    myImage.StreamSource = new MemoryStream(decodedFromBase64);
    myImage.EndInit();
    ListBoxItem bild = new ListBoxItem();
    bild.Content = new System.Windows.Controls.Image() { Source = myImage };
    listBoxbilder.Items.Add(bild);
}

我没有得到异常,因为File.ReadAllLines产生的数组没有包含空字符串的位置,但.txt源看起来相同,最后有一个空行。造成这种不同行为的原因是什么?

1 个答案:

答案 0 :(得分:0)

效果消失了。我不知道黑魔法,宇宙辐射或简单的疏忽,我的部分之前造成了这种不稳定的行为,它不会再发生了。生成的文件具有相同的字节数和相同的校验和,当我在程序中使用它们时,它们的行为相同。