这个问题的后续问题:
文件路径和文件流的区别?
我没有完全理解链接问题中回答的所有问题。
我使用的Microsoft.SqlServer.Dac.BacPackage
包含一个Load
方法,有2个过载-一个接收字符串路径,一个接收Stream
。
Load方法的文档:
https://learn.microsoft.com/en us/dotnet/api/microsoft.sqlserver.dac.bacpackage.load?view=sql - dacfx - 150
这两者到底有什么区别?假设字符串路径的重载首先将所有文件保存在内存中,而流不是,我是否正确?还有其他区别吗?
不,文件通常不会一次完全加载。
string path
参数通常意味着它将打开文件作为FileStream
并将其传递给函数的另一个版本。除非请求,否则流没有理由将文件完全加载到内存中。
Stream
参数表示您打开文件并传递结果Stream
。您还可以传递任何其他类型的Stream
,例如网络流、压缩或解密流、内存支持流,等等。
简短回答:
事实上,你有两个方法,一个接受文件名,一个接受流只是为了方便。在内部,带有文件名的方法将打开文件作为流并调用另一个方法。
长回答
你可以把流看作一个字节序列。使用流而不是byte[]
或List<byte>
的原因是,如果序列非常非常大,并且您不需要一次访问所有字节,那么在处理它们之前将所有字节放入内存将是一种浪费。
例如,如果你想计算一个文件中所有字节的校验和:你不需要在开始计算校验和之前把所有的数据放在内存中。事实上,任何能够有效地一个接一个地传递字节的方法都足够了。
这就是为什么人们想要将文件作为流来读取的原因。
人们想要流作为数据输入的原因是,他们想给调用者一个机会来指定他们的数据来源:调用者可以提供一个从文件中读取的流,也可以提供一个从互联网、数据库或文本框中读取数据的流,过程不在乎,只要它可以一个接一个地读取字节,或者有时是每个字节块:
using (Stream fileStream = File.Open(fileName)
{
ProcessInputData(fileStream);
}
或:
byte[] bytesToProcess = ...
using (Stream memoryStream = new MemoryStream(bytesToProcess))
{
ProcessInputData(memoryStream);
}
或:
string operatorInput = this.textBox1.Text;
using (Stream memoryStream = new MemoryStream(operatorInput))
{
ProcessInputData(memoryStream);
}
Conclusioin
方法在其接口中使用流来表明它们不需要一次在内存中存储所有数据。一个接一个,或者每个块就足够了。调用者可以自由决定数据来自何处。