将一个流传递给多个方法可以吗

本文关键字:方法 一个 | 更新日期: 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
}