我尝试使用StreamReader
类ReadToEnd()
方法读取JPG文件,该方法返回一个字符串。
出于某种原因,当我将此字符串写入文件时,它不会打开。
将数据读入字符串时是否会丢失某些内容?
答案 0 :(得分:25)
字符串用于 text 数据。它们不是二进制数据 - 如果您以这种方式使用它们将丢失数据(如果您幸运的话,您可以使用不会丢失数据的编码,但有一些细微的问题,仍然是一个非常糟糕的主意。)
如果您实际处理文件,最简单的方法是阅读File.ReadAllBytes。如果您必须处理任意流,请查看"Creating a byte array from a stream"。
答案 1 :(得分:5)
正如所有真正的程序员都知道的那样,唯一有用的数据结构是Array。字符串,列表,结构,集合 - 这些都是数组的特殊情况,可以这样轻松地处理,而不会弄乱您的编程语言中的各种复杂情况。花哨的数据类型最糟糕的是你必须声明它们,而且我们都知道,Real Programming Languages根据(六个字符)变量名的第一个字母进行隐式类型化。
此外,确定的Real Programmer可以用任何语言编写Fortran程序。
无论是谁修改了这个,都要么没有幽默感,要么没有民间传说知识。以上内容摘自1983年由泰克的Ed Post撰写的一篇非常着名的致Datamation编辑的信。这封信的标题是 Real Programmers Don't Use Pascal 。
答案 2 :(得分:5)
永远记住,文本数据 二进制数据但二进制数据 > 文本数据。
答案 3 :(得分:4)
String用于保存unicode字符;不是二元的。对于二进制文件,请使用byte[]
或Stream
。或Image
等更专业的图像处理。
尽管有名称,但StreamReader
实际上是一个专门的TextReader
- 即TextReader
从Stream
读取。图像不是文本,因此这不是正确的选项。
答案 4 :(得分:1)
不幸的是,System.IO命名空间中的类名存在严重问题。 StreamReader旨在读取\写入\到文本文件。你应该使用FileStream作为@goodwill建议的二进制文件
答案 5 :(得分:0)
你不能这样做....改为使用FileStream。
你不能使用字符串来读取二进制文件,据我所知,有些字符不会成功。
答案 6 :(得分:0)
字符串用于表示文本。他们善于表达文本。事实上,非常好,因为它们支持Unicode并保护您免受各种典型的字符串处理错误。
他们不擅长表示二进制数据,因为这不是他们的设计目标。如你所述,字节数组要好得多。
这不是一个比另一个好的问题,它只是适合目的和理解何时选择其中一个。 Text = string,binary = byte array或stream。
答案 7 :(得分:0)
我注意到没有人回答实际问题。
JPEG文件包含图片而不是文字。该bicture具有二进制表示作为字节序列。其中一些字节的值0x00也表示为NUL。在字符串中,包含此值的字节被解释为标记字符串的结尾。超过字符串结尾的数据被视为未使用的缓冲区,并被忽略。
当您将字符串写入文件时,不包括第一个NUL之外的任何内容。因此,该文件不是一个完整的二进制图像,并被软件的验证逻辑拒绝,试图将其解释为JPEG。
因此,当您加载包含非文本数据的字符串时,数据通常 会丢失。这里的问题是您已经有效地进行了无效的类型转换,但是编译器和运行时都没有阻止您,结果是数据损坏。
好几件事。正如其他人所说,字符串旨在包含文本。在.NET中,字符串支持除普通旧ASCII之外的编码。对文本操作也有广泛的支持。在帮助中查找格式说明符,以获得字符串操作的壮观示例。
这是遗产。 NUL对其他任何东西都不是很好,这样做简化了在托管代码中编组和编写字符串的操作。出于同样的原因,BSTR做同样的事情。
答案 8 :(得分:0)
字符串默认使用Unicode编码,unicode使用NUL字符作为控制字符,双NUL用于终止,单个NUL用于表示之前的ASCII字符。
由于这个原因,二进制数据无法加载到字符串中。