将一个流传递给多个方法可以吗
本文关键字:方法 一个 | 更新日期: 2023-09-27 18:26:16
我有一个定义为:的接口
public interface IClientFileImporter
{
bool CanImport(Stream stream);
int Import(Stream stream);
}
其想法是获取任何文件流,并通过该接口的一系列实现来运行它,以确定应该由哪一个来处理该文件。一些实现可能会查找某个标题行,而另一些实现可能查找某个字节序列等
我的问题是,只要我从不关闭它,就可以像这样传递溪流吗?如果需要,每个方法都必须负责将流重置到位置0,但是否存在任何其他潜在问题(除了线程安全)?这个代码真的很臭,IMO,但我不确定有更好的方法。
要防止底层流被修改,请创建一个从stream派生的包装流,并仅向包装流转发安全调用。此外,不要假设Import/CanImport方法重置流位置。在将流传递给Import/CanImport之前,这些方法的调用方应将流重置为有效状态。
如果每个函数都按原样返回流,我认为它没有问题。
这应该不是问题。
尽管我可能会稍微重组一下:
public interface IClientFileImporter
{
int Import(Stream stream);
}
如果不能的话,我会让Import方法返回-1。这可能会让你的其他代码更简单一些。
将同一个流传递给多个方法是完全可以的。
注意不可搜索的流-有些流无法重置位置。Andre Loker的评论给出了包装Stream的好建议,这样CanImport方法就不会扰乱实际的流。
您还可以考虑显式地向CanImport方法提供流的一些"头"部分,这也会降低它们的灵活性。
如果你担心传递流,因为你最终可能会运行不可信的外部代码,那么你能做的最好的事情就是制作一个新的只读流并传递它,这样在你确定要允许它们之前,任何外部代码都不能更改文件的内容。
public class ReadOnlyStream : Stream
{
private Stream _ownerStream;
public ReadOnlyStream(Stream baseStream)
{
_ownerStream = baseStream;
}
public override bool CanWrite => false;
public override int Write(byte[] bits, int offset, int count)
{
throw new InvalidOperationException();
}
// Other code omitted
}