我有一个StreamReader
对象,现在我想将此流保存到磁盘(该流可以是.gif
或.jpg
或.pdf
)。
现有代码:
StreamReader sr = new StreamReader(myOtherObject.InputStream);
我也有编码类型,如果将其存储到 SQL Server,我会需要该编码类型,对吗?
正如 Jon Skeet 的回答中 Tilendor 所强调的那样,从. NET 4 开始CopyTo
var fileStream = File.Create("C:\\Path\\To\\File");
myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
myOtherObject.InputStream.CopyTo(fileStream);
fileStream.Close();
或使用using
语法:
using (var fileStream = File.Create("C:\\Path\\To\\File"))
{
myOtherObject.InputStream.Seek(0, SeekOrigin.Begin);
myOtherObject.InputStream.CopyTo(fileStream);
}
您不得将StreamReader
用于二进制文件(例如 gif 或 jpgs)。 StreamReader
用于文本数据。如果将其用于任意二进制数据,几乎可以肯定会丢失数据。 (如果您使用 Encoding.GetEncoding(28591),您可能会没事,但是有什么意义呢?)
为什么根本需要使用StreamReader
?为什么不只将二进制数据保留为二进制数据,然后将其作为二进制数据写回磁盘(或 SQL)?
编辑:由于这似乎是人们想要的东西看看... 如果你只是想一个流复制到另一个(如一个文件)使用是这样的:
/// <summary>
/// Copies the contents of input to output. Doesn't close either stream.
/// </summary>
public static void CopyStream(Stream input, Stream output)
{
byte[] buffer = new byte[8 * 1024];
int len;
while ( (len = input.Read(buffer, 0, buffer.Length)) > 0)
{
output.Write(buffer, 0, len);
}
}
要使用它将流转储到文件中,例如:
using (Stream file = File.Create(filename))
{
CopyStream(input, file);
}
请注意, Stream.CopyTo
是. NET 4 中引入的,其目的基本相同。
public void CopyStream(Stream stream, string destPath)
{
using (var fileStream = new FileStream(destPath, FileMode.Create, FileAccess.Write))
{
stream.CopyTo(fileStream);
}
}